Быстрый:
Есть ли способ принудительного применения типов для вариативных функций в PHP? Я предполагаю, что нет, однако, возможно, я что-то пропустил.
На данный момент я просто заставляю один требуемый аргумент нужного типа и повторяю, проверяя остальное.
public function myFunction(MyClass $object){ foreach(func_get_args() as $object){ if(!($object instanceof MyClass)){ // throw exception or something } $this->_objects[] = $object; } }
Какие-нибудь лучшие решения?
Цель:
Объект-контейнер, который выполняет роль повторного списка дочерних объектов, с некоторыми полезными функциями. вызов его с помощью конструктора Variadic будет примерно таким:
// returned directly from include return new MyParent( new MyChild($params), new MyChild($params), new MyChild($params) );
Другим вариантом может быть цепочка методов addChild
:
$parent = new MyParent; return $parent ->addChild(new MyChild($params)) ->addChild(new MyChild($params)) ->addChild(new MyChild($params));
Дети также принимают несколько аргументов своему конструктору, поэтому я стараюсь сбалансировать разборчивость и затраты на обработку.
Ну, я бы сказал, это зависит от количества аргументов 🙂 Нет ничего похожего на список (все аргументы 1-n как MyClass [до PHP 5.6, для PHP 5.6+ см. Функции Variadic ]), это больше того, что вам нужно писать каждый аргумент (как в вашем вопросе), и ему разрешено отправлять больше, но будут проверены только те, которые определены.
Однако вы можете определить больше и сделать их необязательными. Следовательно, почему я просто написал это, зависит от количества аргументов:
public function myFunction(MyClass $object, MyClass $object2=null, MyClass $object3=null, MyClass $object4=null, ...){ foreach(func_get_args() as $object){ if(null === $object){ // throw exception or something } $this->_objects[] = $object; } }
С таким примером PHP бы породил исключение уже тогда, когда аргумент не является NULL, а не MyClass (Передача NULL, если задана как значение по умолчанию, также может пройти). Необязательный параметр не должен быть частью возвращаемого значения func_get_args()
. Я имею в виду, что если вы не передадите третий аргумент (здесь он называется $object3
), он не появится в массиве, возвращаемом func_get_args()
.
Не знаю, если это более практично для вас, чем ваш код в вопросе.
Если вы столкнетесь с такими ситуациями в своем коде, вы можете создать своего рода помощника для проверки ввода вызовов функций и делегирования для исключения исключений с хорошим сообщением об ошибке от помощника. Это предотвратит дублирование кода и даст больше комфорта в разработке, поскольку вы можете сделать заметки об исключениях лучше, когда вы пишете их для нескольких случаев.
Согласно вашей новой обратной связи, если вы хотите, чтобы в первую очередь интерпретатор позволял работать с проверкой, небольшой итерацией и функцией addMember, это сделало бы это:
class MyParent { private $children = array(); public function __construct() { foreach(func_get_args() as $object) $this->addChild($object); } public function addChild(MyChild $object) { $this->children[] = $object; } }
Создание объекта с неправильным типом объекта в любом из списка предотвратит создание экземпляра коллекции.
вы можете просто сделать это:
// returned directly from include return new MyParent( new MyChild($params), new MyChild($params), new MyChild($params) );
Теперь это возможно с помощью PHP 5.6.x , используя оператор … (также известный как оператор splat на некоторых языках):
Пример:
function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals ) { foreach ( $intervals as $interval ) { $dt->add( $interval ); } return $dt; }