2009-08-18 2 views
3

클래스의 다른 인스턴스가 서로의 개인 멤버 변수를 알 수있는 것처럼 보입니다.PHP 범위와 클래스 인스턴스 상호 작용

나는 내 문제를 선전하려는 몇 가지 코드를 제공했으며이를 설명하려고 노력할 것입니다.

개인 멤버 변수 $hidden이있는 클래스가 있습니다. modifyPrivateMember$hidden의 값을 3으로 설정합니다. accessPrivateMemberObject을 매개 변수로 사용하고 개인$hidden 구성원에 액세스하여 값을 반환합니다.

예제 코드 :

$ php example.php 
3 

사람이 객체의 private 멤버가 같은 클래스의 다른 인스턴스가 액세스 할 수있는 이유를 설명 할 수 : 위의 코드의

<?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

지금까지 답변을 통해 코드가 예시 한 내용을 알려주었습니다. 나는 정말로 * 왜 * 물건이 이런 식의 질문에 대한 답을 찾고 있습니다. 가시성이 클래스가 아닌 객체가 아닌 이유는 무엇입니까? 어떤 장점이 있습니까? –

+0

지금 당장 추측하고 있지만 PHP는 수정 자 동작을 포함하여 java에서 할당합니다. 어쩌면 자바는 타입 시스템 때문에 클래스 레벨에서 그것을해야한다. 어쩌면 루비가 인스턴스 수준에서이를 수행 할 수있는 이유를 설명 할 수 있습니다. 그러나 다시 그저 추측. – MrHus

답변

3

private은 해당 개체뿐만 아니라 해당 클래스로만 제한된다는 것을 의미합니다.

3

PHP의 작동 방식입니다. Java 작동 방식과 동일합니다. 자세한 내용은 http://php.net/manual/en/language.oop5.visibility.php을 참조하십시오.

+0

Java가 이와 같이 작동한다는 사실은 실제로 PHP가 똑같이 작동하는 이유에 대한 유효한 대답 일 수 있습니다. 그러나 모든 언어에 적용되는 실제 답변을 아는 것은 흥미 롭습니다. –

1

이 동작 유용 듯하는 유일한 상황은 factory 기능에 있었다 : 심지어이 경우

class Object 
{ 
    private $state; 

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

,이 범위의 위반,하지만하지 않는 것이 거기에 더 나은 솔루션이며, 나는 당신과 동의 그건 내 생각에 커. 결국 클래스를 작성하는 사람은 인수로 전달 된 객체에서 비공개 멤버에 액세스해야하는지 결정합니다. 그래서, 그것은 (심지어 나에게) 쓸모없는 것처럼 보일지 모르지만 결코 알지 못합니다. 내부를 서브 클래스 나 다른 것에 노출시키는 것과는 다릅니다. 그것은 모두 같은 학급에서 일어나며, 당신이하는 일은 당신의 사업입니다.

그런데 객체 당 액세스 수정자를 구현하고 클래스 당이 아닌 하나의 언어는 Ruby입니다.