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

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

<?php
class 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)

有命名空间的时候

<?php
namespace 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) 呢?

阅读 2.6k
3 个回答

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

var_dump(function_exists('\Core\asd'));//bool(true)
var_dump(function_exists('\App\bbb'));//bool(true)
var_dump(function_exists('Core\asd'));

这么有缘,我也叫小白
第一次为什么全是true,原因是在同一个空间下,当然可以相互读取到函数或者方法

但是第二次为什么不行呢 首先你给A类命名空间是Core,那么function asd()当然也属于这个命名空间了,但是你还是用以前的方法去读取他,怎么可能读取到呢 ,正确的判断方法是
var_dump(function_exists('\Core\asd'));
下面那个同理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题