У меня есть класс на 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() );