Позднее статическое связывание в PHP, переменные распределяются между дочерними классами.

StackOverflow https://stackoverflow.com//questions/12690019

  •  12-12-2019
  •  | 
  •  

Вопрос

Возможно, мой вопрос уже задавался несколько раз, но...

У меня есть следующий код

abstract class ParentClass
{
    protected static $count=0;
    public static function inc()
    {
        static::$count++;
    }
    public static function getCount()
    {
        return static::$count;
    }
}

class FirstChild extends ParentClass
{

}
class SecondChild extends ParentClass
{

}

И я использую его именно так

FirstChild::inc();
echo SecondChild::getCount();

Он показывает мне «1».И как вы наверное догадались мне нужен "0" :)

Я вижу два пути:

  1. Добавление protected static $count=0; каждому производному классу
  2. Делать $count не целое число, а массив.И делать такие вещи в inc и getCount методы:

    static::$count[get_known_class()]++;

и

return static::$count[get_called_class()];

Но я думаю, что эти способы немного некрасивы.Во-первых - заставляет меня копировать/вставлять то, чего мне хотелось бы избежать.Второе - ну не знаю :) Мне это просто не нравится.

Есть ли лучший способ добиться того, чего я хочу?

заранее спасибо.

Это было полезно?

Решение

Нет, вы именно изложили два наиболее практичных варианта решения этой проблемы.PHP не может творить чудеса;когда вы объявляете static protected собственности вы получаете именно это: один свойство.Если приведенный вами синтаксис сработает, это может быть хорошей новостью для всех, кому это нужно, но это будет абсолютно ужасная новость для всех, кто ожидает, что ООП PHP будет вести себя в некоторой степени разумно.

И к сведению: если вам не нужен отдельный счетчик для всех без исключения производных классов, то я рассматриваю явный protected static $count = 0 в производных классах, которым оно действительно необходимо, чтобы быть красивым решением:вам нужен собственный счетчик, вы просите его, и этот факт остается записанным в коде, чтобы все могли его увидеть.

Другие советы

Я думаю, что для того, что вы пытаетесь сделать, наличие только метода интерфейса (например, getCount()) в абстрактном классе и счетчика в производном классе, ваш первый выбор, является наименее худшим вариантом.Нет смысла иметь абстрактный статический счетчик в родительском классе, если вы не учитываете все экземпляры для этого счетчика.

В общем, я думаю, что вся идея немного некрасивая, поэтому и реализация будет некрасивой :)

Вы можете объявить protected static $count=0;для каждого дочернего класса, таким образом, он будет уникальным для каждого дочернего класса, но общим для всех экземпляров классов.Это самое элегантное решение его проблемы.

abstract class ParentClass
{
    public static function inc()
    {
        static::$count++;
    }
    public static function getCount()
    {
        return static::$count;
    }
}

class FirstChild extends ParentClass
{
    protected static $count=0;
}
class SecondChild extends ParentClass
{
    protected static $count=0;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top