2010-07-09 25 views
9

¿Es posible ocultar un campo de clase específico de print_r?Ocultar campos de clases específicas de print_r o 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); 

?> 

Esto imprimiría

DataManager Objeto ( [datos] => Array ( [0] => Objeto de Datos ( [director] => DataManager objeto RECURSION [datos] => Prueba cfcd208495d565ef66e7dff9f98764da )

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

¿Es posible cambiar el comportamiento de salida de alguna manera para que la impresión sea así? Al igual que con DocComment/** ** @Hidden/

DataManager Objeto ( [datos] => Array ( [0] => Objeto de Datos ( [datos] => cfcd208495d565ef66e7dff9f98764da prueba )

 [1] => Data Object 
      (
       [data] => Test c4ca4238a0b923820dcc509a6f75849b 
      ) 

Si no, ¿hay algún tipo de PHP lib que tal vez utiliza la reflexión y de alguna manera no pasa por cosas?

Gracias

+0

¿Cómo se determina qué se permite que sea visible y qué no? – salathe

Respuesta

18

Nuevo método mágico __debugInfo() se introdujo en PHP 5.6 que permitirá modificar el comportamiento predeterminado de var_dump() al descargar sus objetos.

Eche un vistazo a documentation.

Ejemplo:

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

devoluciones:

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

Aunque esta pregunta es de 4 años de edad, estoy seguro de que alguien va a resultar útil en el futuro.

+2

"Estoy seguro de que alguien va a resultar útil en el futuro" - Sí, lo hice :) –

+3

Si desea ocultar una propiedad específica (digamos 'app') este código podría ser útil: ' función pública __debugInfo() { $ result = get_object_vars ($ this); unset ($ result ['app']); return $ result; } ' –

2

Tanto print_r() como var_dump() le darán todo.

Varias clases Reflection tienen un método getDocComment() para obtener el /** doc comment */ para obtener clases, métodos y propiedades.

Utilizando los comentarios doc para denotar lo que debe y no debe ser la salida, se puede crear fácilmente una clase de dumping para lograr lo que quiere.

+1

Corrección: Dan todo, EXCEPTO por propiedades estáticas. En la documentación de PHP, esto solo está especificado para [print_r] (http://php.net/manual/en/function.print-r.php), pero 'var_dump' se comporta de la misma manera. –

0

Sí, pero solo internamente. Solo se trata de no exponer la propiedad relevante en la tabla hash devuelta por el controlador get_properties.

También puede ocultar la propiedad detrás de un controlador __get, pero aún debe almacenar los datos en alguna parte y __get tiene una penalización de rendimiento (y claridad).

0

Pensé en una solución a esto, no sé si funcionará para sus necesidades o cuán eficiente es, pero parece funcionar.

lo que hice fue cambiado de la variable en la clase para una función con una sola variable estática.

Aquí está un ejemplo rápido:

<?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()); 

?> 

Salida:

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

Esta es una buena idea. Sin embargo, si tuviera dos o más instancias de myClass, la variable estática dentro del método hiddenVar se aplicaría a todas las instancias. –

0

I edificados sobre Meir's solution extenderlo a trabajar con varios objetos de la clase.Aquí está mi solución:

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

Puede usar un cierre simple para ocultar los datos confidenciales.

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

Almacenar el cierre en lugar de valor oculta el valor de todo lo que se me ocurre. Luego, el comprador recupera el valor invocando el cierre. El método __debugInfo proporciona una representación útil pero segura para los desarrolladores, como lo mostrará var_dump. Las características no administradas como var_export mostrarán 'cierre', pero no el valor en voz alta.

Tenga en cuenta que algunas herramientas lo pruebo demasiado y saco estos datos también.

Tengo la inspiración de otras respuestas aquí. - ¡Gracias!

Cuestiones relacionadas