2013-02-14 1 views
4

Я Protected Variable UserId в Parent Class.i Собираюсь расширить переменную в моем классе ребенка, как показано нижеКак получить доступ к переменной в родительском классе, используя родительский метод ::

class Main 
{ 
    protected $UserId   = "151"; 
    protected static $UserName = "Madhavan";  

    protected function SampleMethod() 
    { 
    print "This is Sample Method"; 
    } 
} 


class SubMain extends Main 
{ 
    function __construct() 
    {  
    print parent::SampleMethod(); 

    print "User Id is ".$this->UserId."<br/>";   
    print parent::$UserName; 
    print "User Id is ".parent::$UserId."<br/>";    
    } 
} 

Когда я использую $ this-> UserId его печать fine.But, когда я использую родитель :: $ UserId его отображение ошибки

Фатальная ошибка: Доступ к необъявленной статического свойства: Главная :: $ UserName

Почему это не отображается для функции, которую я получил от parent :: SampleMethod(), поскольку функция не является статической.

+0

Возможный дубликат [статическая функция php] (http://stackoverflow.com/questions/902909/php-static-function) – Alp

+0

а также: [Вызов нестатического метода с помощью «::»] (http: // stackoverflow.com/questions/3754786/calling-non-static-method-with) – Alp

+0

'$ UserName' объявлен как статический, вам нужно получить к нему доступ, используя' static :: 'like' static :: $ UserName' – afarazit

ответ

1

Это связано с тем, что функции переопределены (поэтому более старые версии с одним и тем же именем сосуществуют), а свойства не являются (объявления просто перезаписывают друг друга, а свойства не должны повторно объявляться в классах потомков). Вы всегда получаете доступ к экземпляру объекта ONLY только с $this->, если он не является статичным, и self::, если он статичен. (Если свойство было объявлено в нескольких классах предков, существует только одно поле данных, поэтому вы не можете ссылаться на «другие» или «предыдущие».)

+0

Вы также можете подумайте об этом следующим образом: все имена (функции и свойства), которые объявляются восходящими классами, накапливаются в классе. Вы можете использовать любой из них, как если бы они были объявлены в этом классе. Есть только одно исключение: когда вы хотите получить доступ к предыдущим версиям, где они уже скрыты путем переоформления этого имени.В этих случаях вы можете использовать статический вызов, чтобы назвать класс, который содержит предыдущую версию, которую вы хотите использовать. '' 'parent''' является просто ярлыком для указания прямого предка, потому что это наиболее распространенная функция usecase. –

0

если E_STRICT не активирован, вы не получите ошибку , иначе вы получите что-то вроде этого:

строгих стандартов: Non-статического метода родителя :: SampleMethod() не должен вызываться статический ...

+1

Этого не произойдет, потому что 'parent ::' не обязательно означает статический контекст. –

0

Вместо того, чтобы использовать родитель, вы можете получить доступ к нему с self::$UserName атрибут (где он был определен) с ключевым словом self. Если вы хотите достичь его значения в дочернем классе (потому что переопределяете его), он доступен через final::$UserName (называемый поздним статическим привязкой)

3

Оператор разрешения области :: иногда ведет себя неочевидным образом. При применении к константам или переменным он всегда разрешается статически.

Однако при применении к функциям контекст исполнения вызываемого абонента зависит от контекста выполнения кода вызывающего абонента; контекст не изменяется.

Например, это работает отлично без каких-либо предупреждений:

class Test 
{ 
    private $a = 123; 

    public function __construct() 
    { 
    Test::test(); 
    self::test(); 
    } 

    public function test() 
    { 
    echo $this->a; 
    } 
} 

new Test(); 

Вызов self::test() и Test::test() оба работают в нестатической образом, потому что __construct() называется, не статически и вы ссылающийся на тот же класс ,

Для ссылки на любую переменную экземпляра, такую ​​как $a в приведенном выше примере, требуется использование $this->.

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