標題複製他人php
這兩天遇到一個問題,一個外部類庫的入口文件,聲明瞭一些類庫依賴的php擴展定義的全局變量,全部後續的調用都依賴這些全局變量,若是沒有取到這些變量,就會致使php-fpm子進程掛掉。程序員
咱們本身封裝的客戶端調用類,在方法中去加載這個入口文件,因爲沒有注意到require_once加載的文件,聲明的變量,做用域僅在此函數中,致使第二次調用時,後續的類庫文件都取不到這些變量,而後大量報錯,知道php-fpm子進程直接掛掉。編程
不能使用require的緣由是,入口文件中也有定義類和接口。app
最後解決的辦法是,在第二次之後的調用,咱們本身聲明瞭一下所需的全局變量,問題解決,但不知是否有更好的解決方法。函數
這篇文章給了幫助php-fpm
(很是重要)如何正確理解PHP之include,include_once,require,require_once等包含做用域ui
咱們爲你們總結的PHP include做用域的問題包括:PHP include 變量做用域和函數、類的做用域等方面的問題。但願對你們有所幫助。spa
不少程序員在使用PHP語言進行實際編程時,一般只會關注PHP函數能實現什麼功能,可是都不會去深刻的瞭解這個函數的具體含義及隱含的問題。咱們今天就爲你們介紹PHP include做用域的相關問題。code
注意:本文檔基於include敘述,但也適用於require。這兩種結構除了在如何處理包含失敗以外,其餘徹底同樣:在包含失敗 時,include()產生一個警告並繼續執行,而require()則致使一個致命錯誤。換句話說,若是想在遇到丟失文件時中止處理頁面就用 require(),不然就用include()。接口
PHP include做用域1:變量的做用域
<?php $color = 'green'; $fruit = 'apple'; ?> <?php function foo() { global $color; include 'vars.php'; echo "A $color $fruit"; } foo(); // A green apple echo "A $color $fruit"; // A green ?>
由此例可看出:
(1). 被包含文件的變量的PHP include做用域聽從包含文件所在處的做用域。即在函數裏使用include將其餘文件的變量包含進來,這些變量的做用域爲該函數內。
(2). foo()函數外能打印出$color的值,並無違反(1)的規定。那是由於函數開始已經聲明$color爲global (儘管foo()函數外並無$color變量,此時的$color變量並非vars.php裏面的$color變量,而是一個強制聲明爲「全局」的新 變量,這時它尚未被賦值,當下麪包含進vars.php後,根據(1)的原則,vars.php中的$color變量自動享有函數內的做用域,因此它的 值就是全局變量$color的值)
PHP include做用域2:函數、類的做用域
<?php class ClassB { /** * constructor */ public function __construct() { } /** * destructor */ public function __destruct() { } public function printit() { echo 'print it in ClassB.<br />'; } } function show_func_included() { echo 'show_func_included<br/>'; } ?> <?php function include_class() { include('classb.php'); } include_class(); $objB = new ClassB(); $objB->printit(); // print it in ClassB. show_func_included() // show_func_included ?>
全部在被包含文件中定義的函數和類在被包含後,在包含文件裏都具備全局做用域(至關於把「函數」、「類」的代碼附加到包含文件的頭部)。
結論:
一、被包含文件的變量的PHP include做用域聽從(不改變)包含文件所在處的做用域。
二、全部在被包含文件中定義的函數和類在被包含後,在包含文件裏都具備全局做用域。