Наследование классов в PHP 5.2: Переопределение статической переменной в классе расширений? - PullRequest
11 голосов
/ 10 июня 2010

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

Учтите это:

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, и поэтому мне нужно адаптировать свой скрипт.

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

Cheers!
Christoffer

РЕДАКТИРОВАТЬ: цель

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 10 июня 2010

Я столкнулся с этой проблемой при создании подклассов в 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__, а затем вы можете return 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);
    }
}
5 голосов
/ 01 сентября 2015

В PHP 5.3+ предпочтительнее следующее:

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

    public static function get_color()
    {
        return static::$color; // Here comes Late Static Bindings
    }
}

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

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

Поздние статические привязки (PHP.net)

2 голосов
/ 10 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...