Создайте два одинаковых статических класса в 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::. Но я не могу придумать, как это сделать, не прибегая к повторному объявлению всех методов фруктов как в яблоке, так и в банане.

Я буду рад любой помощи

Спасибо

Author: Blujacker, 2014-04-06

2 answers

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

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

К сожалению, вам нужно повторно объявить статические свойства, на которых вы хотите специализироваться, но ваша поздняя интуиция статической привязки была верна:)

 4
Author: djfm, 2014-04-05 21:02:31

Хотя вам следует избегать таких конструкций, вы могли бы решить ее довольно хорошо:

<?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 также является частью поздней статической привязки.

 0
Author: Joost, 2014-04-05 21:09:21