2014-01-10 3 views
2

나는 이것이 php에 특정한 것보다 더 기본적인 OOP 질문 일 것 같다고 생각한다.PHP : PHP는 어떻게 객체 속성을 "확인"합니까?

인스턴스화 된 개체의 개인 속성 ($myObj->$privateProp)에 액세스하려고하면이 오류 ("Cannot access private property")가 표시됩니다. 이제는 내가 할 수 없다는 것을 알았지 만, PHP가이 객체가 privateProp이라는 사적인 속성을 가지고 있음을 어떻게 알 수 있는지 궁금합니다. 속성이 표시되어서는 안되기 때문에 Undefined property과 같은 오류가 발생할 것으로 예상 되었습니까?

+0

개인 정보는 기본적으로 공개되지 않으므로 비공개로 선언 될 수 있습니다. 따라서 PHP가 알고있는 방법을 묻는 것은 특별히 비공개로 선언하지 않는 한별로 의미가 없지만 어떻게 든 보이게됩니다. "PHP는 어떻게 알습니까?"는 의미를 확인하기는 어렵습니다. PHP는 $가 변수의 시작임을 어떻게 알 수 있습니까? 그것이 언어가 해석하는 방식이기 때문입니다. 그것은 주어진 규칙을 따른다. –

답변

4

PHP는 모두를 알고 있으며, 모든 것을 볼 수 있습니다. 적어도 시스템은 그렇지 않습니다.

가장 간단한 예는 자신의 컴퓨터와 운영 체제를 비교하는 것입니다. 파일을 "숨김"으로 표시하면 시스템이 사용자 및 다른 사용자로부터 파일을 숨기지 만, 전체 시간을 알 수 있습니다.

PHP는 스크립트 뒤에 숨겨진 컨트롤러입니다. 객체 간의 언어 사양 및 상호 작용 규칙을 적용합니다.

코드가 실제로하고있는 일은 PHP가 객체에 개인 속성이 있음을 표시하도록 요청하여 클래스/상속 액세스 외부에서 객체를 보호하도록하는 것입니다. 어떤 것 또는 누군가가 (당신을 포함해서) 그것을 접근하려고 할 때, PHP는 당신이 이미 그 속성을 private으로 표시하도록 요청했기 때문에 그렇게 할 수 없다고 친절하게 상기시킵니다.

"개인"이 비밀을 의미하지 않는다는 것을 이해하는 데 도움이됩니다! 리플렉션과 같은 것을 사용하면 모든 것을 액세스하고 변경할 수 있습니다.

개인, 공개, 상수 및 온 가족은 "부작용"을 피하고 개체 사용을 단순화하는 것에 관한 것입니다. 따라서 getName()을 사용하고 이름의 내부 구조에 대해 걱정할 필요가 없습니다/검색/생성), 비밀 및 보안 제공에 관한 것이 아닙니다.

당신이하지 말라는 것이 최선의 일을하지 않도록하고, 시스템에서 임의로 코드를 실행하는 악의적 인 스크립트 또는 사용자로부터 비밀을 보호하는 것이 아닙니다! PHP는 그로부터 보호를 제공하지 않습니다. 공개/개인/보호가 의미하는 것이 아닙니다. 일단 프로그래밍에 적용되지 않는 단어의 의미를 지나치게되면 이해하기가 더 쉽습니다!

+0

감사합니다, 이것들은 PHP가 시행하는 규칙이라는 생각은 나에게 의미가 있습니다. – red888

0

두 번째 $는 필요하지 않습니다.

$myObj->privateProp 

현재 코드는 $ privateProp 값을 속성 이름으로 사용하고 있습니다.

class bar { 
    $foo = "bar"; 
} 

$privateProp = 'foo'; 
echo $myObj->$privateProb; // "bar" 
+0

사실이지만 질문과 전혀 관련이 없습니다. – lonesomeday

+0

그건 그가 묻고있는 것이 아닙니다. 또한 변수가 속성 이름과 일치하는 경우 유효한 구문이 될 수 있습니다. – Frug

1

개체를 var_dump()하면 표시 여부에 상관없이 개체의 모든 목록을 얻을 수 있습니다. 실제로는 사유 재산에 액세스하거나 그 재산의 가치를 볼 수 없다는 점에서 "접근성"으로 생각해야합니다. 그러나 당신은 그 물건이 그 재산을 가지고 있으며 그것이 사적이라는 것을 알 수 있습니다.

관련 문제