Пример:
Я хочу иметь два разных конструктора, и я не хочу использовать func_get_arg (), потому что тогда невидимо, какие аргументы возможны.
Можно ли написать два из них, например:
class MyClass { public function __construct() { // do something } public function __construct(array $arg) { // do something } }
?
Нет, но вы можете это сделать:
class MyClass { public function __construct($arg = null) { if(is_array($arg)) { // do something with the array } else { // do something else } } }
В PHP функция может принимать любое количество аргументов, и их не нужно определять, если вы даете им значение по умолчанию. Вот как вы можете «подделать» функцию перегрузки и разрешить доступ к функциям с разными аргументами.
PHP имеет то, что он называет «перегрузкой» (с помощью метода __call
magic), но на самом деле происходит магический метод __call
вызывается, когда недоступный или несуществующий метод, скорее как __get
и __set
позволяет вам «получить доступ» к недоступным / -устойчивые свойства. Вы можете использовать это для реализации перегрузок не магических методов, но это громоздко.
Поскольку формальные параметры могут быть нетипизированы (которые отличаются от значений аргументов, которые являются нетипизированными, поскольку они набраны), и даже функция arity не строго соблюдается (каждая функция имеет минимальное количество аргументов, но не имеет теоретического максимума), вы также можете напишите тело метода для обработки различных чисел и типов аргументов.
Нет, вы не можете этого сделать.
Это невозможно, однако, чтобы решить проблему невидимых аргументов, вы можете использовать класс отражения .
if(count($args) == 0) $obj = new $className; else { $r = new ReflectionClass($className); $obj = $r->newInstanceArgs($args); }
Поскольку PHP является языком слабого ввода и он поддерживает функции с переменным числом аргументов (так называемые varargs), нет никакой разницы между процессором между двумя функциями с тем же именем, даже если они имеют различное количество объявленных аргументов (все функции переменные аргументы). Таким образом, перегрузка является незаконной по дизайну.
Вы также можете использовать func_get_args () для создания псевдоперегруженных функций, хотя это может вызвать запутанный интерфейс для вашего метода / функции.