Gợi ý kiểu PHPDoc cho mảng các đối tượng?


417

Vì vậy, trong PHPDoc, người ta có thể chỉ định @varphía trên khai báo biến thành viên để gợi ý về kiểu của nó. Sau đó, một IDE, cho ex. PHPEd, sẽ biết loại đối tượng mà nó hoạt động với và sẽ có thể cung cấp thông tin chi tiết về mã cho biến đó.

<?php
  class Test
  {
    /** @var SomeObj */
    private $someObjInstance;
  }
?>

Điều này hoạt động rất tốt cho đến khi tôi cần làm tương tự với một mảng các đối tượng để có thể có được một gợi ý thích hợp khi tôi lặp lại qua các đối tượng đó sau này.

Vì vậy, có cách nào để khai báo thẻ PHPDoc để xác định rằng biến thành viên là một mảng của SomeObjs không? @varmảng là không đủ, và @var array(SomeObj)dường như không hợp lệ, ví dụ.


2
Có một số tài liệu tham khảo trong blog Netbeans 6.8 dev này rằng IDE hiện đủ thông minh để suy luận loại thành viên mảng: blog.sun.com/netbeansphp/entry/php_temsheet_improved
John Carter

3
@therefromhere: liên kết của bạn bị hỏng. Tôi nghĩ rằng URL mới là: blogs.oracle.com/netbeansphp/entry/php_templates_improved
DanielaWaranie

Đối với những người như tôi, đi ngang qua và tìm kiếm một câu trả lời: nếu bạn sử dụng PHPStorm, hãy xem câu trả lời được bình chọn nhiều nhất: nó có một gợi ý cụ thể! stackoverflow.com/a/1763425/1356098 (điều này không có nghĩa nó phải là câu trả lời cho OP, vì anh ấy đang yêu cầu PHPEd, ví dụ)
Erenor Paz

Câu trả lời:


337

Sử dụng:

/* @var $objs Test[] */
foreach ($objs as $obj) {
    // Typehinting will occur after typing $obj->
}

khi gõ các biến nội tuyến và

class A {
    /** @var Test[] */
    private $items;
}

cho các thuộc tính lớp.

Câu trả lời trước từ '09 khi PHPDoc (và các IDE như Zend Studio và Netbeans) không có tùy chọn đó:

Điều tốt nhất bạn có thể làm là nói,

foreach ($Objs as $Obj)
{
    /* @var $Obj Test */
    // You should be able to get hinting after the preceding line if you type $Obj->
}

Tôi làm điều đó rất nhiều trong Zend Studio. Không biết về các biên tập viên khác, nhưng nó nên hoạt động.


3
Điều này có ý nghĩa nhưng nó không hoạt động cho PHPEd 5.2. Điều duy nhất tôi có thể làm được với công việc đó là foreach ($ Objs as / ** @var Test * / $ Obj), xấu kinh khủng. :(
Artem Russakovskii

14
Lưu ý trong Netbeans 7, dường như rất quan trọng khi bạn chỉ có một dấu sao - /** @var $Obj Test */không hoạt động.
contrebis

3
@contrebis: "@var" là thẻ docblock hợp lệ. Vì vậy, ngay cả khi IDE của bạn không hỗ trợ nó trong docblock "/ ** ... /" và chỉ hỗ trợ "@var" trong "/ ... * /" - vui lòng không thay đổi docblock chính xác của bạn. Gửi một vấn đề đến trình theo dõi lỗi của IDE để làm cho IDE của bạn tuân thủ các tiêu chuẩn. Hãy tưởng tượng nhóm phát triển của bạn / nhà phát triển bên ngoài / cộng đồng sử dụng các IDE khác nhau. Giữ nó như nó là và được chuẩn bị cho tương lai.
DanielaWaranie

181
Hãy chắc chắn rằng bạn nhìn bên dưới! Tôi gần như không cuộn xuống - sẽ là một LỚN LỚN !!! Nhiều IDE SILL hỗ trợ cú pháp tốt hơn! (gợi ý: @var Object[] $objectsnói rằng "$ object" là một mảng các thể hiện của Object.)
Thom Porter

10
/** @var TYPE $variable_name */là cú pháp đúng; không đảo ngược thứ tự của loại và tên biến (như được đề xuất trước đó trong các bình luận) vì nó sẽ không hoạt động trong mọi trường hợp.
srcspider

893

Trong IDE PhpStorm từ JetBrains, bạn có thể sử dụng /** @var SomeObj[] */, ví dụ:

/**
 * @return SomeObj[]
 */
function getSomeObjects() {...}

Các tài liệu PHPDoc khuyến cáo phương pháp này:

được chỉ định chứa một loại duy nhất, định nghĩa Loại thông báo cho người đọc về loại của từng thành phần mảng. Sau đó, chỉ có một Loại được mong đợi là phần tử cho một mảng nhất định.

Thí dụ: @return int[]


10
Tôi vừa tải xuống và đã sử dụng phpstorm trong tuần qua. Đánh bại quái vật của Aptana (rất tốt để được tự do). Điều này thật đúng với gì mà tôi đã tìm kiếm. Trên thực tế, nó giống như cách bạn làm với JavaScript, tôi nên đoán
Juan Mendes

3
Cảm ơn người đàn ông! Điều này thật đúng với gì mà tôi đã tìm kiếm. PHPStorm là tuyệt vời.
Erik Schierboom

5
Điều này không hoạt động trong Netbeans, tôi thất vọng. Jetbrains làm cho một số công cụ rất tốt đẹp.
Keyo

10
@fishbone @Keyo điều này hoạt động trong Netbeans ngay bây giờ (trong bản 7.1 tối thiểu, có thể sớm hơn), mặc dù có vẻ như bạn cần sử dụng một biến tạm thời (một lỗi?). Gợi ý cho foreach(getSomeObjects() as $obj)việc không hoạt động, nhưng nó làm cho$objs = getSomeObjects(); foreach($objs as $obj)
John Carter

2
Sẽ là tốt đẹp để có @var Obj[string]mảng kết hợp.
donquixote

59

Gợi ý của Netbeans:

Bạn nhận được mã hoàn thành trên $users[0]->$this->cho một mảng các lớp Người dùng.

/**
 * @var User[]
 */
var $users = array();

Bạn cũng có thể thấy loại mảng trong danh sách các thành viên của lớp khi bạn hoàn thành $this->...


4
cũng hoạt động trong PhpStorm 9 EAP: / ** * @var UserInterface [] * / var $ users = []; // Mảng Objs thực hiện Giao diện
Ronan

Tôi đã dùng thử trong NetBeans IDE 8.0.2, nhưng tôi nhận được đề xuất từ ​​lớp tôi hiện đang tham gia.
Wojciech Jasiński

cũng hoạt động trong Eclipse 4.6.3 (idk hỗ trợ phiên bản nào đã được giới thiệu, nhưng nó hoạt động và những gì tôi đang sử dụng bây giờ)
hanshenrik

Điều này không may không hoạt động sau khi sử dụng array_pop()hoặc các chức năng tương tự vì một số lý do. Có vẻ như Netbeans không nhận ra các hàm đó trả về một phần tử duy nhất của mảng đầu vào.
William W

29

Để chỉ định một biến là một mảng các đối tượng:

$needles = getAllNeedles();
/* @var $needles Needle[] */
$needles[1]->...                        //codehinting works

Điều này hoạt động trong Netbeans 7.2 (Tôi đang sử dụng nó)

Hoạt động với:

$needles = getAllNeedles();
/* @var $needles Needle[] */
foreach ($needles as $needle) {
    $needle->...                        //codehinting works
}

Do đó sử dụng khai báo bên trong foreachlà không cần thiết.


2
Giải pháp này sạch hơn câu trả lời được chấp nhận theo quan điểm của tôi, bởi vì bạn có thể sử dụng foreach nhiều lần và gợi ý loại sẽ tiếp tục hoạt động với /* @var $Obj Test */chú thích mới mỗi lần.
Henry

Tôi thấy có hai vấn đề ở đây: 1. phpdoc thích hợp bắt đầu bằng /** 2. Định dạng đúng là@var <data-type> <variable-name>
Christian

@Christian 1: câu hỏi chính không phải là phpdoc mà là gõ 2: định dạng đúng không giống như bạn nói, thậm chí theo các câu trả lời khác. Trên thực tế, tôi thấy có 2 vấn đề với bình luận của bạn và tôi tự hỏi tại sao bạn không đưa ra câu trả lời của riêng mình với định dạng chính xác
Highmastdon

1. Typehinting hoạt động với phpdoc ... nếu bạn không sử dụng docblock, IDE của bạn sẽ không thử đoán những gì bạn đã viết trong một số nhận xét ngẫu nhiên. 2. Định dạng đúng, như một số câu trả lời khác cũng đã nói là những gì tôi đã chỉ định ở trên; kiểu dữ liệu trước tên biến . 3. Tôi không viết câu trả lời khác vì câu hỏi không cần câu trả lời khác và tôi không chỉ chỉnh sửa mã của mình.
Christian

24

PSR-5: PHPDoc đề xuất một dạng ký hiệu kiểu Generics.

Cú pháp

Type[]
Type<Type>
Type<Type[, Type]...>
Type<Type[|Type]...>

Các giá trị trong Bộ sưu tập thậm chí có thể là một mảng khác và thậm chí là một Bộ sưu tập khác.

Type<Type<Type>>
Type<Type<Type[, Type]...>>
Type<Type<Type[|Type]...>>

Ví dụ

<?php

$x = [new Name()];
/* @var $x Name[] */

$y = new Collection([new Name()]);
/* @var $y Collection<Name> */

$a = new Collection(); 
$a[] = new Model_User(); 
$a->resetChanges(); 
$a[0]->name = "George"; 
$a->echoChanges();
/* @var $a Collection<Model_User> */

Lưu ý: Nếu bạn đang mong đợi IDE thực hiện hỗ trợ mã thì đó là một câu hỏi khác về việc IDE có hỗ trợ ký hiệu bộ sưu tập kiểu chung PHPDoc không.

Từ câu trả lời của tôi cho câu hỏi này .



11

Tôi thích đọc và viết mã sạch - như được nêu trong "Mã sạch" của Robert C. Martin. Khi theo dõi uy tín của anh ấy, bạn không nên yêu cầu nhà phát triển (với tư cách là người dùng API của bạn) biết cấu trúc (bên trong) của mảng.

Người dùng API có thể hỏi: Đó có phải là một mảng chỉ có một chiều không? Là các đối tượng trải rộng trên tất cả các cấp của một mảng đa chiều? Tôi cần bao nhiêu vòng lặp lồng nhau (foreach, v.v.) để truy cập tất cả các đối tượng? Loại đối tượng nào được "lưu trữ" trong mảng đó?

Như bạn đã phác thảo, bạn muốn sử dụng mảng đó (chứa các đối tượng) làm mảng một chiều.

Theo phác thảo của Nishi, bạn có thể sử dụng:

/**
 * @return SomeObj[]
 */

cho điều đó

Nhưng một lần nữa: lưu ý - đây không phải là ký hiệu docblock tiêu chuẩn. Ký hiệu này được giới thiệu bởi một số nhà sản xuất IDE.

Được rồi, với tư cách là một nhà phát triển, bạn biết rằng "[]" được gắn với một mảng trong PHP. Nhưng "cái gì đó []" nghĩa là gì trong ngữ cảnh PHP bình thường? "[]" Có nghĩa là: tạo thành phần mới trong "cái gì đó". Yếu tố mới có thể là tất cả. Nhưng những gì bạn muốn thể hiện là: mảng các đối tượng có cùng loại và loại chính xác. Như bạn có thể thấy, nhà sản xuất IDE giới thiệu một bối cảnh mới. Một bối cảnh mới bạn phải học. Một bối cảnh mới mà các nhà phát triển PHP khác phải học (để hiểu các nguyên tắc của bạn). Phong cách xấu (!).

Bởi vì mảng của bạn có một chiều, bạn có thể muốn gọi "mảng đối tượng" đó là "danh sách". Xin lưu ý rằng "danh sách" có ý nghĩa rất đặc biệt trong các ngôn ngữ lập trình khác. Nó sẽ tốt hơn nếu gọi nó là "bộ sưu tập" chẳng hạn.

Hãy nhớ rằng: bạn sử dụng ngôn ngữ lập trình cho phép bạn tất cả các tùy chọn OOP. Sử dụng một lớp thay vì một mảng và làm cho lớp của bạn đi qua như một mảng. Ví dụ:

class orderCollection implements ArrayIterator

Hoặc nếu bạn muốn lưu trữ các đối tượng bên trong ở các mức khác nhau trong cấu trúc đối tượng / mảng đa chiều:

class orderCollection implements RecursiveArrayIterator

Giải pháp này thay thế mảng của bạn bằng một đối tượng thuộc loại "orderCollection", nhưng không cho phép hoàn thành mã trong IDE của bạn cho đến nay. Được chứ. Bước tiếp theo:

Thực hiện các phương thức được giới thiệu bởi giao diện với docblocks - cụ thể:

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()

Đừng quên sử dụng gợi ý loại cho:

orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)

Giải pháp này ngừng giới thiệu rất nhiều:

/** @var $key ... */
/** @var $value ... */

trên tất cả các tệp mã của bạn (ví dụ trong vòng lặp), như Zahymaka đã xác nhận với câu trả lời của cô ấy / anh ấy. Người dùng API của bạn không bị buộc phải giới thiệu các tài liệu đó, để hoàn thành mã. Để có @return trên một nơi duy nhất làm giảm sự dư thừa (@var) càng nhiều càng tốt. Rắc "docBlocks với @var" sẽ làm cho mã của bạn dễ đọc nhất.

Cuối cùng bạn đã hoàn thành. Có vẻ khó để đạt được? Hình như lấy búa tạ để bẻ đai ốc? Không thực sự, vì bạn đã quen thuộc với các giao diện đó và với mã sạch. Hãy nhớ rằng: mã nguồn của bạn được viết một lần / đọc nhiều.

Nếu việc hoàn thành mã IDE của bạn không hoạt động với phương pháp này, hãy chuyển sang một cách tốt hơn (ví dụ IntelliJ IDEA, PhpStorm, Netbeans) hoặc gửi yêu cầu tính năng về trình theo dõi vấn đề của nhà sản xuất IDE của bạn.

Cảm ơn Christian Weiss (từ Đức) vì đã trở thành huấn luyện viên của tôi và đã dạy tôi một thứ tuyệt vời như vậy. PS: Gặp tôi và anh ấy trên XING.


cách này có vẻ như là "đúng", nhưng tôi không thể làm cho nó hoạt động với Netbeans. Lấy
fehrlich

2
Có thể vào năm 2012, đây không phải là một tiêu chuẩn, nhưng bây giờ nó được mô tả là chức năng tích hợp của phpDoc.
Wirone

@Wirone có vẻ như phpDocumentor thêm điều này vào hướng dẫn sử dụng của nó như là một phản ứng đối với các nhà sản xuất ide. Ngay cả khi bạn có một công cụ hỗ trợ rộng rãi, điều đó không có nghĩa là đó là cách thực hành tốt nhất. Nó bắt đầu khiến someObj [] lan truyền trong ngày càng nhiều dự án, tương tự như request, request_once, bao gồm và include_once đã làm cách đây nhiều năm. Với tính năng tự động tải, sự xuất hiện của các câu lệnh giảm xuống dưới 5%. Hy vọng rằng someObj [] giảm xuống cùng một tỷ lệ trong vòng 2 năm tới theo hướng tiếp cận ở trên.
DanielaWaranie

1
Tôi không hiểu tại sao? Đây là ký hiệu rất đơn giản và rõ ràng. Khi bạn thấy SomeObj[]bạn biết đó là một mảng các SomeObjtrường hợp hai chiều và sau đó bạn biết phải làm gì với nó. Tôi không nghĩ rằng nó không tuân theo tín dụng "mã sạch".
Wirone

Đây nên là câu trả lời. Mặc dù vậy, không phải tất cả các phương pháp hỗ trợ IDE với và @return <className>cho current()tất cả mọi người. PhpStorm hỗ trợ nên nó giúp tôi rất nhiều. Cảm ơn bạn đời!
Pavel

5

Sử dụng array[type]trong Zend Studio.

Trong Zend Studio, array[MyClass]hoặc array[int]hoặc thậm chí array[array[MyClass]]lớn làm việc.


5

Trong NetBeans 7.0 (cũng có thể thấp hơn), bạn có thể khai báo kiểu trả về "mảng với các đối tượng Văn bản" giống như @return Textvà gợi ý mã sẽ hoạt động:

Chỉnh sửa: cập nhật ví dụ với đề xuất @Bob Fanger

/**
 * get all Tests
 *
 * @return Test|Array $tests
 */
public function getAllTexts(){
    return array(new Test(), new Test());
}

và chỉ sử dụng nó:

$tests =  $controller->getAllTests();
//$tests->         //codehinting works!
//$tests[0]->      //codehinting works!

foreach($tests as $text){
    //$test->      //codehinting works!
}

Nó không hoàn hảo nhưng tốt hơn là cứ để nó chỉ là "hỗn hợp", điều này không mang lại giá trị gì.

Nhược điểm là bạn được phép bước vào mảng dưới dạng đối tượng văn bản sẽ đưa ra lỗi.


1
Tôi sử dụng "@return mảng | Kiểm tra một số mô tả." mà kích hoạt hành vi tương tự nhưng giải thích nhiều hơn một chút.
Bob Fanger

1
Đây là một cách giải quyết , không phải là một giải pháp. Điều bạn đang nói ở đây là "hàm này có thể trả về một đối tượng thuộc loại 'Kiểm tra', HOẶC một mảng". Tuy nhiên về mặt kỹ thuật nó không cho bạn biết bất cứ điều gì về những gì có thể có trong mảng.
Byson

5

Như DanielaWaranie đã đề cập trong câu trả lời của mình - có một cách để chỉ định loại $ item khi bạn lặp lại các mục $ trong $ CollectionObject: Thêm @return MyEntitiesClassNamevào current()và phần còn lại của IteratorArrayAccess-methods trả về giá trị.

Bùng nổ! Không cần /** @var SomeObj[] $collectionObj */kết thúc foreachvà hoạt động đúng với đối tượng bộ sưu tập, không cần trả về bộ sưu tập với phương thức cụ thể được mô tả là @return SomeObj[].

Tôi nghi ngờ không phải tất cả IDE đều hỗ trợ nó nhưng nó hoạt động hoàn toàn tốt trong PhpStorm, điều này khiến tôi hạnh phúc hơn.

Thí dụ:

class MyCollection implements Countable, Iterator, ArrayAccess {

    /**
     * @return User
     */
    public function current() {
        return $this->items[$this->cursor];
    }

    //... implement rest of the required `interface` methods and your custom
}

Những gì hữu ích tôi sẽ thêm đăng câu trả lời này

Trong trường hợp của tôi current() và phần còn lại của interface-method được triển khai trong Abstractlớp -collection và tôi không biết loại thực thể nào cuối cùng sẽ được lưu trữ trong bộ sưu tập.

Vì vậy, đây là mẹo: Không chỉ định kiểu trả về trong lớp trừu tượng, thay vào đó hãy sử dụng mô hình PhpDoc @method trong mô tả của lớp bộ sưu tập cụ thể.

Thí dụ:

class User {

    function printLogin() {
        echo $this->login;
    }

}

abstract class MyCollection implements Countable, Iterator, ArrayAccess {

    protected $items = [];

    public function current() {
        return $this->items[$this->cursor];
    }

    //... implement rest of the required `interface` methods and your custom
    //... abstract methods which will be shared among child-classes
}

/**
 * @method User current()
 * ...rest of methods (for ArrayAccess) if needed
 */
class UserCollection extends MyCollection {

    function add(User $user) {
        $this->items[] = $user;
    }

    // User collection specific methods...

}

Bây giờ, việc sử dụng các lớp:

$collection = new UserCollection();
$collection->add(new User(1));
$collection->add(new User(2));
$collection->add(new User(3));

foreach ($collection as $user) {
    // IDE should `recognize` method `printLogin()` here!
    $user->printLogin();
}

Một lần nữa: Tôi nghi ngờ không phải tất cả IDE đều hỗ trợ nó, nhưng PhpStorm thì có. Hãy thử của bạn, gửi bình luận kết quả!


Voucher đã đẩy nó đi rất xa, nhưng thật không may, tôi vẫn có thể tự mình giải quyết một bộ sưu tập để thay thế các loại chung chung java tốt .... yuck '
Sebas

Cảm ơn bạn. Làm thế nào bạn có thể gõ một phương thức tĩnh?
Yevgeniy Afanasyev

3

Tôi biết tôi đến bữa tiệc muộn, nhưng tôi đã làm việc về vấn đề này gần đây. Tôi hy vọng ai đó thấy điều này bởi vì câu trả lời được chấp nhận, mặc dù đúng, không phải là cách tốt nhất bạn có thể làm điều này. Ít nhất là trong PHPStorm, tôi chưa thử NetBeans.

Cách tốt nhất liên quan đến việc mở rộng lớp ArrayIterator thay vì sử dụng các kiểu mảng gốc. Điều này cho phép bạn nhập gợi ý ở cấp độ chứ không phải ở cấp độ cá thể, nghĩa là bạn chỉ phải PHPDoc một lần, không phải trong toàn bộ mã của bạn (điều này không chỉ lộn xộn và vi phạm DRY, mà còn có thể gặp vấn đề khi nói đến tái cấu trúc - PHPStorm có thói quen thiếu PHPDoc khi tái cấu trúc)

Xem mã dưới đây:

class MyObj
{
    private $val;
    public function __construct($val) { $this->val = $val; }
    public function getter() { return $this->val; }
}

/**
 * @method MyObj current()
 */
class MyObjCollection extends ArrayIterator
{
    public function __construct(Array $array = [])
    {
        foreach($array as $object)
        {
            if(!is_a($object, MyObj::class))
            {
                throw new Exception('Invalid object passed to ' . __METHOD__ . ', expected type ' . MyObj::class);
            }
        }
        parent::__construct($array);
    }

    public function echoContents()
    {
        foreach($this as $key => $myObj)
        {
            echo $key . ': ' . $myObj->getter() . '<br>';
        }
    }
}

$myObjCollection = new MyObjCollection([
    new MyObj(1),
    new MyObj('foo'),
    new MyObj('blah'),
    new MyObj(23),
    new MyObj(array())
]);

$myObjCollection->echoContents();

Chìa khóa ở đây là PHPDoc ghi @method MyObj current()đè kiểu trả về được kế thừa từ ArrayIterator (đó là mixed). Việc bao gồm PHPDoc này có nghĩa là khi chúng ta lặp lại các thuộc tính của lớp bằng cách sử dụng foreach($this as $myObj), thì chúng ta sẽ hoàn thành mã khi tham chiếu đến biến$myObj->...

Đối với tôi, đây là cách gọn gàng nhất để đạt được điều này (ít nhất là cho đến khi PHP giới thiệu Typed Mảng, nếu họ đã từng làm), khi chúng ta khai báo kiểu lặp trong lớp lặp, không phải trong các trường hợp của lớp nằm rải rác trong mã.

Tôi chưa chỉ ra ở đây giải pháp hoàn chỉnh để mở rộng ArrayIterator, vì vậy nếu bạn sử dụng kỹ thuật này, bạn cũng có thể muốn:

  • Bao gồm PHPDoc cấp lớp khác theo yêu cầu, cho các phương thức như offsetGet($index)next()
  • Chuyển kiểm tra độ tỉnh táo is_a($object, MyObj::class)từ hàm tạo sang phương thức riêng
  • Gọi kiểm tra độ tỉnh táo (bây giờ là riêng tư) từ ghi đè phương thức như offsetSet($index, $newval)append($value)

Giải pháp rất đẹp và sạch sẽ! :)
Marko Šutija

2

Vấn đề là @varchỉ có thể biểu thị một loại duy nhất - Không chứa một công thức phức tạp. Nếu bạn đã có một cú pháp cho "mảng Foo", tại sao dừng lại ở đó và không thêm một cú pháp cho "mảng của mảng, có chứa 2 Foo và ba Bar"? Tôi hiểu rằng một danh sách các yếu tố có lẽ chung chung hơn thế, nhưng đó là một con dốc trơn trượt.

Cá nhân, đôi khi tôi đã sử dụng @var Foo[]để biểu thị "một mảng của Foo", nhưng nó không được IDE hỗ trợ.


5
Một trong những điều mà tôi yêu thích về C / C ++ là nó thực sự theo dõi các loại xuống mức này. Đó sẽ là một con dốc rất dễ chịu để trượt xuống.
Brilliand

2
Được hỗ trợ bởi Netbeans 7.2 (ít nhất đó là phiên bản tôi sử dụng), nhưng với một chút bất công cụ thể là : /* @var $foo Foo[] */. Chỉ cần viết một câu trả lời dưới đây về nó. Điều này cũng có thể được sử dụng bên trong foreach(){}các vòng lặp
Highmastdon

1
<?php foreach($this->models as /** @var Model_Object_WheelModel */ $model): ?>
    <?php
    // Type hinting now works:
    $model->getImage();
    ?>
<?php endforeach; ?>

5
IDE nào hỗ trợ điều này?
philfreo

21
Điều này rất xấu xí. Nói lời tạm biệt với mã sạch khi bạn bắt đầu lập trình như thế này.
Halfpastfour.am

Thay vào đó, hãy nhìn vào câu trả lời của tôi bằng cách xác định nội dung của mảng: stackoverflow.com/a/14110784/431967
Highmastdon

-5

Tôi đã tìm thấy một cái gì đó đang hoạt động, nó có thể cứu sống!

private $userList = array();
$userList = User::fetchAll(); // now $userList is an array of User objects
foreach ($userList as $user) {
   $user instanceof User;
   echo $user->getName();
}

11
vấn đề duy nhất là việc giới thiệu mã bổ sung sẽ được thực thi, chỉ được IDE của bạn sử dụng hoàn toàn. Thay vào đó, tốt hơn là xác định loại gợi ý trong các bình luận.
Ben Rowe

1
Wow điều này làm việc tuyệt vời. Bạn sẽ kết thúc với mã bổ sung nhưng nó dường như vô hại. Tôi sẽ bắt đầu làm: $ x instanceof Y; // typehint
Igor Nadj

3
Chuyển sang một IDE cung cấp cho bạn hoàn thành mã dựa trên các khóa hoặc kiểm tra. Nếu bạn không muốn chuyển đổi tệp IDE của mình một yêu cầu tính năng trên trình theo dõi vấn đề của IDE.
DanielaWaranie

1
Nếu điều này đưa ra một ngoại lệ nếu loại không chính xác, nó có thể hữu ích cho việc kiểm tra loại thời gian chạy. Nếu ...
lilbyrdie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.