2010-07-09 4 views
9

print_r에서 특정 클래스 필드를 숨길 수 있습니까?print_r 또는 var_dump에서 특정 클래스 필드 숨기기

<?php 

class DataManager { 
    public $data = array(); 
} 

class Data { 
    public $manager; 
    public $data = array(); 

    public function Data ($m, $d) { 
     $this->manager = $m; 
     $this->data = $d; 
    } 
} 

$manager = new DataManager(); 

for ($a = 0; $a < 10; $a++) { 
    $manager->data[] = new Data($manager, 'Test ' . md5($a)); 
} 

echo '<pre>'; 
print_r($manager); 

?> 

이 인쇄 할

DataManager에 개체 ( [데이터] => 배열 ( [0] => 데이터 오브젝트 ( [관리자] => DataManager에 개체 재귀 [데이터] => 테스트 cfcd208495d565ef66e7dff9f98764da )

 [1] => Data Object 
      (
       [manager] => DataManager Object *RECURSION* 
       [data] => Test c4ca4238a0b923820dcc509a6f75849b 
      ) ....... 

어떻게 든 출력 동작을 변경하여 인쇄 할 수 있습니까? DocComment/** @hidden **/

DataManager에 개체 ( [데이터] => 배열 ( [0] => 데이터 오브젝트 ( [데이터] => 시험 cfcd208495d565ef66e7dff9f98764da )

와 마찬가지로
 [1] => Data Object 
      (
       [data] => Test c4ca4238a0b923820dcc509a6f75849b 
      ) 

하지 않으면, 어쩌면 반사를 사용하는 PHP lib 디렉토리의 어떤 종류가 어떻게 든이 무시 물건?

,

감사합니다.

+0

표시 할 수있는 항목과 그렇지 않은 항목은 어떻게 결정됩니까? – salathe

답변

18

를 도입하면 위해서 var_dump의 기본 동작을 수정 할 수 있습니다() 개체를 덤프 할 때.

documentation을 살펴보십시오.

예 :

<?php 
class C { 
    private $prop; 

    public function __construct($val) { 
     $this->prop = $val; 
    } 

    public function __debugInfo() { 
     return [ 
      'propSquared' => $this->prop ** 2, 
     ]; 
    } 
} 

var_dump(new C(42)); 
?> 

반환 값 :이 질문은 4 세입니다

object(C)#1 (1) { 
    ["propSquared"]=> 
    int(1764) 
} 

있지만, 나는 누군가가 앞으로이 유용 할 것이라 확신합니다.

+2

"누군가가 이것을 유용하게 사용할 수있을 것이라고 확신합니다" - 예, 예 : –

+3

특정 속성 (예 : 'app')을 숨기려면이 코드가 유용 할 수 있습니다. public function __debugInfo() { $ 결과 = get_object_vars ($ this); unset ($ result [ 'app']); return $ result; } ' –

2

print_r()과 var_dump() 모두 당신에게 모든 것을 제공합니다.

다양한 Reflection 클래스는 클래스, 메소드 및 속성에 /** doc comment */을 얻으려는 방법이 getDocComment()입니다.

닥터 코멘트를 사용하여 출력 할 내용과 출력하지 말아야 할 것을 나타 내기 때문에 덤핑 클래스를 만들어 원하는 것을 얻을 수 있습니다.

+1

수정 : 정적 속성을 제외하고 모든 것을 제공합니다. PHP 문서에서 이것은 [print_r] (http://php.net/manual/en/function.print-r.php)에만 지정되어 있지만'var_dump'도 같은 방식으로 동작합니다. –

0

예, 내부적으로 만 사용됩니다. get_properties 처리기에서 반환 된 해시 테이블의 관련 속성을 노출하지 않는 것이 중요합니다.

__get 처리기 뒤에 속성을 숨길 수도 있지만 여전히 데이터를 어딘가에 저장해야하며 __get은 성능 (및 선명도) 패널티가 있습니다.

0

비록이 솔루션에 대한 귀하의 요구에 대해 작동하거나 얼마나 효율적인지 모르겠지만 그것이 작동하는 것 같습니다.

내가 한 것은 클래스의 변수를 단일 정적 변수가있는 함수로 변경 한 것입니다.

여기에 빠른 예제 :

<?php 
header('Content-type: text'); 
class myClass { 
    public $visibleVar; 

    function hiddenVar($set_to_new_val=null){ 
     static $theVariable; 

     if(is_null($set_to_new_val)) 
      return $theVariable; 

     $theVariable = $set_to_new_val; 
    } 
} 

$test = new myClass; 

$test->visibleVar = range(1,5); 
print_r($test); 
print_r($test->visibleVar); 


$test->hiddenVar(range(100,105)); 
print_r($test); 
print_r($test->hiddenVar()); 

?> 

출력 :

myClass Object 
(
    [visibleVar] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
      [3] => 4 
      [4] => 5 
     ) 

) 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
) 
myClass Object 
(
    [visibleVar] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
      [3] => 4 
      [4] => 5 
     ) 

) 
Array 
(
    [0] => 100 
    [1] => 101 
    [2] => 102 
    [3] => 103 
    [4] => 104 
    [5] => 105 
) 
+0

이것은 깔끔한 아이디어입니다. 그러나 myClass 인스턴스가 두 개 이상있는 경우에는 hiddenVar 메서드의 정적 변수가 모든 인스턴스에 적용됩니다. –

0

내가 클래스의 여러 객체와 함께 작동하도록 확장 할 Meir's solution에 내장.여기 내 솔루션입니다 : 새로운 매직 방법 __debugInfo()는 PHP 5.6

<?php 
header('Content-type: text'); 
class myClass { 
    public $visibleVar; 
    private static $hiddenVarMap = array(); 
    private $hiddenVarKey; 

    function hiddenVar($set_to_new_val=null){ 
     if(empty($this->hiddenVarKey) { 
      $this->hiddenVarKey = sha1(rand()); 
     } 
     if(!empty($set_to_new_val)){ 
      self::$hiddenVarMap[$this->hiddenVarKey] = $set_to_new_val; 
     } 

     return self::$hiddenVarMap[$this->hiddenVarKey]; 
    } 
} 

$test = new myClass; 

$test->visibleVar = range(1,5); 
print_r($test); 
print_r($test->visibleVar); 


$test->hiddenVar(range(100,105)); 
print_r($test); 
print_r($test->hiddenVar()); 

?> 
0

간단한 폐쇄를 사용하여 중요한 데이터를 숨길 수 있습니다.

class PrivateValue { 
    private $val; 
    public function __construct($val) { 
     $this->val = function() use ($val) { return $val; }; 
    } 
    public function getValue() { 
     return ($this->val)(); 
    } 
    public fucntion __debugInfo() { 
     return [ 'val' => '***' ]; // TODO 
    } 
} 

가치보다는 종결자를 저장하면 내가 생각할 수있는 모든 것의 가치를 숨길 수 있습니다. 그런 다음 getter는 클로저를 호출하여 값을 검색합니다. __debugInfo 메서드는 개발자에게 유용하지만 안전한 표현을 제공하므로 var_dump에 표시됩니다. var_export와 같은 처리되지 않은 기능은 '폐쇄'를 표시하지만 boud 값은 표시하지 않습니다.

일부 도구는 너무 열심히 시도하고 이러한 데이터도 파기합니다.

다른 답변에서 영감을 얻었습니다. - 고맙습니다!