2009-08-18 89 views
3

看起來好像類的不同實例可以知道彼此的私有成員變量。PHP範圍和類實例交互

我提供了一些試圖展示我的問題的代碼,我會試着解釋它。

我們有一個私有成員變量$hiddenmodifyPrivateMember$hidden的值設置爲3accessPrivateMemberObject作爲參數,訪問其私人$hidden成員返回其值。

示例代碼:

$ php example.php 
3 

任何人都可以解釋爲什麼對象的私有成員是同一類的其他實例訪問:上面的代碼

<?php 
// example.php 

class Object { 
    private $hidden; 

    public function modifyPrivateMember() { 
     $this->hidden = 3; 
    } 

    public function accessPrivateMember(Object $otherObject) { 
     return $otherObject->hidden; 
    } 
} 

$firstObject = new Object; 
$firstObject->modifyPrivateMember(); 


$otherObject = new Object; 
echo $otherObject->accessPrivateMember($firstObject); 

輸出?這種表面上違反範圍的理由是否存在?

+0

到目前爲止的答案剛告訴我代碼的例子。我真的正在尋找一個問題的答案*爲什麼*事情是這樣的。爲什麼可見性僅限於課堂而不是對象?這提供了什麼優勢? – 2009-08-18 20:32:50

+0

我只是現在猜測,但PHP借用java包括修飾符行爲。也許由於類型系統的原因,java必須在課堂上完成它。也許這就解釋了爲什麼ruby可以在實例級別上做到這一點。但它又是一個猜測。 – MrHus 2009-08-18 23:37:56

回答

3

private意味着它僅限於該類,而不僅限於該對象。

3

這就是php的工作原理。它和Java的工作方式一樣。有關更多信息,請參閱http://php.net/manual/en/language.oop5.visibility.php

+0

Java的工作原理實際上可能是一個有效的答案,爲什麼PHP的工作原理是一樣的。但知道適用於所有這些語言的真實答案是很有趣的。 – 2009-08-18 23:18:19

1

在這種行爲似乎是有用的唯一情況是在一個factory功能:

class Object 
{ 
    private $state; 

    public static function makeObject() 
    { 
     $obj = new Object; 
     $obj->state = 'some state'; 
     return $obj; 
    } 
} 

即使在這種情況下,有更好的解決方案,我同意你的看法,這是違反範圍,雖然沒有這在我看來很大。畢竟,編寫該類的人決定是否需要從作爲參數傳遞的對象訪問私有成員。所以,它可能看起來沒有用(甚至對我來說),但你永遠不知道。這不像你把你的內部暴露給子類或其他東西。這一切都發生在同一個班級,這是你的業務你在那裏做什麼。

順便說一句,一種語言爲每個對象而不是每個類實現訪問修飾符是Ruby。