Закрытые переменные видны только прямому классу, в котором они объявлены.То, что вы ищете, это protected
. Без этого вы эффективно создаете две разные переменные-члены в вашем объекте.
class Foo
{
protected $_test = array();
}
class Bar extends Foo
{
public function test()
{
$this->_test = 'opa';
}
}
[править] Вы также пытаетесь получить доступ к закрытой (скоро будет защищенной) переменной-члену вне класса.Это всегда будет запрещено.За исключением этого случая, вы создаете вторую переменную-член public
, поэтому ошибка не отображается.Вы не упомянули, что ожидали увидеть ошибку, поэтому я предполагаю, что это был вопрос, который у вас возник.
[править]
вот дамп var:
object(Bar)#1 (2) {
["_test:private"]=>
array(0) {
}
["_test"]=>
string(3) "opa"
}
[править]
Одна вещь, которую я сделал в рамках, который я написал, - это создание базового класса, который я расширяю почти везде.Одна вещь, которую делает этот класс, - это использование методов __get
и __set
для принудительного объявления переменных-членов класса - это помогает сузить проблемы с кодом, такие как у вас.
<?
abstract class tgsfBase
{
public function __get( $name )
{
throw new Exception( 'Undefined class member "' . $name . "\"\nYou must declare all variables you'll be using in the class definition." );
}
//------------------------------------------------------------------------
public function __set( $name, $value )
{
throw new Exception( 'SET: Undeclared class variable ' . $name . "\nYou must declare all variables you'll be using in the class definition." );
}
}
class Foo extends tgsfBase
{
private $_test = array();
}
class Bar extends Foo
{
public function test()
{
$this->_test = 'opa';
}
}
header( 'content-type:text/plain');
$foo = new Bar;
$foo->test();
var_dump( $foo );
print_r( $foo->_test );