2017-01-23 4 views
3

범위가 개인으로 설정된 경우에도 $ 버전으로 표시되는 이유는 print_r 일 수 있습니까?print_r은 private var를 표시합니다. 왜?

class myClass { 

    private $version; 

    public function set_version($value){ 
     $this->version = $value; 
    } 


} 



$class = new myClass(); 
$class->set_version("1.2"); 

echo "<pre>"; 
print_r($class); 
+0

private' '객체 속성은 클래스 상속 및 내부 영역의 맥락에서 주로 만. – Martin

+0

'private'은 "secure"를 의미하지 않는다. 이 속성 *을 사용해야하는 방법에 대한 지표 일 뿐이며 실제 "보안"또는 사실 "실제 개인 정보"를 제공하지 않습니다. – deceze

+0

@deceze Private은 특정 클래스에서만 var 또는 함수의 값을 읽고 업데이트 할 수 있음을 의미합니다. 왜 print_r이 여전히 그것을 볼 수 있는지 궁금해하는 이유 –

답변

4

print_r()은 디버깅 목적으로 개인 회원 속성을 보여줍니다. 표시 목적으로 (예 :보기/페이지에서) 객체를 출력하는 데 사용해서는 안됩니다. 객체에 대한 정보를 표시하려면 적절한 정보를 반환하는 메소드 (예 : toString)를 만드는 것이 적절할 수 있습니다.

인 print_r(), var_dump()var_export()은 보호와 개체의 개인 속성이 표시됩니다. 정적 클래스 멤버는 표시되지 않습니다. 1

+0

정적 클래스가 아닌 이유는 무엇입니까? – TheCrazyProfessor

+0

고마워요! : D 잘 @ TheCrazyProfessor thats 좋은 질문. –

+0

@ TheCrazyProfessor 나는 내부 저장 물체라고 추정합니다. 어쩌면 PHP는 하나의 객체에 클래스 정의와 함께 정적 변수를 저장하고 그 클래스의 인스턴스는 별도의 객체에 있습니다 ... 정말로 원하는 경우 [Reflection 클래스] (http://php.net/)를 사용할 수 있습니다. manual/en/reflectionclass.construct.php) ([이 답변보기] (http://stackoverflow.com/questions/8763994/how-can-i-get-a-list-of-static-variables-in-a) -class # answer-8764052) 자세한 내용은 다음을 참조하십시오. –

0

또한, 현재의 PHP를 사용하면 무시하거나 어떤 print_r(), var_dump() 출력을 구체화 할 수있는 __debugInfo()을 사용할 수 있습니다 5.6.0.

예를 들어 json 인코딩 및 디코딩을 사용하면 public 속성 만 반환 할 수 있습니다.

<?php 
class myClass { 

    private $private_var; 

    public $public_var = 'Foobar'; 

    public function setPrivate($value) 
    { 
     $this->private_var = $value; 
    } 

    public function __debugInfo() 
    { 
     return json_decode(json_encode($this), true); 
    } 
} 

$class = new myClass(); 
$class->setPrivate("Baz"); 

print_r($class); 

https://3v4l.org/seDI6

결과 :

myClass Object 
(
    [public_var] => Foobar 
)