飛機的 PHP 學習筆記之面對物件篇

飛機飛過天空發表於2020-01-19

前言

最近在系統的學習 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 協議》,轉載必須註明作者和本文連結

相關文章