2017-01-12 7 views
1

Я хочу получить массив MyInterface как в приведенном ниже коде.Как получить массив конкретного интерфейса в методе класса PHP?

public function saveMultiple(
    \Path\To\MyInterface $attachLinks[] 
); 

Приведенный выше код не работает.

Так что, пожалуйста, не говорите мне, что просто удалите \Path\To\MyInterface и используйте переменную $attachLinks. Я уже знаю об этом, но это то, что мне нужно.

+0

какая версия php вы использовали? – donald123

+0

Хорошо, я искал это, и вы спасли свое время :) –

ответ

0

До сих пор это то, что может быть сделано используя PHP7. До даты прохождения массивов определенного типа невозможно.

public function saveMultiple(
    array $attachLinks 
); 

Теперь он по крайней мере должен убедиться, что метод получает массив только в качестве параметра.

+0

Человек, который проголосовал здесь, должен также прокомментировать объяснение. Как вы можете лучше судить о чем-то, что я спросил? –

1

В php нет общих типов, поэтому вы не можете указать тип «массив чего-то».

Но вы можете сделать трюк. Проверьте типы элементов в массиве.

array_walk($attachLinks, function (\Path\To\MyInterface $item) {}); 

Если вы завернете его в assert, вы сможете отключить эту проверку.

assert('array_walk($attachLinks, function (\Path\To\MyInterface $item) {})'); 
+0

Это не будет иметь целью принудительное использование интерфейсов проходящих массивов. –

+0

Да. Это не совсем то, что вы хотите. Это обходное решение, которое позволяет вам быть уверенным, что код не будет выполнен с неправильными элементами в массиве. –

-1

Может быть, вы можете использовать некоторый тип сеттер, как:

private $attachLinks = []; 
public function setter(MyInterface $var) 
{ 
    $this->attachLinks[] = $var; 
} 

И не использовать $ this-> attachLinks в функции

public function saveMultiple() { 
    print_r($this->attachLinks); 
}