Можно ли программно зарегистрировать / создать именованную функцию в PHP внутри глобальной области видимости?
Это возможно с create_function
(до PHP 7+) и в настоящее время это возможно с помощью анонимных / лямбда-функций, но опять же вы либо позволяете им вызываться, либо присваиваете их переменной или свойству объекта, а затем просто вызываете их с помощью ()
в конце.
Что меня интересует, если так или иначе возможно добавить новую именованную функцию в область, которая не должна быть назначена переменной и доступна с помощью $functionName
?
Некоторое решение, которое я ищу:
create_named_function('fullname', function($firstname, $lastname) {
return $firstname . ' ' . $lastname;
});
Тогда я бы сделал это доступным, как fullname(params...)
,
Не уверен, стоит ли поощрять это делать — он останавливает все виды полезных вещей, способных проверять код и завершение кода в IDE.
НО…
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$body = <<< 'FN'
<?php
function fullname($firstname, $lastname) {
return $firstname . ' ' . $lastname;
}
FN;
file_put_contents("func.php", $body);
require "func.php";
echo fullname("Joe", "Bloggs");
Первая часть создает файл включения с требуемым кодом (обратите внимание на использование строки Nowdoc, которая позволяет включать переменные без их замены). Это может быть любая форма генерации кода.
Вот пример с eval
:
<?php
$functionName = 'foo';
$f = '
function ' . $functionName . '($a) {
var_dump($a);
}
';
// Finger crossed!)))
eval($f);
// Now you have function "foo" in your global scope!)
$functionName('bar');
// It will print
// string(3) "bar"
Но вы должны иметь четкое представление о том, что вы действительно делаете здесь … потому что это действительно сложное место …