Мне нужно к 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 и реализации взлома, которые я нашел, очень ненадежны. Затем я обратился к этой опции использования статической переменной во всех образцовых классах, которые содержат имя класса.
К сожалению, до PHP 5.3 не было возможности имитировать позднее статическое связывание. Единственный способ заставить наследование работать так, как задумано, - это если это переменные и методы экземпляра.
Я столкнулся с этой проблемой при создании подклассов в 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);
}
}