2010-07-09 24 views
9

Có thể ẩn một trường lớp cụ thể khỏi print_r không?Ẩn các trường lớp cụ thể khỏi print_r hoặc 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); 

?> 

này sẽ in

DataManager Object ( [dữ liệu] => Array ( [0] => Object liệu ( [quản lý] => DataManager Object đệ quy [data] => Test cfcd208495d565ef66e7dff9f98764da )

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

Có thể bằng cách nào đó thay đổi hành vi đầu ra sao cho nó in như thế này? Giống như với DocComment/** @hidden **/

DataManager Object ( [dữ liệu] => Array ( [0] => Object liệu ( [dữ liệu] => Kiểm tra cfcd208495d565ef66e7dff9f98764da )

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

Nếu không, là có một số loại PHP lib rằng có lẽ sử dụng Reflection và bằng cách nào đó bỏ qua công cụ?

Cảm ơn

+0

Làm cách nào để bạn xác định nội dung nào được phép hiển thị và nội dung nào không được hiển thị? – salathe

Trả lời

18

mới kỳ diệu phương pháp __debugInfo() được giới thiệu vào PHP 5.6 mà sẽ cho phép bạn thay đổi hành vi mặc định của var_dump() khi bán phá giá đối tượng của bạn.

Hãy xem qua số documentation.

Ví dụ:

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

Returns:

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

Mặc dù câu hỏi này là 4 tuổi, tôi chắc chắn rằng ai đó sẽ tìm thấy điều này hữu ích trong tương lai.

+2

"Tôi chắc rằng ai đó sẽ thấy điều này hữu ích trong tương lai" - Có, tôi đã làm :) –

+3

Nếu bạn muốn ẩn một thuộc tính cụ thể (nói 'ứng dụng') mã này có thể hữu ích: ' __debugInfo() { $ result = get_object_vars ($ this); unset ($ result ['app']); trả về $ result; } ' –

2

Cả print_r() và var_dump() sẽ cung cấp cho bạn mọi thứ.

Các lớp Reflection khác nhau có phương thức getDocComment() để nhận các lớp học, phương pháp và thuộc tính.

Sử dụng chú thích doc để biểu thị những gì nên và không nên xuất, bạn có thể dễ dàng tạo ra một lớp bán phá giá để đạt được những gì bạn muốn.

+1

Correction: Chúng cung cấp mọi thứ EXCEPT cho các thuộc tính tĩnh. Trong tài liệu PHP, điều này chỉ được chỉ định cho [print_r] (http://php.net/manual/en/function.print-r.php), nhưng 'var_dump' hoạt động theo cùng một cách. –

0

Có, nhưng chỉ trong nội bộ. Nó chỉ là vấn đề không để lộ thuộc tính liên quan trong bảng băm được trả về bởi trình xử lý get_properties.

Bạn cũng có thể ẩn thuộc tính sau trình xử lý __get, nhưng bạn vẫn phải lưu trữ dữ liệu ở đâu đó và __get có hình phạt hiệu suất (và rõ ràng).

0

Tôi mặc dù một giải pháp cho điều này, tôi không biết nếu nó sẽ làm việc cho nhu cầu của bạn hoặc làm thế nào có hiệu quả nhưng nó có vẻ làm việc.

Điều tôi đã làm đã thay đổi biến trong lớp thành một hàm có một biến tĩnh đơn.

Dưới đây là một ví dụ nhanh:

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

?> 

Output:

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

Đây là một ý tưởng gọn gàng. Tuy nhiên, nếu bạn có hai hoặc nhiều phiên bản của myClass, biến tĩnh bên trong phương thức hiddenVar sẽ áp dụng cho tất cả các cá thể. –

0

tôi xây dựng dựa trên Meir's solution để mở rộng nó để làm việc với nhiều đối tượng của lớp.Đây là giải pháp của tôi:

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

Bạn có thể sử dụng tính năng đóng đơn giản để ẩn dữ liệu nhạy cảm.

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

Lưu trữ kết thúc thay vì giá trị ẩn giá trị khỏi mọi thứ tôi có thể nghĩ đến. Sau đó getter lấy giá trị bằng cách gọi đóng. Phương pháp __debugInfo cung cấp một số biểu diễn hữu ích nhưng an toàn cho các nhà phát triển dưới dạng var_dump sẽ hiển thị nó. Các tính năng không được xử lý như var_export sẽ hiển thị 'closure', nhưng không hiển thị giá trị boud.

Hãy nhớ rằng một số công cụ mà tôi thử quá khó và cũng tìm hiểu những dữ liệu này.

Tôi lấy cảm hứng từ các câu trả lời khác tại đây. - Cảm ơn bạn!

Các vấn đề liên quan