鍍金池/ 問答/PHP  網(wǎng)絡(luò)安全/ [php]請問當(dāng)存在命名空間的時(shí)候, function_exists 是如何工作

[php]請問當(dāng)存在命名空間的時(shí)候, function_exists 是如何工作的?

學(xué)習(xí)命名空間的時(shí)候,遇到了坑,就是其中有些方法定義了卻找不到
沒有命名空間的時(shí)候

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

有命名空間的時(shí)候

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

請問為什么呢,怎么在有命名空間的時(shí)候得到 bool(true) 呢?

回答
編輯回答
忘了我

沒有命名空間時(shí),函數(shù)是注冊到全局函數(shù)表中,有命名空間后,命名空間下的函數(shù)帶有命名空間注冊到全局函數(shù)表中
function_exists("funname");是去全局函數(shù)表中查找函數(shù)是否存在
有命名空間的情況下,在函數(shù)名稱前加上命名空間即可

var_dump(function_exists('\Core\asd'));//bool(true)
var_dump(function_exists('\App\bbb'));//bool(true)
2017年11月12日 03:48
編輯回答
老梗

這么有緣,我也叫小白
第一次為什么全是true,原因是在同一個(gè)空間下,當(dāng)然可以相互讀取到函數(shù)或者方法

但是第二次為什么不行呢 首先你給A類命名空間是Core,那么function asd()當(dāng)然也屬于這個(gè)命名空間了,但是你還是用以前的方法去讀取他,怎么可能讀取到呢 ,正確的判斷方法是
var_dump(function_exists('\Core\asd'));
下面那個(gè)同理

2018年3月13日 21:23
編輯回答
心夠野
var_dump(function_exists('Core\asd'));
2018年3月29日 20:18