php – 继承静态属性的子类没有重新声明?

前端之家收集整理的这篇文章主要介绍了php – 继承静态属性的子类没有重新声明?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在和 this guy一样的问题与我正在写的应用程序.问题是静态属性不会在子类中继承,所以如果我在main类中使用static :: keyword,那么它也会在main类中设置变量.

如果我重新声明了我的子类中的静态变量,它可以工作,但我希望有大量的静态属性和子类,并希望避免代码重复.在我链接页面上的最高评价的回复链接到几个“解决方法”,但似乎有404’d.任何人都可以帮我一些帮助,或者指出我所说的解决办法的方向?

我不知道它在谈论什么具体的解决方法,我可以想到很多可以工作的.我个人不会在任何代码中使用这些.我建议你看看 Is it possible to overuse late static binding in PHP?,并重新思考,如果有更好的方法来做任何你希望完成的事情.

还要记住,我的代码是完全未经测试的,因为我在这里写.

方法1:始终使用数组来绘制

所有其他方法都是基于这一个.你可以使用静态属性,插入代码来检测类并得到它.我只会考虑这个,如果你从来没有计划使用其他地方的财产.

$class = get_called_class();
if(isset(self::$_names[$class])) {
    return self::$_names[$class];
}
else {
    return static::NAME_DEFAULT;
}

方法2:使用getter / setting方法

如果您计划将其用于多个地点,则此方法将会更好.某些单例模式使用类似的方法.

<?PHP
class SomeParent {
    const NAME_DEFAULT = 'Whatever defaults here';

    private static $_names = array();

    static function getName($property) {
        $class = get_called_class();
        if(isset(self::$_names[$class])) {
            $name self::$_names[$class];
        }
        else {
            $name = "Kandy"; // use some sort of default value
        }
    }

    static function setName($value) {
        $class = get_called_class();
        self::$_names[$class] = $value;
    }
}

方法3:__callStatic

这是迄今为止最方便的方法.但是,您需要使用对象实例(__get和__set不能静态使用).它也是最慢的方法(比其他两个慢得多).我猜测,由于您已经在使用静态属性,这已经是一个非选项. (如果这个方法适用于你,如果没有使用静态属性,可能会更好)

<?PHP
class SomeParent {

    const NAME_DEFAULT = 'Whatever defaults here';

    private static $_names = array();

    function __get($property) {
        if($property == 'name') {
            $class = get_called_class();
            if(isset(self::$_names[$class])) {
                return self::$_names[$class];
            }
            else {
                return static::NAME_DEFAULT;
            }
        }
        // should probably trigger some sort of error here
    }

    function __set($property,$value) {
        if($property == 'name') {
            $class = get_called_class();
            self::$_names[$class] = $value;
        }
        else {
            static::$property = $value;
        }
    }
}

猜你在找的PHP相关文章