Зарегистрируйте / создайте названную функцию программно в переполнении стека

Можно ли программно зарегистрировать / создать именованную функцию в PHP внутри глобальной области видимости?

Это возможно с create_function (до PHP 7+) и в настоящее время это возможно с помощью анонимных / лямбда-функций, но опять же вы либо позволяете им вызываться, либо присваиваете их переменной или свойству объекта, а затем просто вызываете их с помощью () в конце.

Что меня интересует, если так или иначе возможно добавить новую именованную функцию в область, которая не должна быть назначена переменной и доступна с помощью $functionName?

Некоторое решение, которое я ищу:

create_named_function('fullname', function($firstname, $lastname) {
return $firstname . ' ' . $lastname;
});

Тогда я бы сделал это доступным, как fullname(params...),

2

Решение

Не уверен, стоит ли поощрять это делать — он останавливает все виды полезных вещей, способных проверять код и завершение кода в 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, которая позволяет включать переменные без их замены). Это может быть любая форма генерации кода.

1

Другие решения

Вот пример с 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"

Но вы должны иметь четкое представление о том, что вы действительно делаете здесь … потому что это действительно сложное место …

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector