Register/create PHP 中以编程方式命名的函数
Register/create a named function programatically in PHP
是否可以在全局范围内以编程方式 register/create PHP 中的命名函数?
这可以通过 create_function
(在 PHP 7+ 之前)实现,现在可以通过 anonymous/lambda 函数实现,但是您要么让它们被调用,要么将它们分配给变量或对象 属性,然后只需在最后用 ()
调用它们。
如果有可能在一个范围内添加一个新的命名函数,而不必分配给变量并使用 $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"
但是你必须有清晰的视野,你到底在这里做什么...因为这是一个非常棘手的地方...
是否可以在全局范围内以编程方式 register/create PHP 中的命名函数?
这可以通过 create_function
(在 PHP 7+ 之前)实现,现在可以通过 anonymous/lambda 函数实现,但是您要么让它们被调用,要么将它们分配给变量或对象 属性,然后只需在最后用 ()
调用它们。
如果有可能在一个范围内添加一个新的命名函数,而不必分配给变量并使用 $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"
但是你必须有清晰的视野,你到底在这里做什么...因为这是一个非常棘手的地方...