Бага в PHP?

denver

?>Скриптер
Бага в PHP?

PHP:
class B {
	protected $bar = 47;

	function foo() {
		$b = new B;
		echo $b->bar; // Will output 47 without any error
	}
}

$b = new B;
$b->foo();
ЗЫ. стоит PHP 5.0.4
 

Lews

Новичок
А в чем собсно бага?
protected доступен для потомков, private нет.
 

SunDrop

Помощник поисков. робота
Бага в голове :))))
PHP:
class A {
    protected $xml = 10;
}

class B extends A {
}
function foo() {
    $b = new B;
    echo ($b->xml); // Will output 10 without any error
}
foo();
Cannot access protected property B::$xml
 

denver

?>Скриптер
SunDrop
Твой код несколько отличается от моего, isn't it?

wizard
В камменте
 

Wicked

Новичок
Ты обращаешься к протектед методу как бы одновременно и снаружи (не из метода объекта $b), и изнутри (но при этом из метода B::). Не думаю, что это бага :)
 

SunDrop

Помощник поисков. робота
Автор оригинала: denver
Твой код несколько отличается от моего, isn't it?
Я тебе об этом и говорю...
Все корректно работает.
Твой код и не должен возвращать ошибок.
Я тебе показал другой пример, который ошибку вернул!
 

denver

?>Скриптер
SunDrop
С твоим кодом всё понятно.

Автор оригинала: SunDrop
Твой код и не должен возвращать ошибок.
А вот это, собственно, под вопросом :)

Wicked
$b экземпляр класса, и у него протектед свойства ну никак не должны быть доступны.

-~{}~ 07.09.06 16:21:

PS. Упростил код, наследственность там была нипричем...
 

wizard

Новичок
denver
Если свойство protected, то оно доступно в дочернем классе и во всех методах класса, который содержит его.
Извне-недоступно.
По-моему, ты не разобрался с
private/protected/public
Кури мануалы :)
 

Lews

Новичок
Если "$b экземпляр класса, и у него протектед свойства ну никак не должны быть доступны.", то мм...чему они должны быть доступны?)
 

Wicked

Новичок
$b экземпляр класса, и у него протектед свойства ну никак не должны быть доступны.
ну это как рассудить :)
с другой стороны у нас получается "обращение к protected/private св-ву класса B из метода класса B" :)
 

denver

?>Скриптер
wizard, Lews, умненькие,
Почему же тогда fatal error в данном случае? :)

PHP:
class A {
	protected $bar = 47;
}

class B {
	function foo() {
		$a = new A;
		echo $a->bar; // Fatal error: Cannot access protected property A::$bar in
	}
}

$b = new B;
$b->foo();
 

denver

?>Скриптер
Автор оригинала: Wicked
ну это как рассудить :)
с другой стороны у нас получается "обращение к protected/private св-ву класса B из метода класса B" :)
Ну private то недоступны в данном случае, и правильно что недоступны...
Вот из мануала: Protected limits access to inherited and parent classes (and to the class that defines the item)
Может все дело в этих скобках? Как-то непрозрачно написано.

-~{}~ 07.09.06 16:37:

Автор оригинала: wizard
Потому что B не extends A, умненький ;)

http://ru.php.net/public
wizard, мальчик мой, мне нравится ваша детская непосредственность,
а вы попробуйте дописать extends A и проверить вашу теорию :D
 

crocodile2u

http://vbolshov.org.ru
Я не очень силен в разных ОО-языках.. Но, насколько мне известно (поправьте меня, если я ошибаюсь), в разных языках фишка, о которой идет речь, реализована бывает по-разному - т. е. в одном языке код denver приведет к ошибке, а в другом нет. Разработчики PHP пошли по тому пути, который мы с вами наблюдаем. И это поведение давно известно.
 

bkonst

.. хочется странного?...
Дело именно в том, что
Protected limits access to inherited and parent classes
Поведение кода в примере на 100% этому соответствует. А
and to the class that defines the item
соотвутствует тому, что класс может обращаться к собственным protected-элементам.

~

wizard, мальчик мой, мне нравится ваша детская непосредственность,
а вы попробуйте дописать extends A и проверить вашу теорию
И?
 
Сверху