鍍金池/ 問(wèn)答/PHP/ 用composer引入一個(gè)函數(shù)文件后,方法可以執(zhí)行,為什么變量獲取不到?

用composer引入一個(gè)函數(shù)文件后,方法可以執(zhí)行,為什么變量獲取不到?

用composer引入一個(gè)函數(shù)文件后,方法可以執(zhí)行,為什么變量獲取不到?

回答
編輯回答
久舊酒

方法可以執(zhí)行 是因?yàn)閏lass類被自動(dòng)加載(spl_regists_autoload() __autoload() )進(jìn)來(lái)了

但是變量或者常量,先引入包含,才能使用。

2017年5月11日 13:23
編輯回答
雨蝶
自動(dòng)加載是在new SomeClass時(shí),當(dāng)前文件搜索不到該類,觸發(fā)spl_autoload_register函數(shù)進(jìn)行自動(dòng)加載
如果沒(méi)有new SomeClass時(shí),此時(shí)目標(biāo)文件是沒(méi)有被require進(jìn)來(lái)的,所以當(dāng)前文件訪問(wèn)不到目標(biāo)文件中的變量
自動(dòng)加載是對(duì)于類添加的引入機(jī)制,全局變量可寫(xiě)在單獨(dú)的配置文件中,然后在項(xiàng)目的引導(dǎo)(入口)文件中引入全局配置文件

----------------更新----------------------------

看了下composer的autoload源碼
mylaravel/vendor/composer/autoload_real.php
composer.json中的files是在
function composerRequire425b24fc62bbc5c7498e25c716f58d88($fileIdentifier, $file)
{
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        require $file;

        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
    }
}
這個(gè)函數(shù)中引入的,在函數(shù)內(nèi)引入的文件的作用域是局部的,函數(shù)執(zhí)行完畢局部變量就被釋放了,變量訪問(wèn)的時(shí)候是全局的,而引入的文件中的函數(shù)已經(jīng)注冊(cè)到全局函數(shù)表中,因此函數(shù)可以正常訪問(wèn)
在引入的文件中使用$GLOBALS將變量注冊(cè)到全局變量表中,因此可在函數(shù)外部訪問(wèn)
2017年5月28日 17:51