我正在和
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; }
如果您计划将其用于多个地点,则此方法将会更好.某些单例模式使用类似的方法.
<?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; } } }