5

我是 php 新手。我开始了解 php 中的 register_shutdown_function()。我在 php.net 手册中读到了这个函数,当脚本完成执行时这个函数调用。但我有一个问题

如果我把这个函数放在命名空间中怎么办

 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_shutdown_function() 和 myHandler() 都在同一个命名空间中?

如果我把这个命名空间放在不同的文件中并且我包含那个文件但是我不会使用这个命名空间'MyNamespace'那么它会执行吗?

4

2 回答 2

6

其实,register_shutdown_function()与此无关。它是关于 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;
}

-ie 你必须用它的完整路径限定你的回调才能在字符串回调中使用它。那是因为如果您将回调指定为字符串,它就会变得像全局上下文(即与当前命名空间上下文不再相关) - 因为字符串本身不包含对当前命名空间范围的任何引用,它只是一个字符串,仅此而已。

于 2013-10-10T13:49:30.787 回答
1

可能在所有对象都被解构后调用了关闭函数,您尝试过吗:

可能下面的代码对您有帮助...

<?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');
?>
于 2013-10-10T13:45:20.133 回答