1

我正在编程,遇到了这个问题:在下面的代码示例中,一个公共函数设置了一个私有变量。现在人们会期望该私有变量的内容是私有的,认为 $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

4 回答 4

4

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

所以原因是封装,而不是字面隐藏数据

于 2012-02-06T22:19:40.697 回答
0

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

简单地放入一个对象$GLOBALS并不会神奇地将其所有成员变量公开。那太疯狂了,会破坏各种东西。对对象的引用是全局的,仅此而已。

于 2012-02-06T22:19:15.440 回答
0

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

于 2012-02-06T22:20:22.653 回答
0

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

于 2012-08-30T13:57:12.930 回答