Наследование классов в PHP 5.2: Переопределение статической переменной в дополнительном классе?

Мне нужно к BEA смочь использовать набор статической переменной в классе, который расширяет базовый класс... от базового класса.

Рассмотрите это:

class Animal {
    public static $color = 'black';

    public static function get_color()
    {
        return self::$color;
    }
}

class Dog extends Animal {
    public static $color = 'brown';
}

echo Animal::get_color(); // prints 'black'
echo Dog::get_color(); // also prints 'black'

Это работает замечательно в PHP 5.3.x (Dog::get_color() 'коричневый' печати), так как это имеет последнее статическое связывание. Но мой рабочий сервер выполняет PHP 5.2.11 и таким образом, я должен адаптировать свой сценарий.

Существует ли несколько симпатичное обходное решение для решения этой проблемы?

Удачи!
Christoffer

Править: Цель

Как отмечено ниже, это - очень упрощенный пример того, что я пытаюсь выполнить. Если я предоставляю Вам эти две опции, я раньше решал мою проблему (и сама проблема), у кого-то могло бы быть другое решение, чем я...

Я создал основную модель базы данных, которая содержит функции, любят, "находят", "find_by" и "find_all" (все помехи).

В PHP 5.3 существует вызванная функция get_called_class() который я в настоящее время использую, чтобы определить имя названного класса и затем использовать его для отображения против корректной таблицы базы данных. Исключая классом User указал бы на users.

get_called_class() не существует в PHP 5.2.x и реализации взлома, которые я нашел, очень ненадежны. Затем я обратился к этой опции использования статической переменной во всех образцовых классах, которые содержат имя класса.

11
задан Christoffer 11 June 2010 в 06:13
поделиться

2 ответа

К сожалению, до PHP 5.3 не было возможности имитировать позднее статическое связывание. Единственный способ заставить наследование работать так, как задумано, - это если это переменные и методы экземпляра.

2
ответ дан 3 December 2019 в 07:36
поделиться

Я столкнулся с этой проблемой при создании подклассов в Zend Framework. Я решил, что в чисто статической стране у вас есть только один вариант ...Переопределите функцию в наследующем классе:

class Animal {
    public static $color = 'black';

    public static function get_color()
    {
        return self::$color;
    }
}

class Dog extends Animal {
    public static $color = 'brown';

    public static function get_color() 
    {
      return self::$color;
    }
}

Если вы можете создавать экземпляры - вы можете использовать get_class ($ this) , чтобы узнать вызывающий класс, например:

class Animal {
    public static $color = 'black';

    public function getColor() // note, not static
    {
      $class = get_class($this);
      return $class::$color;
    }
}

class Dog extends Animal {
    public static $color = 'brown';
}

$animal = new Animal();
echo $animal->getColor(); // prints 'black'
$dog = new Dog();
echo $dog->getColor(); // prints 'brown'

Единственный другой вариант Я думал об использовании параметра функции для статической функции для определения класса, из которого она вызывалась. По умолчанию он может быть __ CLASS __ , а затем вы можете вернуть parent :: get_class ($ class) из подкласса. Подобный шаблон можно использовать для упрощения повторного использования статической функции (поскольку я сомневаюсь, что возвращение общедоступного статического свойства - это единственное, что вы пытаетесь использовать self :: в этом статическом методе:

class Animal {
    public static $color = 'black';

    public static function get_color($class = __CLASS__)
    {
        // Super Simple Example Case... I imagine this function to be more complicated
        return $class::$color;
    }
}

class Dog extends Animal {
    public static $color = 'brown';

    public static function get_color($class = __CLASS__)
    {
      return parent::get_color($class);
    }
}
9
ответ дан 3 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: