gpt4 book ai didi

php - 确定调用函数的 namespace

转载 作者:可可西里 更新时间:2023-11-01 12:56:00 26 4
gpt4 key购买 nike

我想知道是否有可能在调用函数时确定当前命名空间是什么。我有这个函数声明:

<?php
namespace Site\Action;
function add ($hook, $function) {
/**
* determine the namespace this was called from because
* __NAMESPACE__ is "site\action" :(
*/
if (is_callable($function))
call_user_func($function);
}
?>

在另一个文件上:

<?php
namespace Foo;
function bar () {
}
?>

假设我将此作为程序代码:

<?php
namespace Foo;
Site\Action\add('hookname', 'bar');
?>

在这种情况下,假设 Bar 旨在解析为 Foo\bar 是有意义的,因为这是调用它的命名空间。

又是一个很长的解释,是否可以确定从中调用 Site\Action\add() 的事件命名空间?

提前致谢。

最佳答案

您要找的是:ReflectionFunctionAbstract::getNamespaceName

如果你想知道你来自哪里debug_backtrace()是你的 friend 。

以下应该可以解决您的难题:

function backtrace_namespace() 
{
$trace = array();
$functions = array_map(
function ($v) {
return $v['function'];
},
debug_backtrace()
);
foreach ($functions as $func) {
$f = new ReflectionFunction($func);
$trace[] = array(
'function' => $func,
'namespace' => $f->getNamespaceName()
);
}
return $trace;
}

只需从任何地方调用它即可查看回溯。我修改了你的“程序”代码文件如下:

namespace Foo;

function bar ()
{
var_export(backtrace_namespace());
}

/** The unasked question: We need to use the fully qualified name currently. */
function go()
{
\Site\Action\add('hookname', 'Foo\\bar');
}

go();

包含此文件的结果将在标准输出中显示如下:

array (
0 =>
array (
'function' => 'backtrace_namespace',
'namespace' => '',
),
1 =>
array (
'function' => 'Foo\\bar',
'namespace' => 'Foo',
),
2 =>
array (
'function' => 'call_user_func',
'namespace' => '',
),
3 =>
array (
'function' => 'Site\\Action\\add',
'namespace' => 'Site\\Action',
),
4 =>
array (
'function' => 'Foo\\go',
'namespace' => 'Foo',
),
)

现在为了加分,回答隐藏问题:

如何解析调用命名空间以避免使用完全限定的函数名称作为参数?

以下将允许您按预期调用该函数:

 Site\Action\add('hookname', 'bar');

没有得到可怕的:

Warning: call_user_func() expects parameter 1 to be a valid callback, function 'bar' not found or invalid function name

因此,在您重新设计之前,请试一试尺寸:

namespace Site\Action;

function add($hook, $function)
{
$trace = backtrace_namespace();
$prev = (object) end($trace);

$function = "$prev->namespace\\$function";

if (is_callable($function))
call_user_func($function);
}

我看不出为什么不应该使用 debug_backtrace,这就是它的用途。

nJoy!

关于php - 确定调用函数的 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8518842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com