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

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

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

回答
編輯回答
久舊酒

方法可以執(zhí)行 是因為class類被自動加載(spl_regists_autoload() __autoload() )進來了

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

2017年5月11日 13:23
編輯回答
雨蝶
自動加載是在new SomeClass時,當前文件搜索不到該類,觸發(fā)spl_autoload_register函數(shù)進行自動加載
如果沒有new SomeClass時,此時目標文件是沒有被require進來的,所以當前文件訪問不到目標文件中的變量
自動加載是對于類添加的引入機制,全局變量可寫在單獨的配置文件中,然后在項目的引導(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;
    }
}
這個函數(shù)中引入的,在函數(shù)內(nèi)引入的文件的作用域是局部的,函數(shù)執(zhí)行完畢局部變量就被釋放了,變量訪問的時候是全局的,而引入的文件中的函數(shù)已經(jīng)注冊到全局函數(shù)表中,因此函數(shù)可以正常訪問
在引入的文件中使用$GLOBALS將變量注冊到全局變量表中,因此可在函數(shù)外部訪問
2017年5月28日 17:51