在下面的示例中,我收到一条错误消息,指出$foo->_test
的值无法访问,因为它是私有的。我做错了什么?
<?php
$foo = new Bar;
$foo->test();
print_r( $foo->_test );
class Foo
{
private $_test = array();
}
class Bar extends Foo
{
public function test()
{
$this->_test = 'opa';
}
}
?>
感谢任何帮助。
答案 0 :(得分:5)
私有变量仅对声明它们的直接类可见。您正在寻找的是protected
如果没有这个,您实际上在对象中创建了两个不同的成员变量。
class Foo
{
protected $_test = array();
}
class Bar extends Foo
{
public function test()
{
$this->_test = 'opa';
}
}
[编辑]
您还试图完全访问类外的私有(即将受到保护)成员变量。这将始终被禁止。除了在这种情况下,您正在创建第二个public
成员变量,这就是为什么没有显示错误的原因。您没有提到您希望看到错误,所以我假设这是您遇到的问题。
[编辑]
这里是var dump:
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 );
答案 1 :(得分:0)
私有成员在其子类中不是visible
。有关详细信息,请阅读Manaul。添加var_dump()以验证对象结构。
<?php
$foo = new Bar;
$foo->teste();
print_r( $foo->_testando );
var_dump( $foo);
class Foo
{
private $_testando = array();
}
class Bar extends Foo
{
public function teste()
{
$this->_testando = 'opa'; // a new member of string type will be created
}
}
?>
答案 2 :(得分:0)
当您在var_dump($foo);
下方写下$foo->teste();
时,您将获得完整的想法。
这里PHP创建了2个名为 _testando 的变量,一个是私有的,值为value = array,一个是public,值为= opa。
写下这个:
private $_testando_new = '';
公共函数teste()上方的
并将$this->_testando = 'opa';
替换为$this->_testando_new = 'opa';
并尝试在课堂外访问 _testando_new 变量,您将收到错误。
再见。