3

我正在尝试在 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 的方法。

我会很高兴得到任何帮助

谢谢你

4

2 回答 2

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

不幸的是,您需要重新声明要专门化的静态属性,但是您后期的静态绑定直觉是正确的:)

于 2014-04-05T21:02:31.487 回答
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它也是后期静态绑定的一部分。

于 2014-04-05T21:09:21.450 回答