2010-07-09 15 views
9

से विशिष्ट वर्ग फ़ील्ड छुपाएं क्या प्रिंट_आर से विशिष्ट वर्ग फ़ील्ड छिपाना संभव है?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 
      ) 

यदि नहीं, तो वहाँ पीएचपी lib कि शायद प्रतिबिंब का उपयोग करता है किसी प्रकार का है और किसी भी तरह नजरअंदाज सामान?

धन्यवाद

+0

आप कैसे निर्धारित करते हैं कि क्या दिखने की अनुमति है और क्या नहीं है? – salathe

उत्तर

18

नई जादू विधि __debugInfo() पीएचपी 5.6में पेश किया गया था कि आप 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)); 
?> 

रिटर्न:

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

हालांकि इस सवाल का 4 साल पुराना है, मुझे यकीन है कि किसी को यह भविष्य में उपयोगी मिलेगा हूँ।

+2

" मुझे यकीन है किसी को भविष्य में इस उपयोगी मिल जाएगा हूँ " __debugInfo() { $ परिणाम = get_object_vars ($ यह); अनसेट ($ परिणाम ['ऐप']); $ परिणाम वापसी; } ' –

+3

आप ('ऐप्लिकेशन' कहते हैं) एक विशिष्ट संपत्ति को छुपाने के लिए इस कोड उपयोगी हो सकता है करना चाहते हैं - –

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 हैंडलर के पीछे संपत्ति को भी छुपा सकते हैं, लेकिन आपको अभी भी डेटा स्टोर करना होगा और में प्रदर्शन (और स्पष्टता) जुर्माना है।

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 के दो या दो से अधिक उदाहरण थे, तो छुपे हुए वार विधि के अंदर स्थिर चर सभी उदाहरणों पर लागू होगा। 'सार्वजनिक समारोह: हाँ, मैंने किया था :) –

0

मैं Meir's solution पर बनाया गया यह वर्ग के कई वस्तुओं के साथ काम करने के लिए विस्तार करने के लिए।यहाँ मेरी समाधान है:

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

मूल्य के बजाय बंद होने पर संग्रहीत करने से मूल्य जो कुछ भी मैं सोच सकता हूं उससे मूल्य छुपाता है। गेटटर फिर बंद करने का आह्वान करके मूल्य प्राप्त करता है। __debugInfo विधि डेवलपर्स के लिए कुछ उपयोगी लेकिन सुरक्षित प्रतिनिधित्व प्रदान करता है क्योंकि var_dump इसे दिखाएगा। Var_export जैसी अनचाहे विशेषताएं 'बंद' दिखाएंगी, लेकिन बाउड वैल्यू नहीं।

ध्यान रखें कि कुछ टूल मेरी कोशिश बहुत कठिन हैं और इन डेटा को भी खोदते हैं।

मुझे यहां अन्य उत्तरों से प्रेरणा मिली है। - धन्यवाद!

संबंधित मुद्दे