Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PHP Bug? class extends __get

714
20 апреля 2012 года
clgs
226 / / 29.10.2008
Код
Код:
class A{
    public function __get($pName){
        return $this->$pName;
    }
}

class B extends A{
    public $public='public';
    private $private='private';
    protected $protected='protected';
}

$b = new B();
var_dump($b->public,$b->private,$b->protected);
Результат
Цитата:
Notice: Undefined property: B::$private in L:\home\sites-cms\www\test.php on line 4
string(6) "public" NULL string(9) "protected"



Подскажите почему private не печатается, баг или отсутствия знаний?
PHP 5.2.4

271
20 апреля 2012 года
MrXaK
721 / / 31.12.2002
Вообще геттер вызывается и с нужной переменной, если вы в него echo вставите, то тоже увидите.
А вот доступ он не может получить, потому что наследование такое. Как вы думаете, что будет результатом выполнения такого кода:

Код:
<?php

abstract class A {
  public function p() {
    echo $this->pr;
  }
  public function p1() {
    echo $this->pb;
  }
};

class B extends A {
  private $pr='aa';
  public $pb='bb';
  public function p2() {
    echo $this->pr;
  }
};

$b = new B();
$b->p1();
$b->p2();
$b->p();
Результатом этого будет Fatal Error, потому что наследования вверх нет. Все методы класса A становятся доступны в B, но доступ из A к private-свойствам B запрещён.

Ради интереса посмотрите на вывод:

Код:
<?php

abstract class A {
  private $pr='qq';
  public function p() {
    echo $this->pr;
  }
  public function p1() {
    echo $this->pb;
  }
};

class B extends A {
  private $pr='aa';
  public $pb='bb';
  public function p2() {
    echo $this->pr;
  }
};

$b = new B();
$b->p1();
$b->p2();
$b->p();
Геттер в вашем случае позволяет не вывалиться с Fatal'ом, а всего лишь с Notice'ом. Но наследования вверх не будет.
714
20 апреля 2012 года
clgs
226 / / 29.10.2008
Цитата:
но доступ из A к private-свойствам B запрещён.


ну а почему тогда к protected есть доступ?

12
23 апреля 2012 года
alekciy
3.0K / / 13.12.2005
Цитата: clgs

ну а почему тогда к protected есть доступ?


Как это почему? О_о Потому что extends!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог