既上篇 Laravel 的 XXXResource::make() 的 make() 作用 - Late Static Bindings 後,我們了解 Late Static Bindings 的作用是:
static::method()
、 static::$properties
: 子類別 關鍵字 static 透過強制執行 後期靜態綁定(Late Static Bindings) 的概念來 覆蓋 父類別的方法所具有的限制,例如:<?php
class Animal{
public static $year = 10;
public static function age(){
echo 'static:: ';
var_dump(static::$year); // 20
echo "static:: class is ".get_class(new static())."</br>";
echo 'self:: ';
var_dump(self::$year); // 10
echo "self:: class is ".get_class(new self())."</br>";
}
}
class Bird extends Animal{
public static $year = 20;
}
Bird::age();
/* Output
* static:: int 20
* static:: class is Bird
*
* self:: int 10
* self:: class is Animal
*/
爬文了解 new static()
之前,我會困惑 new
, static
這兩個 PHP 關鍵字 為什麼可以擺在一起? 擺在一起的功用是什麼?
爬文後: New self vs. new static 和 late-static-bindings-new-static,暸解 new
, static
要看做 new static() 才是正確的概念。
『late-static-bindings new-static』範例中顯示 new static()
作用是 『哪個 class 呼叫 foo()
,就產生 那個 clas 的 object』
new static()
產生 class C 的 Object』<?php
class A
{
}
class B extends A
{
public static function foo () {
echo 'new self: ';
var_dump(new self());
echo '<br>new parent: ';
var_dump(new parent());
echo '<br>new static: ';
var_dump(new static());
}
}
class C extends B
{
}
C::foo();
/* Output
* new self: object(B)
* new parent: object(A)
* new static: object(C)
*/
經過 static 、 後期靜態綁定 (Late Static Bindings) 和 new static() 文章介紹後,便知道 『XXXResource::make() 』的 make() 的 Create a new resource instance 由來。
return ProductResource::make(Product::first());
作用:
new static()
產生 class ProductResource 的 Objectmake()
產出的 resource instance 是 ProductResource$this->resource
= Product::first()<?php
class JsonResource {
// The resource instance.
public resource;
/*
* Create a new resource instance.
*/
public function __construct($resource)
{
$this->resource = $resource;
}
/*
* Create a new resource instance.
*/
public static function make(...$parameters)
{
return new static(...$parameters);
}
// ...略
}
class ProductResource extends JsonResource{
}
// In router or Controller
// make() 產出的 resource instance 是 ProductResource
// $this->resource = Product::first()
return ProductResource::make(Product::first());
1 Laravel 的 XXXResource::make() 的 make() 作用 - Late Static Bindings
2 New self vs. new static
3 late-static-bindings-new-static