2012-02-06 70 views
1

我正在编程,遇到了这个问题: 在下面的代码示例中,公共函数设置了一个私有变量。现在人们会认为私有变量的内容是私有的,认为$ GLOBALS varriable(超全局)可以访问它,并且至少读取它。为什么?有没有一种方法可以做到这一点?为什么PHP私有类var不是私有的?

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

谢谢 杰弗里

+0

您在测试'$ GLOBALS ['b'] - > test'是否会引发致命错误吗?因为它应该。 – 2012-02-06 22:18:43

回答

4

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

所以原因是encapsulation,不是字面隐藏数据

+0

嗯,不知道...因此,由于$ GLOBALS包含对该对象的引用,所以想要例如第3方软件查看引用的方法是杀死它......感谢所有的信息!猜我有一些工作要做:) – Jeffrey 2012-02-06 22:35:22

+0

@Jeffrey:'$ GLOBALS'不会改变'private'关键字行为。从哪里获取对象的引用并不重要 – zerkms 2012-02-06 22:37:14

0

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

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

0

这根本是什么呢GLOBALS。它具有当前在脚本中定义的所有变量,无论它们在何处或如何定义。这包括私有变量。

0

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

相关问题