[php]请问当存在命名空间的时候, function_exists 是如何工作的?

学习命名空间的时候,遇到了坑,就是其中有些方法定义了却找不到
没有命名空间的时候

<?phpclass A {    function index () {        function asd (){}
        var_dump(function_exists('asd'));
    }
}class Test extends A {    function doLogin () {        function bbb () {}
        var_dump(function_exists('bbb'));
    }
}

$test = new Test();
$test->index();   // bool(true)$test->doLogin(); // bool(true)

有命名空间的时候

<?phpnamespace Core;class A {    function index () {        function asd (){}
        var_dump(function_exists('asd'));
    }
}namespace App;use Core\A;class Test extends A {    function doLogin () {        function bbb () {}
        var_dump(function_exists('bbb'));
    }
}

$test = new Test();
$test->index();    // bool(false)$test->doLogin();  // bool(false)

请问为什么呢,怎么在有命名空间的时候得到 bool(true) 呢?


慕无忌1623718
浏览 1231回答 3
3回答

炎炎设计

没有命名空间时,函数是注册到全局函数表中,有命名空间后,命名空间下的函数带有命名空间注册到全局函数表中function_exists("funname");是去全局函数表中查找函数是否存在有命名空间的情况下,在函数名称前加上命名空间即可var_dump(function_exists('\Core\asd'));//bool(true) var_dump(function_exists('\App\bbb'));//bool(true)

qq_花开花谢_0

var_dump(function_exists('Core\asd'));

茅侃侃

这么有缘,我也叫小白&nbsp;第一次为什么全是true,原因是在同一个空间下,当然可以相互读取到函数或者方法但是第二次为什么不行呢 首先你给A类命名空间是Core,那么function asd()当然也属于这个命名空间了,但是你还是用以前的方法去读取他,怎么可能读取到呢 ,正确的判断方法是var_dump(function_exists('\Core\asd'));下面那个同理
打开App,查看更多内容
随时随地看视频慕课网APP