2009-07-30 1 views
4

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

abstract class Parent { 

    protected static $message = "UNTOUCHED"; 

    public static function yeah() { 
     static::$message = "YEAH"; 
    } 
    public static function nope() { 
     static::$message = "NOPE"; 
    } 

    public static function lateStaticDebug() { 
     return(static::$message); 
    } 

} 

, а затем продлить его:

class Child extends Parent { 
} 

, а затем сделать это:

Parent::yeah(); 
Parent::lateStaticDebug(); // "YEAH" 

Child::nope(); 
Child::lateStaticDebug(); // "NOPE" 

Parent::yeah(); 
Child::lateStaticDebug() // "YEAH" 

Есть ли способ, чтобы мой второй класс, который наследует от первого, также наследует свойства, а не только методы?

Мне просто интересно, есть ли что-то о поздней статической привязке PHP, а также наследование, которое позволит это. Я уже взламываю свой путь вокруг этого ... Но, похоже, не имеет смысла, что незаявленное статическое свойство будет падать на родителя для значения !?

+0

Я создал следующий отчет PHP ошибка: http://bugs.php.net/49105 Я призываю людей пойти проверить его и оказать поддержку. Это довольно ограничительное ограничение. Нынешнее поведение также совершенно бессмысленно. –

+0

Кажется, что люди смирились с дефолтным поведением, которое не является интуитивным. Проблема здесь в том, что PHP имеет неправильное поведение по умолчанию, или должен быть способ динамического объявления свойств. –

+0

Я полностью поддерживаю вас в ваших поисках, это поведение очень раздражает! К сожалению, похоже, чтобы здесь остаться. – djfm

ответ

-2

Ответ «с обходным решением».

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

+0

ссылка не работает –

+0

К сожалению, это было в моем блоге на blogspot, который я снял некоторое время назад. Я извиняюсь. –

+0

Где обходные пути? Почему бы не опубликовать их здесь? – txwikinger

1

Наследование и static свойства когда-то приводят к «странным» вещам в PHP.

Вы должны взглянуть на Late Static Bindings в руководстве по PHP: он объясняет, что может случиться при наследовании и использовании свойств static в PHP < = 5.2; и дает решения для PHP> = 5.3, где вы можете использовать ключевые слова static:: вместо self::, так что статическая привязка выполняется при выполнении (а не компиляции) времени.

+1

Я уже использую позднюю статическую привязку в моем примере ... Я знаю, что это такое. –

Смежные вопросы