PHP初學者核心知識簡介

所有腳本語言都有共通之處,更寬泛的,所有編程語言都有共通的地方,比如變量、函數、類的概念在很多語言裏都有。

對腳本語言來說,變量無類型是一個非常普遍的特點,PHP也是如此。下面列出PHP的語言語法特點,可以供初學者快速查詢和了解這門語言的語法特點。

  1. PHP變量前面必須加一個“$”字符,這給打字造成了很大的麻煩,敲“$”字符遠比一般字母數字麻煩,因爲需要按Shift鍵。但這是PHP這門語言的特點決定的,PHP靈活的嵌入HTML頁面,字符串裏面直接解析變量方式,讓這種約定有內在的道理,我們只需要知道這個規則就可以了。
  2. PHP的變量在全局和局部不能用var聲明,但是在作爲類的成員變量可以,所以在不能使用var聲明變量但是還需要聲明的時候,只能用“$a = null;$b = 0;”這樣的方式來代替聲明。PHP在發明之初可能沒有類的定義,所以語言編寫者認爲聲明沒有必要,但是引進類之後,聲明變量是必須的,所以才引入了“var” 關鍵字,但是僅用於類這個新加的功能(此爲推測)。
    	var $a; //錯誤
    	class A{
    		var $a; //正確
    	}
    	function abc(){
    		var $a;	//錯誤
    		$a = "abc";
    		return $a;
    	}
    
  3. 類的語法: 類裏面的變量聲明時的var好像是必須的, 否則會報語法錯誤, 可以用public, protected或者private指定訪問權限, 而使用了權限限定符號時一定不能用再用var. PHP繼承的關鍵字是extends, 和Java相同, 而不是C++的冒號. PHP類成員變量可以在聲明的時候賦值, 這個確實非常方便, C++咋就不行呢? 非要到構造函數裏面去寫初始化值.
  4. PHP大小寫不敏感,PHP發明人之前是不是用慣了VB?PHP使用大量的內置函數,這側面說明,PHP是應用層面的編程語言,底層還是用C來實現更好。
  5. 和JavaScript相同,PHP用function關鍵字聲明一個函數,對無類型語言來說,不用管返回值的類型,也不用管參數的類型,直接寫變量名就行了。在調用函數的時候,PHP函數可以多傳參數,但是不可以少傳。
    function abc($a){
    	echo $a;
    }
    abc("abc","def");//合法調用
    abc();	//非法調用,語法錯誤。
    PHP不支持函數重載, 也就是不允許名稱相同, 參數不同的函數, 包括類成員函數.
  6. PHP的變量可以分爲2大類,一個是內置的基本類型:數字、字串、數組,另一個是自定義的類變量。前者,包括數組,使用的賦值的時候都是拷貝複製,所以需要考慮效率問題,特別是數組,沒有必要就不要賦給另一個變量。但是還有一點,拷貝只發生在需要對被賦值變量進行寫入更改的時候,如果沒有這種需求,複製並不會引起拷貝操作。這很好理解,就是一種內部的優化機制,比如一個數組,賦值給另一個變量,如果不對被賦值的變量添加刪除更改元素,僅僅是讀取,拷貝就不會發生。對於類變量,全部是引用,所有變量都指向同一個對象,要複製一個類對象使用clone函數。
    $obj1 = clone $obj;
    $obj1將會是$obj的一個副本。可以在定義類的時候指定一個__clone成員函數,克隆操作時將被自動調用。
  7. PHP的變量本質上都是指針, 可能指向一個對象, 也可能什麼都不指向, 這時候它的值就是null. 不同的變量也可以指向同一個對象, 這種情況使用“&”操作符,語法如下:
    	$a = "abc";
    	$b = $a;
    	$b = "def";
    	echo $a; //輸出"abc",因爲$a和$b是獨立的兩個變量,改變$b不會影響到$a.
    	$b = &$a;
    	$b = "def";
    	echo $a; //輸出"def",因爲$a和$b對應同一個變量,改變$b也就改變了$a.
    
    上述情形, 所有對$b的操作, 和對$a執行是一樣的. 唯一的一個特殊操作是unset. unset函數的作用是解除變量綁定的對象, 對$b的unset調用, 僅僅是解除$b對對象的引用, 而$a仍然指向那個對象. 也就是說, 除了unset函數, 其它PHP的操作都是針對變量指向的對象的, 只有這個函數的操作是指向變量本身. unset還有一個作用, 是刪除一個數組的元素. 變量實際上一般涉及兩個部分, 一個是變量本身, 一個是變量指向的對象. 在C語言裏面, 變量本身稱爲指針, 但是大多腳本語言沒有明確指針的概念, 而是讓使用者記住一些規則, 我個人總是傾向於要搞清這些規則的內在實質. 如果我們直接寫一個語句: new A; 這樣就在內存中創建了一個A的實例, 但是因爲沒有對應的變量來指向它, 這個對象永遠無法訪問, 在C語言中, 這種調用會造成內存泄漏, 在自動清理語言中, 這個實例在不確定的時機, 會被自動清除. PHP一般的操作, 實際上都是針對變量指向的內容, 而不是變量本身, 除了取地址操作"&", 把變量指向一個對象, unset函數, 把對象指向置爲空. 實際上還有一個特殊操作, 就是global聲明變量. 

  8. PHP的全局變量在函數內引用的時候, 需要先用global聲明, 否則, 因爲PHP變量無需聲明, 函數內的同名變量將被認爲是一個局部變量.  這一點是很特殊的, 大多數編程語言的全局變量可以在任何地方直接使用. 還有一點,使用global在函數內部引用一個全局變量的時候, 實際操作是創建了一個局部變量, 然後讓這個局部變量指向那個(同名)全局變量的對象, 但它不是那個全局變量.
  9. 高級編程語言一般集成了具有集合功能的對象, 對PHP而言, 這個功能是用數組來做的. 初始化一個數組, 使用" $a = array();", 這樣$a成爲一個元素爲空的數組, 使用count($a)來取得數組的元素個數. PHP的數組下表, 不僅可以是數字, 還可以是字串. 可以用下面的語句初始化一個數組, 並且指定下標:
    $a = array("a"=>"A","b"=>"B","c"=>"C");

    此時訪問$a的元素必須用下面的方式$a["a"], $a["b"]... , 不能再用$a[0], $a[1]...這樣的方式. 如果不指定key(下標), 則數組默認key是0,1,2,.... 比如:
    $a = array("A","B","C");
    echo $a[0] . $a[1] . $a[2];//輸出:ABC 。

    給數組添加元素,直接賦值就可以,比如:
    $a = array();
    $a["a"] = "A";//這樣數組$a就添加了一個元素"A", 訪問的key是"a".
    unset($a["a"]);//元素"A"被移除了.

    可以用foreach遍歷數組:
    $a = array("a"=>"A","b"=>"B","c"=>"C");
    foreach($a as $key=>$value){
    echo $key.":".$value.",";
    }
    //輸出:a:A,b:B,c:C,

    
    如果不需要$key也可以只寫$value:  
    $a = array("a"=>"A","b"=>"B","c"=>"C");
    foreach($a as $value){
    echo $value.",";
    }
    //輸出:A,B,C,

    給數組添加元素的時候必須先初始化變量爲一個數組, 否則調用會出錯. 調用foreach的時候, 數組對象不能爲null, 否則會報錯.
    
    
    
    
    
    
    
    
    
    

  10. class A {
        private $name;
        private $age;
    
        function __construct($name, $age) {
            $this->name=$name;
            $this->age=$age;
        }
        function A($name, $age){
            $this->name=$name."a";
            $this->age=$age."a";
        }
        function __destruct(){
            $this->name = "";
            $this->age = "";
        }
        function __clone() {
            echo "clone called";
        }
        function say() {
            echo "name:".$this->name."<br />";
    	echo "age:".$this->age;
        }
    }
    
    $p1 = new A("張三", 20);
    $p2 = clone $p1;
    $p3 = &$p2;
    $p3->say();
    //輸出:
    //name:張三
    //age:20

    類可以有構造函數和析構函數, 在舊版本里構造函數是類名, 在新版本里, 是__construct函數, 如果類沒有__construct函數, 會把類的同名函數作爲構造函數, 否則這個函數不會調用. 一個類只能有一個構造函數, 因爲PHP不支持函數重載, 調用new實例化類對象的時候, 參數必須和構造函數對應. 析構函數的存在說明PHP可以在確定的時刻銷燬對象, 這和自動垃圾回收機制是不同的. 
    析構的時機: 局部變量在離開作用域(函數體內)的時候, 對象被銷燬, 全局變量在頁面執行完成後銷燬. 還可以顯示的銷燬對象, 把對象的任何一個引用賦值null都會導致對象銷燬; 使用unset解除對對象的引用, 當沒有變量引用一個對象時, 它會被銷燬. 這些銷燬操作都是即時的, 不需要等待垃圾回收運行(PHP根本沒有垃圾回收機制).

    PHP調用exit函數後, 頁面執行將會結束, 但是析構機制保證析構函數仍然能執行. 和Win32調用了ExitPrecess不同, 後者立即終止程序. 但是如果在析構函數內調用了exit, PHP將會立即終止執行. 析構機制的目的需要保證析構函數能夠運行, 所以正常的程序, 不應該使用立即終止程序的方式, 而應該讓所有析構函數都執行完成.
    類的繼承:
    class Named_Cart extends Cart {
        var $owner;
    
        function set_owner ($name) {
            $this->owner = $name;
        }
    }
    

    使用extends關鍵字繼承另一個類. 需要注意的是, PHP的繼承, 父類的構造和析構函數不會自動調用, 需要在子類的構造和析構函數裏顯示調用:
    parent::__construct();parent::__destruct();

    PHP的類還有一些其它有默認行爲的函數, 比如__get, __tostring等等.
  11. 函數參數傳地址調用 PHP和C的函數調用幾乎一樣豐富, 不但有默認的傳值, 還可以有傳地址調用, 語法也和C一樣, 使用&符號. 而且返回值也可以是傳地址, 這時候需要在函數名的前面加&符號, 而且調用的時候, 也需要在函數名前面加上&符號, 否則就是普通調用. 函數返回值此時不能是地址, PHP的語法不允許return後面跟&$var的方式, 就寫return $var就可以了.
    	function &abc(&$a){
    		$a = "def";
    		return $a;
    	}
    	$c = "abc";	//賦值"abc"
    	$b = &abc($c);	//參數是傳址方式,$a也指向$c指向的字串, 所以函數內部$c被賦值成"def" ,按傳址方式返回給$b, 所以$b也指向這個字串.
    	echo $b;	//輸出"def".
    	$b = "abc";	//把$b賦值爲"abc"(目的是檢測$c是否變化).
    	echo $c;	//輸出"abc".
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章