(如果你喜欢一个好的挑战。投票这个问题。)
亲爱的stackoverflow伙伴。我想为钩子/扩展提供一个绝妙的方法。
我在访问类或函数之外的变量引用时遇到问题。
问题:
- 我不想将局部变量转换为全局变量。如果他们是本地的,他们应该留在本地。
- 我不知道钩子开发者想要访问哪些变量,所以我不能将任何选定的变量引用传递给钩子。
- 钩子只能访问嵌套在自身外部的全局变量,这使得在父本地范围内调用钩子毫无价值。
一个静态的虚拟钩子示例(没有任何动态):
<?php
class hook {
function before_process() {
global $couldbeanything;
$couldbeanything = 'hello dummy';
}
}
?>
在全球范围内工作:
<?php
$couldbeanything = 'hello world';
$hook = new hook;
$hook->before_process();
echo $couldbeanything;
?>
不适用于函数(本地范围):
<?php
function foobar() {
$couldbeanything = 'hello world';
$hook = new hook;
$hook->before_process();
echo $couldbeanything;
}
foobar();
?>
我实际上需要在钩子里面这样的东西(如果有这样的东西):
parent $couldbeanything;
或者
outer $couldbeanything;
我能想出的唯一解决方案与 PunBB 使用的相同,eval(php_code_from_an_xml_doc)。它也有缺点。如果不说明您想访问哪些外部引用,您可能会不小心用相同的名称覆盖变量。此外,经过评估的 XML 格式的 PHP 代码调试起来有点俗气。
谁是这里最聪明的人,他的解决方案比 eval() 更好。
也许这些是一些想法的工具:get_defined_vars、extract、pass-by-reference、call_user_func