Создать два одинаковых статических класса в PHP

Я пытаюсь расширить статический класс в 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::. Но я не могу придумать, как это сделать, не переименовывая все методы Fruit в Apple и Banana.

Буду рада за любую помощь

Благодарю вас

2 ответа

Решение

Это работает:

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

Таким образом, в основном вы храните данные только в одном классе, но специфично для класса, к которому был вызван метод. Вам не нужно static как $name всегда является частью self, но 5.3 все еще требуется, потому что get_called_class также является частью позднего статического связывания.

Другие вопросы по тегам