iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
自我挑戰組

PHP 沿途的風景系列 第 18

[Day 18] Laravel 的 XXXResource::make() 的 make() 作用 - Late Static Bindings

  • 分享至 

  • xImage
  •  

Laravel 的 XXXResource::make() 的 make() 作用 - Late Static Bindings

探詢關鍵字 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

Late Static Bindings

直到看到 static 的 Late Static Bindings,才發現 static 可以這麼用:

  • 不暸解 Late Static Bindings 情況下, 我覺得 Car::model();Mercedes::model(); ,兩者的結果都會是 I am a Car!
  • 然而,Late Static Bindings 的作用是 『誰 呼叫 誰,static::getModel() 就綁定誰』,因此,Mercedes::model(); 的結果會是 I am a Mercedes!,解釋:
    • static function model() 的 static::getModel(); 的 關鍵字static 產生 Late Static Bindings
    • Mercedes::model(); ➡️ 『class Mercedes 呼叫 model() 時,static::getModel() 就會去綁定 class Mercedes 的 getModel() 』,此時 static::getModel() 等同於 Mercedes::getModel() 因此結果等於 I am a Mercedes!
    • Late Static Bindings: 子類別的方法 覆蓋 父類別的方法,後期靜態綁定 促使類別應用上,更加彈性。下面例子取自 New self vs. new static in PHP
<?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!
  • 什麼方法,可以使 我曾以為的 『Car::model(); 和 Mercedes::model(); ,兩者的結果都會是 I am a Car!』成真?
    • 這時就得使用 selfclass Carmodel() 修改如下,就可以得到 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


上一篇
[Day 17] Laravel 的 XXXResource::make() 的 make() 作用 - 我以為的 static
下一篇
[Day 19] Laravel 的 XXXResource::make() 的 make() 作用 - new static()
系列文
PHP 沿途的風景30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言