Создайте два одинаковых статических класса в 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::. Но я не могу придумать, как это сделать, не прибегая к повторному объявлению всех методов фруктов как в яблоке, так и в банане.
Я буду рад любой помощи
Спасибо
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();
К сожалению, вам нужно повторно объявить статические свойства, на которых вы хотите специализироваться, но ваша поздняя интуиция статической привязки была верна:)
Хотя вам следует избегать таких конструкций, вы могли бы решить ее довольно хорошо:
<?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
также является частью поздней статической привязки.