2012-02-06 38 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()僅用於調試目的,因此可以顯示任何對象引用的完整結構。 安全漏洞?也許,不要讓人們在生產環境中注入代碼或使用這些命令。

相關問題