在PHP中创建两个相同的静态类

在PHP中创建两个相同的静态类,php,class,static,extend,late-static-binding,Php,Class,Static,Extend,Late Static Binding,我正在尝试用PHP扩展静态类。我遇到的是,一旦我更改了其中一个扩展类中的变量,所有其他类也都会更改。这就是我想做的: class Fruit{ private static $name = Null; public static function setName($name){ self::$name = $name; } public static function getName(){ return self::$nam

我正在尝试用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::。但我想不出一种方法,不必在苹果和香蕉中重新声明所有水果的方法,就可以实现这一点

我很乐意得到任何帮助

谢谢你

这很有效:

<?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();

虽然您应该避免这种构造,但您可以很好地解决它:

<?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;
    }
}

你能展示一下那些回声的输出吗?。。。而这似乎是唯一的方法,如果一个人不想弄乱魔术的方法。顺便说一句,在
Fruit
类中声明
$name
在这里并不是真的需要,但可能对可读性很有用。@raina77ow您说得对,但它也可能对不想/不需要专门化属性的子类有用。感谢您提供的解决方案,但我宁愿坚持@djfm建议的方法。对于变量较多(水果的颜色、味道等)的类来说效果更好。我对这个解决方案不感兴趣,因为它意味着
水果
知道它是子类。这与这里的问题有着非常紧密的联系:。这可能不会违反利斯科夫的替代原则,但对我来说确实很难闻……@Rob我非常同意,因此这个答案的第一句话。这种方法有时是有用的,尽管更好的设计可以避免这种情况。