標籤:生命週期 iter 屬性 共用 構造 返回 編譯 struct 絕對路徑
PHP 魔術變數
PHP 向它啟動並執行任何指令碼提供了大量的預定義常量。
不過很多常量都是由不同的擴充庫定義的,只有在載入了這些擴充庫時才會出現,或者動態載入後,或者在編譯時間已經包括進去了。
有八個魔術常量它們的值隨著它們在代碼中的位置改變而改變。
例如 __LINE__ 的值就依賴於它在指令碼中所處的行來決定。這些特殊的常量不區分大小寫,如下:
__LINE__
檔案中的當前行號。
__FILE__
檔案的完整路徑和檔案名稱。如果用在被包含檔案中,則返回被包含的檔案名稱。
自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑(如果是符號串連,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
__DIR__
檔案所在的目錄。如果用在被包括檔案中,則返回被包括的檔案所在的目錄。
它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。(PHP 5.3.0中新增)
__FUNCTION__
函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。
__CLASS__
類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。
在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用地區(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 對 trait 也起作用。當用在 trait 方法中時,__CLASS__ 是調用 trait 方法的類的名字。
__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 實現了代碼複用的一個方法,稱為 traits。
Trait 名包括其被聲明的作用地區(例如 Foo\Bar)。
從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
__METHOD__
類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
__NAMESPACE__
當前命名空間的名稱(區分大小寫)。此常量是在編譯時間定義的(PHP 5.3.0 新增)
PHP 命名空間(namespace)
PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和Java,那命名空間就不算什麼新事物。 不過在PHP當中還是有著相當重要的意義。
PHP 命名空間可以解決以下兩類問題:
- 使用者編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字衝突。
- 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性
- 定義命名空間
預設情況下,所有常量、類和函數名都放在全域空間下,就和PHP支援命名空間之前一樣。
命名空間通過關鍵字namespace 來聲明。如果一個檔案中包含命名空間,它必須在其它所有代碼之前聲明命名空間。
- 子命名空間
與目錄和檔案的關係很象,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義:
- 命名空間使用
PHP 命名空間中的類名可以通過三種方式引用:
非限定名稱,或不包含首碼的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。 警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全域函數名稱或常量名稱。
限定名稱,或包含首碼的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,foo 會被解析為subnamespace\foo。
完全限定名稱,或包含了全域首碼操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo。
- namespace關鍵字和__NAMESPACE__常量
PHP支援兩種抽象的訪問當前命名空間內部元素的方法,__NAMESPACE__ 魔術常量和namespace關鍵字。
常量__NAMESPACE__的值是包含當前命名空間名稱的字串。在全域的,不包括在任何命名空間中的代碼,它包含一個空的字串。
__NAMESPACE__ 樣本, 在命名空間中的代
用命名空間:別名/匯入PHP 命名空間支援 有兩種使用別名或匯入方式:為類名稱使用別名,或為命名空間名稱使用別名。注意PHP不支援匯入函數或常量。
在PHP中,別名是通過操作符 use 來實現的. 下面是一個使用所有可能的三種匯入方式的例子:
名稱解析遵循下列規則:
- 對完全限定名稱的函數,類和常量的調用在編譯時間解析。例如 new \A\B 解析為類 A\B。
- 所有的非限定名稱和限定名稱(非完全限定名稱)根據當前的匯入規則在編譯時間進行轉換。例如,如果命名空間 A\B\C 被匯入為 C,那麼對 C\D\e() 的調用就會被轉換為 A\B\C\D\e()。
- 在命名空間內部,所有的沒有根據匯入規則轉換的限定名稱均會在其前面加上當前的命名空間名稱。例如,在命名空間A\B 內部調用 C\D\e(),則 C\D\e() 會被轉換為 A\B\C\D\e() 。
- 非限定類名根據當前的匯入規則在編譯時間轉換(用全名代替短的匯入名稱)。例如,如果命名空間 A\B\C 匯入為C,則new C() 被轉換為 new A\B\C() 。
- 在命名空間內部(例如A\B),對非限定名稱的函數調用是在運行時解析的。例如對函數 foo() 的調用是這樣解析的:
- 在當前命名空間中尋找名為 A\B\foo() 的函數
- 嘗試尋找並調用 全域(global) 空間中的函數 foo()。
- 在命名空間(例如A\B)內部對非限定名稱或限定名稱類(非完全限定名稱)的調用是在運行時解析的。下面是調用 new C() 及 new D\E() 的解析過程: new C()的解析:
- 在當前命名空間中尋找A\B\C類。
- 嘗試自動裝載類A\B\C。
new D\E()的解析:
- 在類名稱前面加上當前命名空間名稱變成:A\B\D\E,然後尋找該類。
- 嘗試自動裝載類 A\B\D\E。
為了引用全域命名空間中的全域類,必須使用完全限定名稱 new \C()。
- 物件導向內容
類 ? 定義了一件事物的抽象特點。類的定義包含了資料的形式以及對資料的操作。
對象 ? 是類的執行個體。
成員變數 ? 定義在類內部的變數。該變數的值對外是不可見的,但是可以通過成員函數訪問,在類被執行個體化為對象後,該變數即可稱為對象的屬性。
成員函數 ? 定義在類的內部,可用於訪問對象的資料。
繼承 ? 繼承性是子類自動共用父類資料結構和方法的機制,這是類之間的一種關係。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並加入若干新的內容。
父類 ? 一個類被其他類繼承,可將該類稱為父類,或基類,或超類。
子類 ? 一個類繼承其他類稱為子類,也可稱為衍生類別。
多態 ? 多態性是指相同的操作或函數、過程可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一訊息可以產生不同的結果,這種現象稱為多態性。
重載 ? 簡單說,就是函數或者方法有同樣的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者方法。
抽象性 ? 抽象性是指將具有一致的資料結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。
封裝 ? 封裝是指將現實世界中存在的某個客體的屬性與行為綁定在一起,並放置在一個邏輯單元內。
建構函式 ? 主要用來在建立對象時初始化對象, 即為對象成員變數賦初始值,總與new運算子一起使用在建立對象的語句中。
解構函式 ? 解構函式(destructor) 與建構函式相反,當對象結束其生命週期時(例如對象所在的函數已調用完畢),系統自動執行解構函式。解構函式往往用來做"清理善後" 的工作(例如在建立對象時用new開闢了一片記憶體空間,應在退出前在解構函式中用delete釋放)。
- 介面
使用介面(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。
介面是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。
介面中定義的所有方法都必須是公有,這是介面的特性。
要實現一個介面,使用 implements 操作符。類中必須實現介面中定義的所有方法,否則會報一個致命錯誤。類可以實現多個介面,用逗號來分隔多個介面的名稱。
- 抽象類別
任何一個類,如果它裡面至少有一個方法是被聲明為抽象的,那麼這個類就必須被聲明為抽象的。
定義為抽象的類不能被執行個體化。
被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現。
繼承一個抽象類別的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的存取控制必須和父類中一樣(或者更為寬鬆)。例如某個抽象方法被聲明為受保護的,那麼子類中實現的方法就應該聲明為受保護的或者公有的,而不能定義為私人的。此外方法的調用方式必須匹配,即類型和所需參數數量必須一致。例如,子類定義了一個選擇性參數,而父類抽象方法的聲明裡沒有,則兩者的聲明並無衝突。
- Static 關鍵字
聲明類屬性或方法為 static(靜態),就可以不執行個體化類而直接存取。
靜態屬性不能通過一個類已執行個體化的對象來訪問(但靜態方法可以)。
由於靜態方法不需要通過對象即可調用,所以偽變數 $this 在靜態方法中不可用。
靜態屬性不可以由對象通過 -> 操作符來訪問。
自 PHP 5.3.0 起,可以用一個變數來動態調用類。但該變數的值不能為關鍵字 self,parent 或 static。
- Final 關鍵字
PHP 5 新增了一個 final 關鍵字。如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承。
- 調用父類構造方法
PHP 不會在子類的構造方法中自動的調用父類的構造方法。要執行父類的構造方法,需要在子類的構造方法中調用parent::__construct() 。
PHP 學習隨筆 (轉)