например:
$functions = array(
'function1' => function($echo) { echo $echo; }
);
Действительно ли это возможно? Что лучшее альтернативно?
Поскольку я мог...
Подробно останавливающийся на сообщении Alex Barrett.
я буду работать над дальнейшим совершенствованием этой идеи, возможно, даже к чему-то как внешний статический класс, возможно с помощью '...' маркер для разрешения аргументов переменной длины.
В следующем примере я использовал ключевое слово 'массив' для ясности однако, квадратные скобки были бы также прекрасны. Расположение, показанное, который использует функцию init, предназначается для демонстрации организации по более сложному коду.
<?php
// works as per php 7.0.33
class pet {
private $constructors;
function __construct() {
$args = func_get_args();
$index = func_num_args()-1;
$this->init();
// Alex Barrett's suggested solution
// call_user_func($this->constructors[$index], $args);
// RibaldEddie's way works also
$this->constructors[$index]($args);
}
function init() {
$this->constructors = array(
function($args) { $this->__construct1($args[0]); },
function($args) { $this->__construct2($args[0], $args[1]); }
);
}
function __construct1($animal) {
echo 'Here is your new ' . $animal . '<br />';
}
function __construct2($firstName, $lastName) {
echo 'Name-<br />';
echo 'First: ' . $firstName . '<br />';
echo 'Last: ' . $lastName;
}
}
$t = new pet('Cat');
echo '<br />';
$d = new pet('Oscar', 'Wilding');
?>
хорошо, усовершенствованный вниз к одной строке теперь как...
function __construct() {
$this->{'__construct' . (func_num_args()-1)}(...func_get_args());
}
Может использоваться для перегрузки любой функции, не просто конструкторов.