दिलचस्प पोस्ट
JSONObject के अंदर कई JSONObjects के एंड्रॉइड जे एसओएन पार्सिंग सी ++ में सरणियों या std :: vectors का उपयोग करना, प्रदर्शन अंतर क्या है? मैं वीबीए / प्रवेश को परिभाषित करने के लिए चर की आवश्यकता कैसे कर सकता हूं? क्यों एक संरचना उदाहरण से संपत्ति की निरंतर बाधाएं लेकिन कक्षा उदाहरण नहीं? क्यों IE में XPath पर सीएसएस का उपयोग करना चाहिए? आईओएस 6.0 में इंटरफ़ेस अभिविन्यास अपने डेटासॉर्स से एक सेल प्राप्त करने में विफल मैं मेसेफाइल में अंकगणित कैसे कर सकता हूं? कार्यक्षेत्र पाठ दिशा जेपीईजी छवि को सी # बेस 64 स्ट्रिंग रेगेक्स ईमेल सत्यापन बिना वर्जन वस्तु को नष्ट करना Android SHA1 रिलीज़ कीस्टोर Google मानचित्र के साथ काम नहीं कर रहा है के लिए __gxx_personality_v0 क्या है? IE डाउनलोड फ़ाइल

यह पता लगा रहा है कि PHP चर एक संदर्भ / संदर्भित है

PHP में एक तरीका है यह निर्धारित करने के लिए कि क्या कोई दिया वैरिएबल एक और चर के संदर्भ है और / या किसी अन्य चर द्वारा संदर्भित है? मुझे इसकी सराहना है कि php.net पर टिप्पणी के अनुसार "संदर्भ" और "संदर्भ से" पता लगाने में अलग नहीं हो सकता है, जो कि $a=& $b मतलब है " $ a और $ b बिल्कुल समान हैं। $ A है $ बी या इसके विपरीत की ओर इशारा करते हुए नहीं। $ a और $ b एक ही स्थान पर इशारा कर रहे हैं। "

यदि यह निर्धारित करना संभव नहीं है कि कोई दिए गए वेरिएबल संदर्भ / संदर्भित है, तो क्या यह निर्धारित करने का एक सामान्य तरीका है कि दो चर एक-दूसरे के संदर्भ हैं? दोबारा, php.net पर एक टिप्पणी ऐसी तुलना करने के लिए एक समारोह प्रदान करती है – हालांकि यह एक है जिसमें एक चर को संपादित करना और अन्य चर को इसी प्रकार प्रभावी किया गया है या नहीं। मैं संभवतः ऐसा करने से बचना चाहूंगा क्योंकि कुछ वैरिएबल जो मैं सोच रहा हूं जादू के गेटर्स / सेटर्स का भारी उपयोग करना चाहता हूं।

इस उदाहरण में अनुरोध की पृष्ठभूमि को संरचनाओं को विस्तार से देखने में मदद करने के लिए डीबगिंग फ़ंक्शन लिखना है।

Solutions Collecting From Web of "यह पता लगा रहा है कि PHP चर एक संदर्भ / संदर्भित है"

आप debug_zval_dump उपयोग कर सकते हैं:

 function countRefs(&$var) { ob_start(); debug_zval_dump(&$var); preg_match('~refcount\((\d+)\)~', ob_get_clean(), $matches); return $matches[1] - 4; } $var = 'A'; echo countRefs($var); // 0 $ref =& $var; echo countRefs($var); // 1 

यह हालांकि PHP 5.4 के रूप में अब और काम नहीं करेगा क्योंकि उन्होंने संदर्भ समर्थन से कॉल टाइम पास हटा दिया है और निम्न संस्करणों पर एक E_STRICT स्तर त्रुटि फेंक सकता है।

यदि आपको आश्चर्य है, जहां पर -4 में उपर्युक्त समारोह में आता है: तुम मुझे बताओ … मैंने इसे कोशिश कर लिया है। मेरी आँखों में यह केवल 3 (चर, मेरे फ़ंक्शन में चर, zend_debug_zval को पारित किया गया चर) होना चाहिए, लेकिन मैं PHP इंटरनल में बहुत अच्छा नहीं हूं और ऐसा लगता है कि यह मार्ग पर कहीं और संदर्भ बनाता है;)

पूरा काम उदाहरण:

 function EqualReferences(&$first, &$second){ if($first !== $second){ return false; } $value_of_first = $first; $first = ($first === true) ? false : true; // modify $first $is_ref = ($first === $second); // after modifying $first, $second will not be equal to $first, unless $second and $first points to the same variable. $first = $value_of_first; // unmodify $first return $is_ref; } $a = array('foo'); $b = array('foo'); $c = &$a; $d = $a; var_dump(EqualReferences($a, $b)); // false var_dump(EqualReferences($b, $c)); // false var_dump(EqualReferences($a, $c)); // true var_dump(EqualReferences($a, $d)); // false var_dump($a); // unmodified var_dump($b); // unmodified 

शायद xdebug_debug_zval () आपकी मदद करता है http://www.xdebug.org/docs/all_functions

संपादित करें: ऐसा लगता है कि मैंने इस प्रश्न का उत्तर दिया है 'क्या यह जांचना संभव है कि दो चर स्मृति में समान मूल्य का संदर्भ दे रहे हैं' नहीं, वास्तविक प्रश्न पूछा : पी


जहां तक ​​'सादा' चर का जवाब होता है, 'नहीं' है

जहां तक ​​वस्तुओं जाते हैं – शायद

सभी ऑब्जेक्ट डिफ़ॉल्ट रूप से संदर्भों द्वारा नियंत्रित किए जाते हैं। इसके अलावा प्रत्येक ऑब्जेक्ट में सीरियल नंबर होता है जिसे आप देख सकते हैं जब आप var_dump()

 >> class a {}; >> $a = new a(); >> var_dump($a); object(a)#12 (0) { } 

यदि आप किसी भी तरह इस # को प्राप्त कर सकते हैं, तो आप इसे दो चर के लिए प्रभावी ढंग से तुलना कर सकते हैं, और देखें कि क्या वे उसी ऑब्जेक्ट को इंगित करते हैं। सवाल यह है कि यह संख्या कैसे प्राप्त करें var_export() इसे वापस नहीं करता। मुझे Reflection कक्षाओं में कुछ भी नहीं दिख रहा है जो इसे या तो प्राप्त कर सकते हैं।

एक बात जो मेरे मन में आती है आउटपुट बफरिंग + रेगेक्स का उपयोग कर रही है

Xdebug_debug_zval () पर एक चोटी लें अभी, यह वास्तव में पता करने का एकमात्र तरीका है कि क्या आप चर के ज़वाल के बारे में सब कुछ निर्धारित कर सकते हैं

तो कुछ उपयोगी जानकारी निर्धारित करने के लिए यहां कुछ सहायक फ़ंक्शन हैं:

 function isRef($var) { $info = getZvalRefCountInfo($var); return (boolean) $info['is_ref']; } function getRefCount($var) { $info = getZvalRefCountInfo($var); return $info['refcount']; } function canCopyOnWrite($var) { $info = getZvalRefCountInfo($var); return $info['is_ref'] == 0; } function canReferenceWithoutCopy($var) { $info = getZvalRefCountInfo($var); return $info['is_ref'] == 1 || $info['refcount'] == 1; } function getZvalRefCountInfo($var) { ob_start(); xdebug_debug_zval($var); $info = ob_get_clean(); preg_match('(: \(refcount=(\d+), is_ref=(\d+)\))', $info, $match); return array('refcount' => $match[1], 'is_ref' => $match[2]); } 

तो कुछ नमूने चर के साथ:

 $a = 'test'; $b = $a; $c = $b; $d =& $c; $e = 'foo'; 

हम एक चर एक संदर्भ है अगर परीक्षण कर सकते हैं:

 isRef('a'); // false isRef('c'); // true isRef('e'); // false 

हम ज़वाल से जुड़े चर की संख्या प्राप्त कर सकते हैं (जरूरी नहीं कि एक संदर्भ, कॉपी-ऑन-लिखित के लिए हो सकता है):

 getRefCount('a'); // 2 getRefCount('c'); // 2 getRefCount('e'); // 1 

हम परीक्षण कर सकते हैं कि हम कॉपी-ऑन-लिखित (प्रतिलिपि मेमोरी कॉपी किए बिना कॉपी कर सकते हैं):

 canCopyOnWrite('a'); // true canCopyOnWrite('c'); // false canCopyOnWrite('e'); // true 

और हम परीक्षण कर सकते हैं कि हम zval को कॉपी किए बिना एक संदर्भ बना सकते हैं:

 canReferenceWithoutCopy('a'); // false canReferenceWithoutCopy('c'); // true canReferenceWithoutCopy('e'); // true 

और अब, हम कुछ काला जादू के माध्यम से एक चर संदर्भों को देख सकते हैं:

 function isReferenceOf(&$a, &$b) { if (!isRef('a') || getZvalRefCountInfo('a') != getZvalRefCountInfo('b')) { return false; } $tmp = $a; if (is_object($a) || is_array($a)) { $a = 'test'; $ret = $b === 'test'; $a = $tmp; } else { $a = array(); $ret = $b === array(); $a = $tmp; } return $tmp; } 

यह थोड़ा हैकी है क्योंकि हम यह निर्धारित नहीं कर सकते हैं कि दूसरे प्रतीक एक ही ज़ाल्व का संदर्भ देते हैं (केवल अन्य प्रतीकों का संदर्भ)। तो यह मूलतः यह देखने के लिए जांचता है कि $a का कोई संदर्भ है, और अगर $a और $b दोनों में एक ही रेफ्रैक्चर और संदर्भ फ्लैग सेट है। फिर, यह एक को बदलने के लिए बदलता है कि क्या अन्य परिवर्तन (इंगित करता है कि वे एक ही संदर्भ हैं)