我正在尝试在PHP中扩展静态类。我遇到的是,一旦我更改了其中一个扩展类中的变量,所有其他类也都会发生变化。这就是我想要做的事情:
class Fruit{
private static $name = Null;
public static function setName($name){
self::$name = $name;
}
public static function getName(){
return self::$name;
}
}
class Apple extends Fruit{};
class Banana extends Fruit{};
Apple::setName("apple");
Banana::setName("Banana");
echo Apple::getName();
echo Banana::getName();
我已经阅读了关于后期静态绑定和关键字static ::的文章。但我无法想办法如何实现这一目标,而无需在Apple和Banana中重新使用所有Fruit的方法。
我会很乐意提供任何帮助
谢谢
答案 0 :(得分:4)
这有效:
<?php
class Fruit{
protected static $name = Null;
public static function setName($name){
static::$name = $name;
}
public static function getName(){
return static::$name;
}
}
class Apple extends Fruit{protected static $name;};
class Banana extends Fruit{protected static $name;};
Apple::setName("apple");
Banana::setName("Banana");
echo Apple::getName();
echo Banana::getName();
不幸的是你需要重新声明你想要专门化的静态属性,但是你的后期静态绑定直觉是正确的:)
答案 1 :(得分:0)
虽然你应该避免这样的结构,你可以很好地解决它:
<?php
class Fruit {
protected static $names;
public static function setName($name)
{
self::$names[get_called_class()] = $name;
}
public static function getName()
{
return isset(self::$names[$key = get_called_class()]) ? self::$names[$key] : null;
}
}
所以基本上你只将数据存储在一个类中,但是特定于调用该方法的类。您不需要static
因为$name
始终是self
的一部分,但仍然需要5.3,因为get_called_class
也是后期静态绑定的一部分。