Доступ к статической переменной из дочернего класса php - PullRequest
1 голос
/ 03 августа 2010

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

<?php
class core {
    static $var1;
}

class parent extends core {
   function getStatic() {
       return parent::$var1;
   }
}

class child extends parent {
    function getStatic() {
        // I want to access core static var, how can i do it?
        //return parent::$var1;
   }
}
?>

Мне нужно иметь возможность использовать parent :: $ var1, но изнутри класса child ... это возможно?Я что-то упустил?

Ответы [ 3 ]

4 голосов
/ 03 августа 2010

Просто укажите это как себя ... PHP будет автоматически подниматься по цепочке наследования, пока не найдет совпадение

class core {
    protected static $var1 = 'foo';
}
class foo extends core {
    public static function getStatic() {
        return self::$var1;
    }
}
class bar extends foo {
    public static function getStatic() {
        return self::$var1;
    }
}

Теперь возникнет проблема, если вы не объявите getStatic в строке,Давайте рассмотрим пример:

class foo1 extends core {
    protected static $var1 = 'bar';
    public static function getStatic() {
        return self::$var1;
    }
}
class bar1 extends foo1 {
    protected static $var1 = 'baz';
}

Теперь вы ожидаете, что foo1::getStatic() вернет bar (и так будет).Но что вернет * 1009?Он также вернет bar.Это называется поздним статическим связыванием.Если вы хотите, чтобы он возвращал baz, вам нужно использовать static::$var1 вместо self::$var1 (только PHP 5.3+) ...

2 голосов
/ 03 августа 2010

core :: $ var1 кажется лучшим для ваших нужд ...

1 голос
/ 03 августа 2010

Самая большая проблема здесь в том, что вы используете ключевое слово parent в качестве имени класса. Это делает совершенно двусмысленным, предназначены ли ваши вызовы parent :: $ var1 для указания на этот класс или на родительский класс вызывающего класса.

Полагаю, если вы очистите это, вы сможете добиться того, чего хотите. Этот код печатает «что-то», например.

class core {
    static $var1 = 'something';
}

class foo extends core {
   function getStatic() {
       return parent::$var1;
   }
}

class bar extends foo {
    function getStatic() {
        // I want to access core static var, how can i do it?
        return parent::$var1;
   }
}

$b = new bar ();
echo $b->getStatic ();

Это также работает, если вы используете core:: вместо parent::. Эти два будут вести себя по-разному, хотя, если вы объявите статический $ var1 внутри класса foo. Так как это единственная, унаследованная переменная.

...