探詢關鍵字 static ,起因:我看到 Laravel 的 XXXResource::make() 的 make(),瞬間不知道為什麼 make()
結果會是 Create a new resource instance. 如:
<?php
class JsonResource {
/*
* Create a new resource instance.
*/
public static function make(...$parameters)
{
return new static(...$parameters);
}
// ...略
}
既上篇 Laravel 的 XXXResource::make() 的 make() 作用 - 我以為的 static 概述我以為我知道 PHP 的 static 在做哪些事後,這篇文章接續講解關鍵字 static 的另一種用法 Late Static Bindings
直到看到 static 的 Late Static Bindings,才發現 static 可以這麼用:
Car::model();
和 Mercedes::model();
,兩者的結果都會是 I am a Car!
Mercedes::model();
的結果會是 I am a Mercedes!,解釋:
static
產生 Late Static Bindingsstatic::getModel()
等同於 Mercedes::getModel()
因此結果等於 I am a Mercedes!
<?php
class Car
{
public static function model()
{
static::getModel();
}
protected static function getModel()
{
echo "I am a Car!";
}
}
class Mercedes extends Car
{
protected static function getModel()
{
echo "I am a Mercedes!";
}
}
Car::model(); // I am a Car!
echo("\n");
Mercedes::model(); // I am a Mercedes!
self
,class Car
的 model()
修改如下,就可以得到 Car::model();
和 Mercedes::model();
,兩者的結果都會是 I am a Car!<?php
class Car
{
public static function model()
{
self::getModel();
}
}
Car::model(); // I am a Car!
echo("\n");
Mercedes::model(); // I am a Car!
透過後期靜態綁定 (Late Static Bindings) 可以讓 子類別的方法 覆蓋 父類別的方法,促使 類別 和 method 在 OOP 的應用上,更加彈性. self::method()
和 static::method()
作用:
self::method()
: 關鍵字 self 僅用於在該類別的範圍內,引用當前類別本身。static::method()
: 關鍵字 static 透過強制執行 後期靜態綁定(Late Static Bindings) 的概念來 覆蓋 父類別的方法所具有的限制。1 Laravel 的 XXXResource::make() 的 make() 作用 - 我以為的 static
2 Late Static Bindings
3 Geeksforgeeks - New self vs. new static in PHP