(很是重要)如何正確理解PHP之include,require等包含做用域

標題複製他人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做用域聽從(不改變)包含文件所在處的做用域。

二、全部在被包含文件中定義的函數和類在被包含後,在包含文件裏都具備全局做用域。

相關文章
相關標籤/搜索