Intereting Posts
Может ли кто-нибудь подделать IP-адрес на любой номер? Разметка разметки в абстрактном дереве синтаксиса с использованием регулярного выражения PHP regexp – обнаружение закрытых скобок Как я могу удалить iframe-вирус из всех php-файлов на моем веб-сайте Передача данных с контроллера для просмотра в Laravel AngularJS FileSaver, производящий пустой файл Допустимый размер памяти X байтов Загрузка файла PHP с помощью скрытого IFrame без сохранения Простой субдомен перенаправления PHP CakePHP: несколько наборов полей для загрузки файлов необходимо автоматически PHP – Передача переменных с одной страницы на другую Когда вызывать mysqli :: close Специальные переменные IPN Paypal предотвращать получение двойной формы при обновлении Могу ли я использовать iconv для преобразования многобайтовых интеллектуальных котировок в расширенные интеллектуальные кавычки ASCII?

PHP: Как передать дочерние классы __construct () аргументам parent :: __ construct ()?

У меня есть класс на PHP:

class ParentClass { function __construct($arg) { // Initialize a/some variable(s) based on $arg } } 

Он имеет дочерний класс, как таковой:

 class ChildClass extends ParentClass { function __construct($arg) { // Let the parent handle construction. parent::__construct($arg); } } 

Что, если по какой-то причине ParentClass нужно изменить, чтобы принять более одного необязательного аргумента, который я бы хотел, чтобы мой класс Child обеспечивал «на всякий случай»? Если я не перекодирую ChildClass, он будет когда-либо принимать только один аргумент конструктору и будет когда-либо передавать только один аргумент.

Это настолько редкая или такая плохая практика, что обычный случай заключается в том, что ChildClass не нужно наследовать от ParentClass, который принимает разные аргументы?

По сути, я видел в Python, где вы можете передать потенциально неизвестное количество аргументов функции через somefunction(*args) где «args» – это массив / итерируемый какой-либо вид. Что-то вроде этого существует в PHP? Или я должен реорганизовать эти классы, прежде чем продолжить?

В php есть что-то подобное, хотя немного многословное:

 $args = func_get_args(); call_user_func_array(array($this, 'parent::__construct'), $args); 

Это можно сделать в PHP> = 5.6 без call_user_func_array() с помощью оператора ... (splat) :

 public function __construct() { parent::__construct(...func_get_args()); } 

если вы получите ошибку с ограничениями php вложенных пределов, попробуйте следующее:

 $args = func_get_args(); call_user_func_array(array('parent', '__construct'), $args); 

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

Разумеется, общий способ передать набор «любых аргументов, которые нам могут когда-либо понадобиться» в PHP, – это передать один аргумент, состоящий из массива значений конфигурации.

Проверьте эти функции на php.net:

 func_get_args func_num_args 

Кроме того, если вы хотите сделать необязательный аргумент, вы можете сделать это:

 class ParentClass { function __construct($arg, $arg2="Default Value") { // Initialize a/some variable(s) based on $arg } } 
 parent::__construct( func_get_args() );