注册函数()php
我是php新手。我开始了解php中的register\u shutdown\u function()。我在php.net手册中读到过这个函数,当脚本完成执行时,这个函数调用。但是我有一个问题 如果我把这个函数放在命名空间中,比如注册函数()php,php,Php,我是php新手。我开始了解php中的register\u shutdown\u function()。我在php.net手册中读到过这个函数,当脚本完成执行时,这个函数调用。但是我有一个问题 如果我把这个函数放在命名空间中,比如 namespace MyNamespace; register_shutdown_function("myHandler"); // this throws an error because it can't find function function myH
namespace MyNamespace;
register_shutdown_function("myHandler"); // this throws an error because it can't find function
function myHandler()
{
// Some Code.
}
namespace MyNamespace;
register_shutdown_function("MyNamespace\myHandler"); // this throws no error.
function myHandler()
{
// Some Code.
}
为什么会发生这种情况?register\u shutdown\u function()和myHandler()都在同一命名空间中
如果我将此名称空间放在不同的文件中,并包含该文件,但我不会使用此名称空间“MyNamespace”,那么它是否会执行?在解构所有对象后,可能会调用关闭函数,您是否尝试过: 下面的代码可能对你有帮助
<?php
function shutdown()
{
// This is our shutdown function, in
// here we can do any last operations
// before the script is complete.
echo 'Script executed with success', PHP_EOL;
}
register_shutdown_function('shutdown');
?>
实际上,
寄存器关闭函数()
与此无关。它是关于PHP如何解析字符串回调的。请参见此示例:
namespace MyNamespace;
$data = ['foo', 'bar'];
$data = array_filter($data, 'myHandler'); //warning, while 'MyNamespace\myHandler' is ok
register_shutdown_function("MyNamespace\myHandler");
function myHandler()
{
return 1;
}
-i、 e.您必须使用回调的完整路径来限定回调,以使用该内部字符串回调。这是因为,如果将回调指定为字符串,它将变得类似于全局上下文(即不再与当前命名空间上下文相关)-因为字符串本身不包含对当前命名空间范围的任何引用,它只是一个字符串,仅此而已。您遇到了什么错误
//这不会引发错误。
?你的代码是一个文件还是两个文件?如果是2,它应该可以工作。它向我显示此错误“警告:注册\关闭\函数():在第6行的/var/www/workspace/6thAssignment/include/test.php中传递了无效的关机回调'ErrorHandlerHelper::errorHandler',我尝试了放入相同的文件和不同的文件,结果相同,但我不明白为什么会这样。只有在未传递可调用函数时才会出现此错误。请参阅并感谢您的帮助我已经在php.net手册中阅读了这个示例,但它并没有帮助。是的,我得到了您的结论,但我的问题是,如果register_shutdown_function()和myHandler()都在同一名称空间中,那么为什么它会要求“myHandler()”的完整路径?@SohilDesai我已经提到过这一点。字符串回调仍然是一个简单的字符串,它不能包含对当前上下文的任何引用。字符串只是一个字符串,仅此而已——这就是为什么必须在其中指定完整路径的原因。