private var在类php中没有按预期工作

时间:2011-12-10 07:15:15

标签: php class private var

在下面的示例中,我收到一条错误消息,指出$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';
    }
}
?>

感谢任何帮助。

3 个答案:

答案 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 变量,您将收到错误。

再见。