1. 程式人生 > >PHP學習總結(一)

PHP學習總結(一)

    PHP是一門弱型別的語言,和之前學習的C/C++相比還是有很大的出入,不過就像老師常說的程式設計思想都是相通的。

這裡主要想總結下過去兩週學習PHP遇到的各種陷阱,歡迎拍磚~

    一、基礎概念

    a.在PHP中函式名、類名、系統關鍵字都對大小寫不敏感,而自定義變數名是對大小寫敏感的。

    b.弱型別語言的一個表現就是在定義變數的時候不需要指定變數型別,變數會在首次賦值的時候建立,PHP根據變數的值確定變數的型別

    c.作用域問題:

        1、PHP全域性變數預設在區域性函式不可見,這和C/C++是完全兩碼事。區域性函式使用全域性變數必須global宣告。或者通過放置全域性變數的超全域性陣列訪問變數:

<?php 

$val = "global";
function func1()
{
	$val = "I am func1";
}
function func2()
{
	global $val;
	$val = "I am func2";
}
function func3()
{
	$GLOBALS['val']="I am func3";
}

func1();
//輸出global
echo $val."\n";

func2();
//輸出"I am func2"
echo $val."\n";

func3();
//輸出"I am func3"
echo $val."\n";
        2.靜態變數和C/C++大體類似,在函式內匯入全域性變數相當於建立了一個全域性變數的引用,但是要注意的是再函式內部引入全域性變數並對其賦值為一個引用是無效的。

    d.檔案包含

        PHP提供了四個檔案包含相關的操作:require/require_once/include/include_once。區別如下

        1.require/require_once在檔案不存在的時候指令碼錯誤停止執行,include/include_once在被包含指令碼不存在的時候提示一個錯誤並繼續執行

        2.require_once/include_once只有在檔案沒有被包含的情況下才包含它,這樣做可以防止類和方法的重定義。

        3.開發過程中require_once運用的相對比較多一些

    e.檔案查詢

       PHP可以使用require/inclue包含相對路徑下的檔案,解析器在指定路徑下沒有找到檔案的情況下會去include_path路徑下去找,可以通過php.ini檔案來配置。或者呼叫set_include_path(get_include_path(), ":/home/xxx"),新增一個路徑。當然這隻對當前執行有效。

    二、資料獲取

        HTTP協議 HTTP協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中 POST 一般用來向服務端提交資料,其中 POST 一般用來向服務端提交資料, PHP內建全域性陣列$_POST是通過 HTTP POST傳遞到當前指令碼的變數陣列。$_GET 是通過 URL 引數傳遞到當前指令碼的變數陣列。

        通過GET方法傳送的訊息全部人都可見,資訊量也有限制,2000個字元。POST傳遞資訊其他人不可見,POST還可以支援高階功能如:multi part二進位制傳輸等。總的來說還是POST用的比較多。

   三、引數檢測

        引數檢測當然是進入函式模組執行的第一步,PHP提供了豐富的引數檢測函式,陷阱也是很多。

    1.基本型別檢測

       獲取/設定型別:gettype/settype, 傳入變數的同時需要傳入型別對應的字串標示,不過官方不推薦這組函式。

       is_xxx:判斷變數是否為某型別

       defined() - 檢查某個名稱的常量是否存在

    2.陣列相關型別檢測

       PHP陣列鍵限定為integer/string型別,其實PHP並不區分索引陣列和關聯陣列,可以認為索引陣列的鍵就是索引。

      檢測鍵是否存在:array_key_exists();(還可用於檢測物件屬性是否存在)

      檢測值是否存在:in_array();

      在使用陣列的過程中需要注意的是:如果對給出的值沒有指定鍵名,則取當前最大的整數索引值,而新的鍵名將是該值加一。如果指定的鍵名已經有了值,則該值會被覆蓋。對於可以轉換為整數的字串會被轉換為整數鍵。要修改某個值,通過其鍵名給該單元賦一個新值。要刪除某鍵值對,對其呼叫 unset() 函式。

     在對陣列排序過程中,對於非數字索引的陣列才ksort/asort/uksort/uasort才會有效;

     each — 返回陣列中當前的鍵/值對並將陣列指標向前移動一步 。
     next/...等函式返回的是陣列值。

     我們常定義一個空陣列在需要的時候對其新增引數:

$arr = array()
if(xxx)
{
$arr[] = $elem;
}
else
{
.....
}
	  

    3.類相關的檢測

     判斷屬性是否存在:property_exists(),

     判斷方法是否存在:method_exists(),

     判斷物件是否是某一類的例項:( $obj) instanceof (class name)

     獲取物件類名:get_class($obj)

     判斷類是否存在:class_exists()

     獲取物件的方法:get_class_methods(class_name, $obj)。(只有public會顯示出來)。

    檢測方法是否存在:
    a.in_array($method, get_class_methods(xx))
    b.is_callable()(判斷是否可以呼叫)
    c.method_exists()(對於private/public/protected的方法都返回true)

     值得一提的是,PHP提供了一套攔截器,在訪問物件不存在的屬性或方法的時候攔截器自動被促發。__get/__set/__call/__isset/__unset

     幾個函式的實現大致如下:

class test
{
    function __get($property)
    {
        $method = "get$property";
        if(method_exists($this, $method))
        {
            return $this->$method();
        }
    }
    function __set($property, $value)
    {
        $method= "set$property";
        if(method_exists($this, $method))
        {
            return $this->$method($value);
        }
    }
    由於客戶訪問的屬性不存在或者不對外開放,所以嘗試查詢對應的方法來完成相關操作。
    4.isset和empty的區別聯絡:

       a.ISSET為false的情況有:1.定義一個變數沒有給他賦值、2.把變數設定為null、3對變數執行了unset操作.

       b.empty為true的清空有:1.變數值為0、2.空字串、3.“0”/0、4.null

    四、其他

      1、PHP 5 引入了解構函式的概念,這類似於其它面向物件的語言,如 C++。解構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷燬時執行。unset操作一個物件時相當於解除一個引用(引用計數器減一)

      2、父類的構造/解構函式不會被引擎暗中呼叫。要執行父類的構造/解構函式,必須在子類的解構函式體中顯式呼叫 parent::__destruct()。此外也和建構函式一樣,子類如果自己沒有定義解構函式則會繼承父類。派生類沒有建構函式,例項化物件的時候會預設呼叫父類的建構函式。

3、常量屬性只包含基本資料型別-不需要美元符號,只能通過類訪問,而不是物件。(這點和C++一樣)

      4、static延遲靜態繫結:static指的是被呼叫的類而不是被包含的類。(適合在工廠方法構建不同派生物件的時候使用)。

      5、PHP只支援單一繼承(extends),但是同時可以繼承多個介面(implements),同時出現的時候extends必須在前。

      6、self關鍵字只查詢本類,parent關鍵字只查詢父類,static關鍵字先查詢本類再查詢父類(延遲靜態繫結)。