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
दोनों का एक ही रिफाउंट और संदर्भ ध्वज सेट है। फिर, यह जांचने के लिए एक बदलता है कि क्या अन्य परिवर्तन (इंगित करते हैं कि वे एक ही संदर्भ हैं)।
आप देख सकते हैं दो चर एक दूसरे के संदर्भ हैं: 'var_export से आउटपुट को कैप्चर http://stackoverflow.com/a/18110347/632951 – Pacerier