PHP類方法的型別提示

parvin發表於2019-02-16

引數變數可以是任何基本型別的資料,引數預設情況下也可以是任何型別的物件,在方法定義中可能會出現一些問題。

class ShopProductWriter {
    // 接受ShopProduct物件的方法
    public function write($shopProduct){
        $str = "{$shopProduct->title}: " . $shopProduct->getProducer() . " ({$shopProduct->price})
";
        print $str;
    }
}

$product1 = new ShopProduct("My Antonia", "Willa", "Cather", 5.99);
$write = new ShopProductWriter();
$write->write($product1); // My Antonia: Willa Cather (5.99)

把引數變數命名為$shopProduct,說明該方法希望接受一個ShopProduct物件,但是並沒有強制要求。也就是說,可能接受到非預期的物件或基本型別,但在實際處理$ShopProduct之前不會知道具體是什麼。
為了解決沒有強制要求引數型別這個問題,PHP5引入了類的型別提示(type hint)。要增加一個方法引數的型別提示,只需簡單地將類名放在需要約束的方法引數之前。

public function write(ShopProduct $shopProduct) {
    //...
}

現在write()方法只接受包含ShopProduct物件的$shopProduct引數。如果給方法傳入其他物件將會產生嚴重錯誤。
有了引數的型別提示,就不再需要在使用引數前對其進行型別檢查。型別提示是在執行時才生效的,也就是說,型別提示只有在錯誤的物件被傳遞給方法時才會報錯。
型別提示不能用於強制規定引數為某種基本資料型別,如字串和整型。如果要處理基本資料型別,在方法中可以使用is_int()這樣的型別檢查函式。但可以強制規定使用陣列作為引數:

function setArray(array $storeArray) {
    $this->array = $storeArray;
}

在PHP5.1中加入了對陣列提示的支援,而後來的版本還新增了對null預設值得引數提示,即可以指定引數為一個特定型別或null值:

function setWriter(ObjectWrite $objWrite=null){
    $this->writer = $objWrite; 
}

相關文章