Tak więc w PHPDoc można wskazać @var
powyżej deklaracji zmiennej składowej, aby wskazać jej typ. Następnie IDE, np. PHPEd, będzie wiedział z jakiego typu obiektem współpracuje i będzie w stanie zapewnić wgląd w kod dla tej zmiennej.
<?php
class Test
{
/** @var SomeObj */
private $someObjInstance;
}
?>
Działa to świetnie, dopóki nie muszę zrobić tego samego z szeregiem obiektów, aby móc uzyskać odpowiednią wskazówkę podczas iteracji przez te obiekty później.
Czy istnieje sposób na zadeklarowanie znacznika PHPDoc w celu określenia, że zmienna składowa jest tablicą SomeObj
s? @var
tablica jest niewystarczająca i @var array(SomeObj)
na przykład wydaje się nieprawidłowa.
Odpowiedzi:
Posługiwać się:
podczas wpisywania zmiennych wbudowanych oraz
dla właściwości klasy.
Poprzednia odpowiedź z '09, kiedy PHPDoc (i IDE, takie jak Zend Studio i Netbeans) nie miały tej opcji:
Najlepsze, co możesz zrobić, to powiedzieć:
Często to robię w Zend Studio. Nie wiem o innych edytorach, ale powinno działać.
źródło
/** @var $Obj Test */
ponieważ masz tylko jedną gwiazdkę - nie działa.@var Object[] $objects
mówi, że „$ objects” to tablica instancji Object.)/** @var TYPE $variable_name */
jest poprawną składnią; nie odwracaj kolejności typów i nazw zmiennych (jak sugerowano wcześniej w komentarzach), ponieważ nie będzie to działać we wszystkich przypadkach.W PhpStorm IDE z JetBrains możesz użyć
/** @var SomeObj[] */
np .:Dokumentacja phpdoc zaleca tę metodę:
źródło
foreach(getSomeObjects() as $obj)
nie działa, ale działa$objs = getSomeObjects(); foreach($objs as $obj)
@var Obj[string]
tablice asocjacyjne.Wskazówki dotyczące Netbeans:
Uzyskujesz uzupełnianie kodu dla tablicy klas użytkownika
$users[0]->
i$this->
dla niej.Możesz także zobaczyć typ tablicy na liście członków klasy po zakończeniu
$this->...
źródło
array_pop()
z jakiegoś powodu to nie działa po użyciu lub podobnych funkcji. Wydaje się, że Netbeans nie zdaje sobie sprawy, że te funkcje zwracają pojedynczy element tablicy wejściowej.Aby określić zmienną, jest tablica obiektów:
Działa to w Netbeans 7.2 (używam go)
Współpracuje również z:
Dlatego stosowanie deklaracji wewnątrz
foreach
nie jest konieczne.źródło
/* @var $Obj Test */
każdym razem bez nowej adnotacji./**
2. Prawidłowy format to@var <data-type> <variable-name>
PSR-5: PHPDoc proponuje formę notacji typu Generics.
Składnia
Wartości w kolekcji MOGĄ być nawet inną tablicą, a nawet inną kolekcją.
Przykłady
Uwaga: Jeśli spodziewasz się, że IDE wykona asystę kodu, to kolejne pytanie, czy IDE obsługuje notację kolekcji w stylu PHPDoc.
Od mojej odpowiedzi do to pytanie .
źródło
Wolę czytać i pisać czysty kod - jak opisano w „Clean Code” Roberta C. Martina. Podążając za jego credo, nie powinieneś wymagać od programisty (jako użytkownika twojego API) znajomości (wewnętrznej) struktury twojej tablicy.
Użytkownik interfejsu API może zapytać: Czy to tablica z tylko jednym wymiarem? Czy obiekty są rozmieszczone na wszystkich poziomach tablicy wielowymiarowej? Ile zagnieżdżonych pętli (foreach itp.) Muszę uzyskać dostęp do wszystkich obiektów? Jakie obiekty są „przechowywane” w tej tablicy?
Jak opisano, chcesz użyć tej tablicy (która zawiera obiekty) jako tablicy jednowymiarowej.
Jak opisano w Nishi, możesz użyć:
za to.
Ale znowu: bądź świadomy - to nie jest standardowa notacja docblock. Notacja ta została wprowadzona przez niektórych producentów IDE.
Dobra, dobra, jako programista wiesz, że „[]” jest powiązane z tablicą w PHP. Ale co oznacza „coś []” w normalnym kontekście PHP? „[]” oznacza: utwórz nowy element w „czymś”. Nowym elementem może być wszystko. Ale to, co chcesz wyrazić, to: tablica obiektów tego samego typu i dokładny typ. Jak widać, producent IDE wprowadza nowy kontekst. Nowy kontekst, którego musiałeś się nauczyć. Nowy kontekst, którego musieli się nauczyć inni programiści PHP (aby zrozumieć twoje docblocks). Zły styl (!).
Ponieważ twoja tablica ma jeden wymiar, możesz nazwać tę „tablicę obiektów” „listą”. Pamiętaj, że „lista” ma szczególne znaczenie w innych językach programowania. Na przykład lepiej byłoby nazwać to „kolekcją”.
Pamiętaj: używasz języka programowania, który udostępnia wszystkie opcje OOP. Użyj klasy zamiast tablicy i spraw, aby Twoja klasa mogła przechodzić jak tablica. Na przykład:
Lub jeśli chcesz przechowywać obiekty wewnętrzne na różnych poziomach w wielowymiarowej strukturze tablicy / obiektu:
To rozwiązanie zastępuje tablicę obiektem typu „orderCollection”, ale jak dotąd nie włącza uzupełniania kodu w IDE. W porządku. Następny krok:
Zaimplementuj metody wprowadzane przez interfejs za pomocą docblocks - w szczególności:
Nie zapomnij użyć podpowiedzi typu dla:
To rozwiązanie przestaje wprowadzać wiele:
w całym pliku kodu (np. w pętli), jak Zahymaka potwierdził swoją odpowiedzią. Użytkownik interfejsu API nie jest zmuszony do wprowadzenia tych bloków dokumentów w celu ukończenia kodu. Posiadanie @ powrotu tylko w jednym miejscu zmniejsza nadmiarowość (@var) tak bardzo, jak to możliwe. Posypanie „docBlocks @var” sprawi, że twój kod będzie najgorzej czytelny.
W końcu skończone. Wygląda na trudny do osiągnięcia? Wygląda na to, że bierzesz młot, żeby zgnieść orzecha? Nie do końca, ponieważ znasz te interfejsy i czysty kod. Pamiętaj: Twój kod źródłowy jest zapisywany raz / przeczytany wiele.
Jeśli uzupełnianie kodu w twoim IDE nie działa z tym podejściem, przełącz się na lepsze (np. IntelliJ IDEA, PhpStorm, Netbeans) lub złóż żądanie funkcji na monitorze problemów producenta IDE.
Podziękowania dla Christiana Weissa (z Niemiec) za bycie moim trenerem i za nauczenie mnie tak wspaniałych rzeczy. PS: Spotkajmy się ze mną na XING.
źródło
SomeObj[]
że wiesz, że jest to dwuwymiarowa tablicaSomeObj
instancji, a następnie wiesz, co z tym zrobić. Nie sądzę, że nie jest zgodny z credo „czystego kodu”.@return <className>
dlacurrent()
wszystkich i dla wszystkich. PhpStorm obsługuje, więc bardzo mi pomogło. Dzięki stary!Użyj
array[type]
w Zend Studio.W Zend Studio,
array[MyClass]
lubarray[int]
lub nawetarray[array[MyClass]]
doskonale.źródło
W NetBeans 7.0 (może być również niższy) możesz zadeklarować typ zwracany „tablica z obiektami tekstowymi” tak, jak
@return Text
działa podpowiedź do kodu:Edycja: zaktualizowano przykład sugestią @Bob Fanger
i po prostu użyj go:
Nie jest idealny, ale lepiej jest po prostu pozostawić go „mieszanego”, co nie przynosi żadnej wartości.
CONS jest dozwolone, aby traktować tablicę jako obiekt tekstowy, który będzie generował błędy.
źródło
Jak DanielaWaranie wymienione w jej odpowiedź - nie ma sposobu, aby określić typ elementu $ podczas iteracji nad $ w $ collectionObject pozycje: Dodaj
@return MyEntitiesClassName
docurrent()
a resztaIterator
iArrayAccess
-methods których wartości zwrotnych.Bum! Nie ma potrzeby
/** @var SomeObj[] $collectionObj */
kończeniaforeach
i działa poprawnie z obiektem kolekcji, nie ma potrzeby zwracania kolekcji za pomocą określonej metody opisanej jako@return SomeObj[]
.Podejrzewam, że nie wszystkie IDE go obsługują, ale działa on doskonale w PhpStorm, co czyni mnie szczęśliwszym.
Przykład:
Przydało mi się dodać opublikowanie tej odpowiedzi
W moim przypadku
current()
resztainterface
-metod jest zaimplementowana wAbstract
klasie -collection i nie wiem, jakiego rodzaju jednostki zostaną ostatecznie zapisane w kolekcji.Oto sztuczka: nie określaj typu zwracanego w klasie abstrakcyjnej, zamiast tego użyj instancji PhpDoc
@method
w opisie konkretnej klasy kolekcji.Przykład:
Teraz użycie klas:
Jeszcze raz: podejrzewam, że nie wszystkie IDE go obsługują, ale PhpStorm je obsługuje. Wypróbuj swoje, opublikuj w komentarzach wyniki!
źródło
Wiem, że jestem spóźniony na imprezę, ale ostatnio pracowałem nad tym problemem. Mam nadzieję, że ktoś to zobaczy, ponieważ zaakceptowana odpowiedź, choć poprawna, nie jest najlepszym sposobem, aby to zrobić. Przynajmniej nie w PHPStorm, chociaż nie testowałem NetBeans.
Najlepszym sposobem jest rozszerzenie klasy ArrayIterator zamiast używania rodzimych typów tablic. Pozwala to na wpisywanie podpowiedzi na poziomie klasy, a nie na poziomie instancji, co oznacza, że musisz PHPDoc tylko raz, a nie w całym kodzie (który jest nie tylko bałagan i narusza DRY, ale może również powodować problemy, jeśli chodzi o refaktoryzacja - PHPStorm ma zwyczaj nieobecności PHPDoc podczas refaktoryzacji)
Zobacz kod poniżej:
Kluczem tutaj jest PHPDoc
@method MyObj current()
przesłaniający typ zwracany odziedziczony z ArrayIterator (który jestmixed
). Włączenie tego PHPDoc oznacza, że gdy iterujemy po właściwościach klasyforeach($this as $myObj)
, otrzymujemy zakończenie kodu w odniesieniu do zmiennej$myObj->...
Dla mnie jest to najładniejszy sposób na osiągnięcie tego (przynajmniej dopóki PHP nie wprowadzi Tablic Typowanych, jeśli w ogóle to zrobią), ponieważ deklarujemy typ iteratora w klasie iterowalnej, a nie w instancjach klasy rozproszonej po całym kodzie.
Nie pokazałem tutaj kompletnego rozwiązania dla rozszerzenia ArrayIterator, więc jeśli używasz tej techniki, możesz również:
offsetGet($index)
inext()
is_a($object, MyObj::class)
z konstruktora na metodę prywatnąoffsetSet($index, $newval)
iappend($value)
źródło
Problem polega na tym, że
@var
może oznaczać tylko jeden typ - nie może zawierać złożonej formuły. Jeśli miałeś składnię dla „tablicy Foo”, dlaczego miałbyś się tam zatrzymać i nie dodawać składni dla „tablicy tablicy, która zawiera 2 Foo i trzy paski”? Rozumiem, że lista elementów jest być może bardziej ogólna, ale jest to śliskie nachylenie.Osobiście czasami
@var Foo[]
zdarzało mi się oznaczać „tablicę Foo”, ale nie jest to obsługiwane przez IDE.źródło
/* @var $foo Foo[] */
. Właśnie napisałem o tym poniżej odpowiedź. Można tego również użyć wforeach(){}
pętlachźródło
Znalazłem coś, co działa, może uratować życie!
źródło