程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php全局變量和類配合使用全解析

php全局變量和類配合使用全解析

編輯:關於PHP編程

情況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 這個匿名的lambda 函數去執行。如下圖:


 

 

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 會被當成局部變量也引用不到的。。。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved