2016-11-19 11 views
13

Jestem bardzo zadowolony z nowych funkcji w PHP 7. Ale jestem zdezorientowany, jak zwraca tablicę obiektów w PHP 7.Funkcja Zwraca typ podpowiedzi na tablicę obiektów w PHP7

Na przykład, mieć klasę Item i chcemy wrócić tablicę obiektów tej klasy z naszej funkcji:

function getItems() : Item[] { 
} 

Ale to nie działa w ten sposób.

+0

Jestem jedną z osób, które są bardzo dobre w ekstrapolacji danych z krótkich tekstów lub przykładów. Ale nie rozumiem, co próbujesz osiągnąć. Czy możesz wyjaśnić pytanie? –

+2

@Hallur: Wręcz przeciwnie, myślę, że plakat jest bardzo wyraźny, chce zadeklarować, że funkcja zwraca tablicę przedmiotu, szkoda, że ​​nie da się tego zrobić w PHP. – Johnny

Odpowiedz

12

Właściwie rozumiem, co masz na myśli, ale odpowiedź niestety polega na tym, że nie możesz tego zrobić. PHP7 nie ma tego rodzaju ekspresji, więc możesz zadeklarować swoją funkcję, aby zwrócić "tablicę" (ogólną tablicę) lub musisz utworzyć nową klasę ItemArray, która jest tablicą Przedmiotów (ale to oznacza, że ​​będziesz musiał sam ją zakodować).

Obecnie nie ma sposobu na wyrażenie "Chcę szereg pozycji".

EDYCJA: Jako dodatkowe odniesienie, tutaj "array of" RFC tego, co chciałeś zrobić, zostało odrzucone z różnych powodów.

+0

oh gos, to jest rozczarowujące:/ –

+0

Myślałem, że przejście do PHP 7 może pomóc mi stworzyć ścisły kod typu:/ –

+0

Wiem, że to rozczarowuje: (dodałem odnośnik do RFC, który mówi dokładnie o funkcji pytasz o. Zostało odrzucone – Johnny

3

Aktualna wersja PHP nie obsługuje wbudowanego podpowiedzi typu dla tablicy obiektów, ponieważ nie istnieje taki typ danych jak "tablica obiektów". Nazwa klasy może być interpretowana jako typ w określonych kontekstach, a także jako array, ale nie obie naraz.

Właściwie można wdrożyć tego rodzaju ścisłego typu podpowiadania tworząc klasę opartą na ArrayAccess interfejsu, np

class Item { 
    protected $value; 

    public function __construct($value) { 
    $this->value = $value; 
    } 
} 


class ItemsArray implements ArrayAccess { 
    private $items = []; 

    public function offsetSet($offset, $value) { 
    if (! $value instanceof Item) 
     throw new Exception('value must be an instance of Item'); 

    if (is_null($offset)) { 
     $this->container[] = $value; 
    } else { 
     $this->container[$offset] = $value; 
    } 
    } 

    public function offsetExists($offset) { 
    return isset($this->container[$offset]); 
    } 

    public function offsetUnset($offset) { 
    unset($this->container[$offset]); 
    } 

    public function offsetGet($offset) { 
    return isset($this->container[$offset]) ? $this->container[$offset] : null; 
    } 
} 


function getItems() : ItemsArray { 
    $items = new ItemsArray(); 
    $items[0] = new Item(0); 
    $items[1] = new Item(2); 
    return $items; 
} 

var_dump((array)getItems()); 

Output

array(2) { 
    ["ItemsArrayitems"]=> 
    array(0) { 
    } 
    ["container"]=> 
    array(2) { 
    [0]=> 
    object(Item)#2 (1) { 
     ["value":protected]=> 
     int(0) 
    } 
    [1]=> 
    object(Item)#3 (1) { 
     ["value":protected]=> 
     int(2) 
    } 
    } 
} 
+0

to jest dobre, ale wolę automatyczny sposób, mam nadzieję, że zaimplementują tę funkcję w niedalekiej przyszłości, dzięki :) –

9

ta nazywa rodzajowych, niestety w najbliższym czasie nie zobaczy tej funkcji. Możesz wpisać podpowiedź w ten sposób, ale w docblocks.

Edytor PHP, taki jak phpStorm, obsługuje to bardzo dobrze i poprawnie rozpozna nazwę klasy podczas iteracji w takiej tablicy.

/** 
* @return YourClass[] 
*/ 
public function getObjects()