为什么PHP私有类var不是私有的?

时间:2012-02-06 22:17:13

标签: php class private globals

我正在编程,遇到了这个问题: 在下面的代码示例中,公共函数设置私有变量。现在可以预期私有变量的内容是私有的,认为$ GLOBALS变量(超全局)可以访问它,并且至少读取它。为什么?有没有办法预防这个?

<?PHP
error_reporting( E_ALL );

class test {
    private $test = '';

    public function test()
    {
        $this->test = 'Can u see me?'; 
    }
}

$b = new test();
$b->test();

pre( $GLOBALS['b'] );
// Result:
// test Object
// (
//     [test:test:private] => Can u see me?
// )

somefunc();
function somefunc()
{
    pre( $GLOBALS['b'] );
    // Result:
    // test Object
    // (
    //     [test:test:private] => Can u see me?
    // )
}

echo $b->test;
// Result:
// Fatal error: Cannot access private property test::$test

function pre( $a ) {
    echo '<pre>';
    print_r( $a );
    echo '</pre>';
}
?>

谢谢你, 杰弗里

4 个答案:

答案 0 :(得分:4)

private关键字是关于阻止从编程角度在类外部访问属性/方法。服务功能print_rvar_dump仍然能够看到它们。

原因是encapsulation,而不是文字隐藏数据

答案 1 :(得分:0)

您可以全局访问$GLOBALS中的任何内容,但这并不会改变您所获得的对象中的变量具有自己的私有变量这一事实。

简单地将对象放在$GLOBALS中并不会神奇地使其所有成员变量公开。那会疯了,打破各种各样的事情。对象的引用是全局的,仅此而已。

答案 2 :(得分:0)

这就是GLOBALS的作用。它包含当前在脚本中定义的所有变量,无论它们在何处或如何定义。这包括私有变量。

答案 3 :(得分:0)

pre()print_r()var_dump()等内置函数用于调试目的,因此可以显示它可以访问的任何对象引用的完整结构。 安全漏洞?也许,只是不要让人们在生产环境中注入代码或使用这些命令。