91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php面向對象編程筆記static的后期靜態綁定

發布時間:2020-06-05 16:38:33 來源:網絡 閱讀:1400 作者:daweilang 欄目:web開發

最近在看laravel的源碼,開始的時候static關鍵字的用法讓我讀完一頭霧水,

static不應該是用來定義靜態變量方法和屬性的么?


在方法中

static::setInstance($this);

是什么?


查了手冊才明白,這是static關鍵字的另一種用法,“后期靜態綁定”,也可以稱為“靜態綁定”

http://php.net/manual/zh/language.oop5.late-static-bindings.php


官方的介紹:

該功能從語言內部角度考慮被命名為“后期靜態綁定”。“后期綁定”的意思是說,static::  不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為“靜態綁定”,因為它可以用于(但不限于)靜態方法的調用。  


官方的幾個例子很好的說明了后期靜態綁定的意思


self::的限制

使用 self:: 或者 __CLASS__ 對當前類的靜態引用,取決于定義當前方法所在的類:

Example #1 self:: 用法

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}
B::test();
?>

輸出:A


后期靜態綁定的用法

后期靜態綁定本想通過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字能夠讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。

Example #2 static:: 簡單用法

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 后期靜態綁定從這里開始
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}
B::test();
?>

輸出:B


在這里static相當于self,parent一樣的關鍵字,用來調用方法,不過與self不同,static調用的類并不一定是靜態屬性和靜態方法,這點上看更接近于parent這個關鍵字的用法。


but,在下面的例子了還看到這樣一種用法

<?php
class Model
{
    public static function find()
    {
        echo static::$name;
    }
}
class Product extends Model
{
    protected static $name = 'Product';
}
Product::find();
?>

在父類里并未定義$name這個屬性,這時候在子類里必須

static $name

不過一般程序應該不會出現這種父類沒定義屬性而直接使用的情況吧。

-----------------------------------------------------------------------------------------------------------


另外,測試例子的時候想到這么一個情況

class A {
    public static function who() {
        echo __CLASS__;
    }
    public function test() {
        static::who();
    }
}
class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}
(new B())->test();

非靜態方法可以調用靜態方法,反之則不行


laravel設計模式中大量使用了這種靜態綁定的方法,尤其是核心功能Facades。

php面向對象編程還有很多東西需要了解。。。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台州市| 威远县| 乐安县| 东丰县| 泾川县| 宣武区| 勐海县| 息烽县| 新田县| 衡山县| 芮城县| 大足县| 鸡西市| 堆龙德庆县| 华池县| 柳河县| 嘉鱼县| 沙田区| 南陵县| 筠连县| 定兴县| 遂昌县| 会昌县| 新蔡县| 郓城县| 德兴市| 金堂县| 湛江市| 莱芜市| 潞城市| 东光县| 芒康县| 汨罗市| 赣榆县| 梅河口市| 丹巴县| 文昌市| 陆河县| 临海市| 吴忠市| 炎陵县|