Подтвердить что ты не робот

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

например:.

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

Возможно ли это? Какая лучшая альтернатива?

4b9b3361

Ответ 1

Есть несколько вариантов. Используйте create_function:

$functions = array(
  'function1' => create_function('$echo', 'echo $echo;')
);

Просто сохраните имя функции в виде строки (это действительно все create_function):

function do_echo($echo) {
    echo $echo;
}

$functions = array(
  'function1' => 'do_echo'
);

Если вы используете PHP 5.3, вы можете использовать анонимные функции:

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

Все эти методы перечислены в документации под псевдонимом callback. Какой бы вы ни выбрали, рекомендуемый способ вызова вашей функции был бы либо с call_user_func, либо call_user_func_array.

call_user_func($functions['function1'], 'Hello world!');

Ответ 2

Так как PHP "5.3.0 Анонимные функции становятся доступными", пример использования:

обратите внимание, что это намного быстрее, чем при использовании старого create_function...

//store anonymous function in an array variable e.g. $a["my_func"]
$a = array(
    "my_func" => function($param = "no parameter"){ 
        echo "In my function. Parameter: ".$param;
    }
);

//check if there is some function or method
if( is_callable( $a["my_func"] ) ) $a["my_func"](); 
    else echo "is not callable";
// OUTPUTS: "In my function. Parameter: no parameter"

echo "\n<br>"; //new line

if( is_callable( $a["my_func"] ) ) $a["my_func"]("Hi friend!"); 
    else echo "is not callable";
// OUTPUTS: "In my function. Parameter: Hi friend!"

echo "\n<br>"; //new line

if( is_callable( $a["somethingElse"] ) ) $a["somethingElse"]("Something else!"); 
    else echo "is not callable";
// OUTPUTS: "is not callable",(there is no function/method stored in $a["somethingElse"])

ЛИТЕРАТУРЫ:

Ответ 3

Чтобы следить за сообщением Alex Barrett, create_function() возвращает значение, которое вы действительно можете использовать для вызова функции, таким образом:

$function = create_function('$echo', 'echo $echo;' );
$function('hello world');

Ответ 4

Потому что я мог...

Расширение на пост Алекса Барретта.

Я буду работать над дальнейшим уточнением этой идеи, возможно, даже к чему-то вроде внешнего статического класса, возможно, используя токен '...', чтобы разрешить аргументы переменной длины.

В следующем примере я использовал ключевое слово "массив" для ясности, однако квадратные скобки также подойдут. Показанный макет, который использует функцию 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 suggested solution
        // call_user_func($this->constructors[$index], $args);  

        // RibaldEddie 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());
}

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