Можно ли сохранить функцию в массиве PHP?

например:

$functions = array(
  'function1' => function($echo) { echo $echo; }
);

Действительно ли это возможно? Что лучшее альтернативно?

61
задан 30 September 2009 в 22:25

1 ответ

Поскольку я мог...

Подробно останавливающийся на сообщении 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());
}

Может использоваться для перегрузки любой функции, не просто конструкторов.

0
ответ дан 31 October 2019 в 15:10

Другие вопросы по тегам:

Похожие вопросы: