自动初始化扩展父类的静态类

时间:2016-05-12 14:01:37

标签: php oop

我有一个名为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()调用。

那么,方式是什么?调用静态方法时是否有一个魔术方法?对不起解释不好。

2 个答案:

答案 0 :(得分:0)

应该使用

get_called_class()代替__CLASS__魔法常量。

http://php.net/manual/en/function.get-called-class.php

手册中的更多信息:late static binding

答案 1 :(得分:0)

正如@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;
    }