Intereting Posts
Как читать только части текстового файла? Метод Laravel Log useFiles делает запись в журнале несколькими файлами CodeIgniter – Загрузка изображения через форму, сохранение местоположения изображения в базе данных Laravel 5.3 – Как регистрировать все запросы на странице? Html / PHP – Форма – ввод как массив Как я могу получить адрес электронной почты пользователя и имя пользователя из кнопки входа в facebook? MySQL SELECT женщины не мужчины Применение информации из одной таблицы в отдельную таблицу в той же базе данных? При запуске PHP bin / magento deploy: mode: set production Я получаю ошибку на magento 2.1 Codeigniter base_url () не работает должным образом для ajax как назначить значение переменной javascript переменной php как хранить (в php) и использовать (в javascript) большой объем данных php-код для создания нескольких строк с настраиваемым кодом php XML DOM переводит специальные символы в & # xYY; Страница входа в Cakephp запрашивает пользователей таблицы, но у меня есть только таблица пользователей

Функции Variadic и тип-намеки в PHP

Быстрый:

Есть ли способ принудительного применения типов для вариативных функций в 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; }