Nesneler dizisi için PHPDoc tipi ima?

8 Cevap php

Yani, PHPDoc bir @var kendi türüne de ipucu üye değişkeni bildirimi yukarıda belirtebilirsiniz. Ex için daha sonra bir IDE. PHPEd, onunla çalışıyor nesnenin ne tür bilecek ve bu değişken için bir kod fikir sağlamak mümkün olacaktır.

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

Ben daha sonra bu nesnelerin arasında yineleme zaman uygun bir ipucu elde edebilmek için nesnelerin bir dizi aynı yapmanız gereken kadar bu harika çalışıyor.

Yani, üye değişken SomeObj s bir dizi olduğunu belirtmek için bir PHPDoc etiketi bildirmek için bir yol var? @var dizisi yeterli değildir, ve @var array(SomeObj), örneğin, geçerli görünmüyor.

8 Cevap

Yapabileceğiniz en iyi, diyelim ki bir

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

Ben yapmak Zend Studio bir sürü. Diğer editörler hakkında biliyorum, ama çalışmak gerektiğini etmeyin.

JetBrains gelen PhpStorm IDE, kullanmak /** @var SomeObj[] */, örneğin yapabilirsiniz:

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

phpdoc documentation bu yöntemi önerir:

Tek bir tipini içeren belirtilen Tip tanımı, her dizi elemanının türü okuyucuyu bilgilendirir. Yalnızca bir tür daha sonra belirli bir dizisi için bir unsur olarak beklenmektedir.

Örnek: @return int[]

Bir değişkeni belirtmek için nesneler bir dizidir:

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

Bu NetBeans 7.2 çalışır (ben bunu kullanıyorum)

Ile de çalışır:

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

Bu nedenle iç ilanının nda foreach gerekli değildir.

NetBeans 7.0 olarak sadece @return Text olarak ve kod avcılığı çalışacak dönüş türü "Metin nesneleri ile dizi" bildirebilirsiniz (alt çok olabilir):

Edit: @ Bob Fanger öneri ile örnek güncelledik

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

ve sadece onu kullanın:

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

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

Bu mükemmel değil ama sadece sadece "karma" bırakın o zaman daha iyidir, cadı hiçbir değer getiriyor.

İNŞAAT Text Object cadı hataları atar gibi dizi yürümek için izin olmasıdır.

I prefer to read and write clean code - as outlined in "Clean Code" by Robert C. Martin. When following his credo you should not require the developer (as user of your API) to know the (internal) structure of your array.

API kullanıcı isteyebilir: Is sadece tek boyutlu bir dizi? Nesneleri çok boyutlu bir dizinin tüm seviyelerde çevresinde yayılır? I tüm nesnelere erişmek için kaç iç içe döngüler (foreach, vb) gerekiyor? Nesnelerin türü nedir o diziye "saklanan" vardır?

Eğer belirtildiği gibi tek boyutlu bir dizi olarak (nesneleri içerir) bu diziyi kullanmak istiyorum.

Nishi tarafından belirtildiği gibi kullanabilirsiniz:

/**
 * @return SomeObj[]
 */

Bunun için.

Fakat yine: farkında olmak - bu standart bir bilgilendirme kısmı gösterim değildir. Bu gösterim bazı IDE üreticileri tarafından tanıtıldı.

Tamam, tamam, bir geliştirici olarak "[]" PHP bir dizi bağlı olduğunu biliyoruz. Ama "bir şey []" normal PHP bağlamında ne anlama geliyor? "[]" Anlamına gelir: "şey" içinde yeni bir öğe oluşturun. Yeni eleman her şey olabilir. Ama ne ifade etmek istiyorum: aynı tip ve kesin tip nesneleri dizisi. Gördüğünüz gibi, IDE yapımcı, yeni bir içerik sunuyor. Eğer öğrenmek zorunda yeni bir bağlam. Yeni bir bağlam diğer PHP geliştiricileri (sizin bilgilendirme kısmı anlamak için) öğrenmek zorunda kaldı. Bad tarzı (!).

Diziniz bir boyut var çünkü belki aramak istediğiniz "nesneler dizisi" bir "liste". "Liste" diğer programlama dillerinde bir çok özel bir anlamı vardır farkında olun. Örneğin "toplama" diyoruz mutch daha iyi olurdu.

Remember: you use a programming language that enables you all options of OOP. Use a class instead of an array and make your class traversable like an array. E.g.:

class orderCollection implements ArrayIterator

Yoksa bir çok boyutlu bir dizi / object yapısı içinde farklı düzeylerde iç nesneleri saklamak istiyorsanız:

class orderCollection implements RecursiveArrayIterator

Bu çözüm tip "orderCollection" bir nesne tarafından diziyi değiştirir, ama şimdiye kadar IDE içinde kod tamamlama imkan yok. Tamam. Sonraki adım:

Bilgilendirme kısmı ile arabirimi tarafından tanıtıldı yöntemleri uygulamak - özellikle:

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

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

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

Için tip ipuçlarını kullanmayı unutmayın:

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

Bu çözüm bir çok tanıtan durur:

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

Zahymaka onun / onun cevabı ile teyit gibi tüm kod dosyaları üzerinde, (döngüler içinde örneğin). API kullanıcı kodu tamamlanması için, bu bilgilendirme kısmı tanıtmak zorunda değildir. @ Yalnızca tek bir yerde mümkün olduğunca mutch olarak (var @) fazlalık azaltır döndürmek için. "@ Var ile bilgilendirme kısmı" kod kötü okunabilir yapacak serpin.

Nihayet bitirdiniz. Başarmak zor görünüyor? Bir ceviz bir balyoz alarak benziyor? Değil gerçekten, bu arayüzleri ile ve temiz kod aşina beri. Unutmayın: yazılmış kaynak kodu bir kez / çok okudum.

IDE kod tamamlama bu yaklaşımla işe yaramazsa, daha iyi biri (örn. IntelliJ IDEA, PhpStorm, Netbeans) geçiş veya IDE üreticinin sorunu izci bir özellik isteği dosyası.

Benim eğitmen olduğu için ve bana böyle büyük bir şeyler öğretmek için (Almanya) Christian Weiss için teşekkürler. PS: XING, onu ve beni tanışın.

Karmaşık bir formül içermemelidir - Sorun @var tek bir türü belirtmek olabilir. Eğer "Foo dizi" için bir sözdizimi olsaydı, neden için bir sözdizimi eklemek orada durdurmak değil, "dizi dizi, bu 2 Foo ait ve üç Bar adlı içeriyor"? Ben öğelerin listesini belki de bundan daha genel olduğunu anlıyorum, ama kaygan bir eğim var.

Şahsen ben @var Foo[] "Foo adlı bir dizi" belirtmek için kullanılan bazı zamanlar var, ama IDE tarafından desteklenmiyor değil.

Use array[type] Zend Studio.

Zend Studio, array[MyClass] veya array[int] ya da array[array[MyClass]] büyük iş.

Ben çalışma bir şey bulduk, bu hayat kurtarabilir!

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