簡體   English   中英

擴展父類的靜態類的自動初始化

[英]Auto init of a static class that extends parent

我有一個帶有構造函數的名為Foo的類,並且我想讓它的一個變量成為子類的名稱。

例:

class Foo {

    protected static $name;
    protected static $something;

    public function __construct( $something ) {
        self::$something = $something;
        self::$name = strtolower( __CLASS__ );
    }

    static public function hello() {
        echo self::$name;
    }

}

class Bar extends Foo {}

new Foo( 'lazy' );
Bar::hello();

結果將始終為foo() ,因為構造函數僅由new Foo()調用。

那么,怎么回事呢? 調用靜態方法時是否調用了魔術方法? 對不起,不好的解釋。

應該使用get_called_class()代替__CLASS__魔術常數。

http://php.net/manual/zh/function.get-drawn-class.php

手冊中的更多信息: 后期靜態綁定

正如@JesusTheHun所說,首先,您需要將__CLASS__更改為get_called_class()static::class (從PHP 5.5開始)。 字符串__CLASS__在編譯時讀取,並且始終引用指定該字符串的類。 其他選項中的任何一個都會在運行時生效。

但是,通過在構造函數中設置靜態類變量,您可以為該類的所有實例 (過去和現在)更改該變量,並為任何靜態調用更改該變量。 因此,每當實例化樹中任何類的實例時,以后所有對hello()的調用都將顯示該類名稱,即

<?php
class Foo {
    protected static $name;
    protected static $something;

    public function __construct() {
        self::$name = strtolower( static::class );
    }

    static public function hello() {
        echo self::$name;
    }
}

class Bar extends Foo {}
class Baz extends Foo {}

new Foo;
Bar::hello(); // "foo"
new Baz;
Bar::hello(); // "baz"

這似乎不是您要尋找的行為。 如果您想要的只是一個靜態方法,該方法將回顯調用它的類名,則可以使用上述方法之一,例如

    static public function hello() {
        echo static::class;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM