iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
自我挑戰組

PHP 沿途的風景系列 第 19

[Day 19] Laravel 的 XXXResource::make() 的 make() 作用 - new static()

  • 分享至 

  • xImage
  •  

Laravel 的 XXXResource::make() 的 make() 作用 - new static()

既上篇 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() 之前,我會困惑 new, static 這兩個 PHP 關鍵字 為什麼可以擺在一起? 擺在一起的功用是什麼?
爬文後: New self vs. new staticlate-static-bindings-new-static,暸解 new, static 要看做 new static() 才是正確的概念。

『late-static-bindings new-static』範例中顯示 new static() 作用是 『哪個 class 呼叫 foo(),就產生 那個 clas 的 object』

  • 如下例,『 class C 呼叫 foo(),透過 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)
 */

Laravel 的 XXXResource::make() 的 make() 作用

經過 static後期靜態綁定 (Late Static Bindings)new static() 文章介紹後,便知道 『XXXResource::make() 』的 make() 的 Create a new resource instance 由來。

return ProductResource::make(Product::first()); 作用:

  • class ProductResource 呼叫 make(),透過 new static() 產生 class ProductResource 的 Object
  • make() 產出的 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


上一篇
[Day 18] Laravel 的 XXXResource::make() 的 make() 作用 - Late Static Bindings
下一篇
[Day 20] Call API: Format Response
系列文
PHP 沿途的風景30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言