2009-10-09 16 views
6

मैं call_user_func_array के साथ एक फ़ंक्शन कॉल करना चाहता हूं लेकिन मैंने देखा कि यदि कोई तर्क फ़ंक्शन परिभाषा में एक संदर्भ है और call_user_func_array में एक साधारण मान है, तो निम्न चेतावनी प्रकट होती है: चेतावनी: परीक्षण करने के लिए पैरामीटर 1() होने की उम्मीद है संदर्भ, मूल्य दियाPHP कैसे पता चलेगा कि एक चर संदर्भ है?

यहाँ मुझे क्या करना कोशिश कर रहा हूँ का एक सरल उदाहरण है:

<?php 
$a = 0; 
$args = array($a); 
function test(&$a) { 
    $a++; 
} 
$a = 0; 
call_user_func_array('test', $args); 
?> 

मेरे सवाल यह है: मैं कैसे पता कर सकते हैं अगर एक मूल्य (इस मामले में $ की आर्ग पहला मान) एक संदर्भ है या नहीं?

उत्तर

2

इस पीएचपी प्रलेखन पृष्ठ पर बाहर टिप्पणी की जांच:

http://php.net/manual/en/language.references.spot.php

+1

सभी मैं देख अगर दो सरणियों/वस्तुओं/चर संशोधित और अगर जाँच करके एक ही स्मृति क्षेत्र को इंगित कर रहे कार्यों की जांच करने के लिए है दूसरा भी संशोधित है। मेरे कोड में (उदाहरण नहीं, असली एक), मेरे पास केवल तर्कों की सरणी है और मैं जानना चाहता हूं कि एक तर्क एक संदर्भ है या नहीं। इस तरह, अगर कॉलबैक फ़ंक्शन एक संदर्भ चाहता है तो मैं एक त्रुटि फेंक सकता हूं और सरणी में एक साधारण मान होता है। –

+0

यह पहले से ही एक चेतावनी ट्रिगर करता है, जो डेवलपर्स के लिए है। आप किस तरह की त्रुटि चाहते हैं? यदि आप – cmbuckley

4

नहीं है, इस मुद्दे को समारोह के पहले पैरामीटर है वह यह है कि पारित-दर-संदर्भ (समारोह अर्थ में तर्क संशोधित कर सकते हैं कॉलर का दायरा)। इसलिए, आपको एक चर या कुछ पास करना होगा जो पहले तर्क के रूप में असाइन करने योग्य है। जब आप array($a) जैसे सरणी बनाते हैं, तो यह सरणी में एक स्लॉट में परिवर्तनीय $a (जो 0 है) के मान की प्रतिलिपि बनाता है। यह किसी भी तरह से परिवर्तनीय $a पर वापस संदर्भित नहीं करता है। और फिर जब आप फ़ंक्शन को कॉल करें, यह है के रूप में यदि आप इस, कर रहे हैं जो काम नहीं करता:

test(0) 

तुम सच में करने के लिए, आप संदर्भ द्वारा सरणी में $a डाल सकता है चाहता है तो, लेकिन यह थोड़े मुश्किल है :

<?php 
$a = 0; 
$args = array(&$a); 
function test(&$a) { 
    $a++; 
} 
call_user_func_array('test', $args); 
?> 

आप कैसे कहेंगे कि सरणी तत्व एक संदर्भ है ... यह कठिन है। आप सरणी पर var_dump() कर सकता है, और "&" प्रतीक की खोज:

> var_dump($args); 
array(1) { 
    [0]=> 
    &int(1) 
} 
+0

व्यवहार को बदलना चाहते हैं तो आप [कस्टम त्रुटि हैंडलर सेट कर सकते हैं] (http://php.net/set_error_handler) हाँ, मुझे पता है कि कोड इस तरह से काम करता है। मैं बस यह सुनिश्चित करने का एक तरीका चाहता था कि $ args array (जिसमें कुछ भी शामिल हो, क्योंकि मेरे कोड में यह किसी अन्य फ़ंक्शन द्वारा पारित किया गया है) को कॉल_user_func_array पर कॉल करने पर किसी भी त्रुटि से बचने के लिए इस तरह से बनाया गया है। यही कारण है कि मैं जानना चाहता था कि कैसे जांचें कि सरणी में चर संदर्भ थे या नहीं। –

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