前言
最近在系統的學習 PHP ,參考的資料是《PHP程式設計》+ 官方文件(如果你有好的學習資料,歡迎推薦給我)。雖然這本《PHP程式設計》是基於 PHP5 的,但我筆記裡的程式碼,全部在 PHP 7.2 的環境裡測試過,是能夠執行的。另,本筆記中只記錄我模糊不清的知識。
宣告一個類
語法如下:
class classname[ extends baseclass [ implements interfacename, [ interfacename, ...] ] ]
{
[ use traitname, [traitname, ...]];
[ visiblity $property[ = value]; ...]
[ function functionname (args) ]{
//code
}
}
PHP 中的面對物件和 Java 中的面對物件用法基本相似。只是用法更隨意。
比如:它可以用一個變數來提供類名:
$class = "Person";
$object = new $class;
// 等同於
$object = new Person;
靜態方法通過類來呼叫,而不是通過物件呼叫。靜態方法由類名加兩個冒號(::
)和函式名構成。另:在靜態方法內部,$this
會失效。
HTML::p("Hello, world");
物件一旦被建立,就會通過引用傳遞。要像得到一個物件的副本,可以使用 clone
操作符。
$f = new Person("Fred", 35);
$b = clone $f;
用 final
關鍵字來宣告一個類/方法,子類將無法重寫這個類/方法。
在一個物件類的例項中,可以用 self
關鍵字來呼叫屬性或方法。
宣告屬性
在 PHP 中,你可以任何位置增加新的屬性。
class Person
{
function getName(){
return $this->name;
}
function setName($newName){
$this->name = $newName;
}
}
$person = new Person;
$person->setName("plane");
echo $person->getName(); // plane
宣告類常量
使用 const
關鍵詞來宣告常量。一旦定義了一個類常量,他的值就不能在改變。
繼承
如果一個子類與它的父類具有相同名稱的屬性或方法,則子類中的屬性和方法比父類中的優先順序高。引用類的屬性會返回之類中的屬性值,引用類方法時也會呼叫子類中的方法。
parent::birthday(); // 呼叫父類中的 birthday 方法
self::birthday(); // 呼叫當前類中的 birthday 方法
trait
PHP 5.4 新增特性,它允許在不建立一個父類的情況下,便可以在不同層次結構的類中複用類外部的程式碼,共享不同類的函式方法。語法如下:
trait traitname [ extends baseclass ]
{
[ use traitname, [ traitname, ... ]];
[ abstract function functionname(); [...] ]
[ visibility $property [ = value ]; ... ]
[ function functionname (args){
//code
}
]
}
如果引入多個 trait
出現重名的情況,可以在類中定義一個別名。
trait Command
{
function run(){
echo "Executing a command";
}
}
trait Marathon
{
function run(){
echo "Running a marathon";
}
}
class Person
{
use Command, Marathon {
Command::run as runCommand;
Marathon::run insteadof Command;
}
}
$person = new Person;
$person->run(); // "Running a marathon"
$person->runCommand(); // "Executing a command"
建構函式
在建立一個物件是,會自動呼叫名為 __construct()
的函式。
PHP 並不支援建構函式鏈的自動呼叫,也就是說,當例項化子類時,只有子類自己建構函式會被呼叫,父類的建構函式不會被呼叫。我們可以顯式地呼叫父類的建構函式:parent::__construct()
。
解構函式
當一個物件被銷燬時,就會自動呼叫名為 __destruct()
的函式。
自省
自審是一種讓程式檢查物件特性的機制,可以檢查物件的名稱、父類、屬性和方法等。
class_exists()
: 確定一個類是否存在。
method_exists()
: 確定函式是否存在。
get_declared_classes()
: 返回一個包含所有已定義的類的陣列。
get_class_methods()
: 得到一個類中只有預設值的屬性。
get_class_vars()
: 得到一個類中所有方法。
get_object_vars()
: 返回物件中只有預設值的屬性。
get_parent_class()
: 得到一個類的父類名稱。
display_classes()
: 顯示所有當前已宣告的類,以及他們的方法和屬性。
is_object()
: 確定是否為一個物件。
序列化
序列化一個物件是指將一個物件轉換成位元組流的形式,這樣就可以將物件儲存在檔案中。這對資料的持久化非常有用。PHP 中的序列化幾乎時全自動的,除了要呼叫 serialize()
和 unserialize()
函式外,你幾乎不需要做任何額外的工作。
在序列化和反序列化的過程中,PHP 有兩個用於物件的鉤子( hook ):
__sleep()
: 一個物件被序列化之前被呼叫。
__wakeup()
: 一個物件從位元組流中被建立時呼叫。
感謝你看到了這裡。如果文章有錯誤,請評論指正,謝謝!
本作品採用《CC 協議》,轉載必須註明作者和本文連結