php - private var 在 php 类中无法按预期工作

标签 php class private var

在下面的示例中,我收到一条错误,指出 $foo->_test 的值无法访问,因为它是私有(private)的。我做错了什么?

<?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';
    }
}
?>

感谢任何帮助。

最佳答案

私有(private)变量仅对声明它们的直接类可见。您正在寻找的是protected,如果没有这个,您实际上就是在对象中创建两个不同的成员变量。

class Foo
{
    protected $_test = array();
}

class Bar extends Foo
{
    public function test()
    {
        $this->_test = 'opa';
    }
}

[编辑] 您还尝试完全访问类外部的私有(private)(即将受到保护)成员变量。这将始终被禁止。除非在这种情况下,否则您将创建第二个 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 );

关于php - private var 在 php 类中无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8455086/

相关文章:

php - 数据库找不到用户(html 输入字段)

php - 在我的网站中通过鼠标右键单击来控制链接

c++ - 如何在类中全部内嵌数据结构模板(同一 .h 文件)

c++ - 错误的私有(private)基类无法访问?

PHP 类的私有(private)属性和方法

javascript - 如何将 json 结果导入 PHP

php - 用于运行 PHP 文件的 Windows 批处理文件

c++ - 无法创建类实例

c++ - 在父类(super class)中调用抽象方法,并在C++中的子类中实现它?

c++ - 如何访问其他类私有(private)内部类的数据?