2015-09-30 17 views
9

đối với bài này Với:loại PHPStorm gợi ý lớp con của baseclass

In PHPStorm, how can I make type hinting work when I have a superclass method that returns a different type from each subclass,

này là về một trường hợp cạnh trong PHPStorm kiểu gián tiếp. hãy cố gắng làm theo - Tôi sẽ làm hết sức mình để được càng rõ ràng càng tốt:

Vì vậy, tôi đã có lớp cơ sở trừu tượng này:

abstract class myBaseController { 
    protected $_model; 
    ... 
} 

mà lớp khác kế thừa từ:

class myController extends myBaseController { 
    $hello = 'hello'; 
    ... 
} 

và đó là tiếp tục mở rộng bởi một lớp thứ ba:

class myNewController extends myController { 
    public $myvar; 
    $this->_model = new myModel(); 
    ... 

    public function myFunc(){ 
     // !!form is underlined as: "Method 'form' not found in class"!! 
     $form = $this->_model->form($new_variable); 
    } 

Dưới đây là một mẫu của lớp MyModel:

class myModel extends BaseModel { 
    $world = 'world'; 
    public function form($my_variable) { 
     do_something(); 
    } 

câu hỏi thật của tôi là làm thế nào để đúng cách "PHPDoc" kịch bản này:

Một lớp con myNewController đang sử dụng một thừa hưởng biến _model gán một thể hiện của một lớp myModel có chức năng độc đáo form. PHPStorm đúng cách nên tìm hiểu về form trong số myNewController như thế nào?

Giải pháp của tôi cho đến nay liên quan đến tài liệu myBaseController như thế này:

abstract class myBaseController { 
    /** 
    * @var object 
    */ 
    protected $_model; 
    ... 
} 

Tuy nhiên tôi nghĩ @var object là quá rộng (PHPStorm sẽ không tìm thấy lời tuyên bố của nó) và tôi đoán là cần có một tốt hơn (và cụ thể hơn) cách để làm điều này.

Có lẽ chúng ta thay vì có thể làm:

/** 
* @var BaseModel 
*/ 

nếu PHPStorm đã có một cách khác để nhìn vào lớp con cho phương pháp này.

Bất kỳ ý tưởng nào? Cảm ơn tất cả các bạn trước.

+1

Hãy thử: '/ ** * @var $ variableName ClassName * /' – vaso123

+0

@lolka_bolka Nếu tôi làm điều đó nó sẽ làm việc nhưng sau đó '$ _model' sẽ khóa xuống' ClassName'. '$ _model' nên được tự do gán bất kỳ lớp mô hình nào của tôi mà mỗi lớp có thể có các phương thức duy nhất. Vì vậy, tôi nên -ideally- tài liệu '$ _model' từ bên trong lớp con' myNewController'. – kstratis

+0

Bạn có thể bình luận về downvote không? – kstratis

Trả lời

8

Bạn có thể chỉ định các loại tài sản trong lớp con của bạn mà không giới thiệu mã mới, bằng cách sử dụng @property chú thích:

/** 
* @property myModel $_model 
*/ 
class myNewController extends myController 
+0

Cảm ơn! Điều đó đã làm công việc! – kstratis

+0

Rất vui được biết. Không biết chú thích '@ property' này. – charlesrockbass

-1

Để ghi lại phương thức trả lại của lớp học, hãy sử dụng return $this; return static cũng hoạt động

1

Mặc dù có lẽ không phải là thực hành tốt nhất, điều này chắc chắn sẽ làm việc cho bạn.

Bạn có thể "ghi đè" thành viên _model trong phân lớp và tài liệu thành lớp con của BaseModel.

// superclass 
abstract class myBaseController { 
    /** 
    * @var BaseModel 
    */ 
    protected $_model; 
    ... 
} 

// subclass 
class myNewController extends myBaseController { 
    /** 
    * @var MyDerivedModel 
    */ 
    protected $_model; 
    ... 
} 
+1

Nó hoạt động và tôi đã chấp nhận trả lời nếu nó không giới thiệu bất kỳ mã/tái cơ cấu mới nào. Tốt để biết mặc dù. – kstratis

+0

Không sao. Đó là suy nghĩ tốt nhất của tôi cho đến nay, nhưng câu trả lời của @ fschmengler thực sự tốt hơn nhiều. Sống và học hỏi! ;) – charlesrockbass

Các vấn đề liên quan