Создать два одинаковых статических класса в 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
также является частью позднего статического связывания.