情況1:
father.php如下定義:
複製代碼 代碼如下:
<?php
$jack = 1000;
?>
children.php 如下定義:
<?php
require("father.php");
$jack=123;
echo $jack."/n";
?>
php children.php
運行輸出為123.
如果將$jack=123注釋掉,運行為1000,如果將$jack=123放到require("father.php");之前,運行結果為1000.
比較好理解:php解釋執行,解釋到哪,執行到哪。。像$jack這種屬於全域變數,如第一種情況的初始用它的時候是1000,是在require
的時候運行得到的,結果又被改成了123,所以運行結果輸出123.
情況2:
children.php代碼改為如下:
複製代碼 代碼如下:
<?php
require("father.php");
function testJack(){
if(!isset($jack)){
echo '$jack is null'."/n";
}
}//testJack
testJack();
?>
php children.php
運行結果為:$jack is null.也就是說在testJack()中引用的$jack是一個局部變數。
如果使用global關鍵字,聲明這個$jack是一個全域變數,代碼改為如下:
複製代碼 代碼如下:
<?php
require("father.php");
function testJack(){
global $jack;
if(!isset($jack)){
echo '$jack is null'."/n";
}else{
echo '$jack is not null'."/n";
}
}//testJack
testJack();
?>
則運行結果為$jack is not null!
情況3:
children.php代碼如下:
複製代碼 代碼如下:
<?php
require("father.php");
class JackTest{
public function testJack(){
if(!isset($jack)){
echo '$jack is null'."/n";
}else{
echo '$jack is not null'."/n";
}
}//testJack
}
$jackTest = new JackTest();
$jackTest->testJack();
?>
運行結果輸出:$jack is null
這是因為class中的這個函數的$jack這是一個局部變數啊。
如果在function testJack開頭加 global $jack;那麼就輸出$jack is not null了。
比較容易理解。
情況4:
把檔案名稱當做參數動態載入,代碼如下:
複製代碼 代碼如下:
<?php
$casefile = $_SERVER['argv'][1];
echo $casefile."/n";
require($casefile);
echo $jack."/n";
?>
運行php children.php father.php
結果如下:
father.php
1000
也就是說我們動態載入程式運行成功了。。
情況5:
要把動態載入和類的定義結合起來:
目錄關係式這樣的:
|- c.php
|- Bfold - b.php
|- Afold - a.class.php (裡面的函數引用了../Bfold/b.php )
也就是說 在c.php 中new 了class a.class ,而a.class.php 的一個函數中require 了Bfold 檔案夾下的b.php ,這個require(../Bfold/b.php )報錯,Warning: ……
因為你讓伺服器當前執行的是c.php 檔案,所以php 解析的時候是把路徑相對於c.php 而言的,你試試把(../Bfold/b.php )改成(Bfold/b.php )看看,應該就不會報錯了。
下面是程式例子,說明在函數內部使用require_once (A.php ).
對require_once 的理解:
假設B.php 中引用了require_once(A.php); 這條語句。。
那麼其實是相當於調用了A.php 這個匿名的匿名函式去執行。如下圖:
C.php 在一個函數調用中 require 了 B.php------》
B.php 在普通語句中 require 了 A.php--------》
A.php
現在我們調用 php B.php ;因為 B.php 在普通語句中使用了 require 調用了 A.php ,那麼 A.php 會把它的相對 A 來說是全域變數的變數,註冊到 B.php 的環境中。因為 B.php 是根開始調用檔案,他的運行環境就是全域環境。所以A.php 檔案中的變數在 B.php 可以被正常使用。
現在我們調用 php C.php ;那麼 C 是在函數使用 require 調用了 B.php 的,然後 B 又調用了 A ,感覺在這個調用的過程中,相對 B 和 A 根運行環境是 C 的調用函數的環境 ,但 C 的調用函數如果要使用 B 和 A 中的變數,就沒有辦法了。
如果用 global $a, 去引用,那麼由於 $a 在這種情況下不屬於全域變數,引用不到。
如果用 $a 去引用,那麼由於 $a 會被當成局部變數也引用不到的。