मैंने कुछ त्वरित परीक्षण चलाए। मुझे सच में लगता है कि bind('evt_name', array($obj, 'callback_function'))
का उपयोग करके आप अपने बाइंड() फ़ंक्शन में असली कॉलबैक संग्रहीत करना बेहतर होगा।
एक var_dump/निकालने और हैश आईडी कार्यान्वयन:
function spl_object_hash_var_dump($object){
if (is_object($object)){
ob_start();
var_dump($object);
$dump = ob_get_contents();
ob_end_clean();
if (preg_match('/^object\(([a-z0-9_]+)\)\#(\d)+/i', $dump, $match)) {
return md5($match[1] . $match[2]);
}
}
return null;
}
आप पूरी तरह नहीं बल्कि घटना बाइंडिंग के साथ संदर्भ भंडारण से spl_object_hash करना चाहते हैं, चाहते हैं, आप कुछ इस तरह देख रहे हैं एक अनुभवहीन संदर्भ कार्यान्वयन:
function spl_object_dumb_references(&$object) {
static $hashes;
if (!isset($hashes)) $hashes = array();
// find existing instance
foreach ($hashes as $hash => $o) {
if ($object === $o) return $hash;
}
$hash = md5(uniqid());
while (array_key_exists($hash, $hashes)) {
$hash = md5(uniqid());
}
$hashes[$hash] = $object;
return $hash;
}
यह एक मूल रूप से बोआ भर में वर्ग आधारित संदर्भ समारोह से 5-50x बदतर था rd, तो इसके बारे में चिंता करने लायक नहीं है।
एक दुकान संदर्भ वर्ग कार्यान्वयन द्वारा:
function spl_object_hash_references(&$object) {
static $hashes;
if (!isset($hashes)) $hashes = array();
$class_name = get_class($object);
if (!array_key_exists($class_name, $hashes)) {
$hashes[$class_name] = array();
}
// find existing instance
foreach ($hashes[$class_name] as $hash => $o) {
if ($object === $o) return $hash;
}
$hash = md5(uniqid($class_name));
while (array_key_exists($hash, $hashes[$class_name])) {
$hash = md5(uniqid($class_name));
}
$hashes[$class_name][$hash] = $object;
return $hash;
}
और तुम results that look like this साथ खत्म। सारांश: कक्षा आधारित संदर्भ कार्यान्वयन एन/50 कक्षाओं के आसपास सबसे अच्छा प्रदर्शन करता है - यह सर्वोत्तम रूप से var_dump
आधारित कार्यान्वयन के प्रदर्शन को 1/3 खींचने का प्रबंधन करता है, और आमतौर पर अधिक खराब होता है।
var_dump
कार्यान्वयन सहनशील प्रतीत होता है, हालांकि आदर्श नहीं है। लेकिन अगर आप इन लुकअप में से बहुत कुछ नहीं कर रहे हैं, तो यह आपके लिए बाधा नहीं होगी। विशेष रूप से PHP < 5.2 बॉक्सन के लिए फ़ॉलबैक के रूप में।
आपको इसकी आवश्यकता क्यों है? हो सकता है कि वास्तविक समाधान आपके लिए आवश्यक न हो - जो आपके डिजाइन में कुछ समस्या का संकेत दे सकता है? –
मैं एक सीएमएस पर काम कर रहा हूं और एक 'घटना' प्रणाली का निर्माण कर रहा हूं। निम्नलिखित कोड का उपयोग करके ईवेंट ट्रिगर किया जा सकता है: 'ट्रिगर (' evt_name ', नया इवेंट()) '। सीएमएस प्लगइन्स 'बाइंड (' evt_name ',' callback_function ') का उपयोग कर सिस्टम इवेंट्स को' बाध्य 'कर सकते हैं। मैं जो करना चाहता हूं वह उन दोनों कार्यों में एक और तर्क जोड़ता है जो घटना को स्वीकार करते हैं कि ईवेंट को बाध्य किया जाना चाहिए, लेकिन ईवेंट डेटा (ऑब्जेक्ट के बाहर) को स्टोर करने के लिए मुझे इसे एक अद्वितीय स्ट्रिंग में बदलने की आवश्यकता है सरणी कुंजी आपके क्या विचार हैं? – Rowan
मेरे पास वास्तव में इसका कोई जवाब नहीं है, लेकिन मुझे और जानने में मदद मिल सकती है * (यहां तक कि अगर मुझे ^^ नहीं) * - कोई फर्क नहीं पड़ता कि, हालांकि, मुझे कभी भी किसी भी प्रकार की " एक वस्तु के लिए अद्वितीय आईडी "; हो सकता है कि आप केवल ऑब्जेक्ट के संदर्भ को स्टोर कर सकें? –