$el = array_shift($instance->find(..))
उपरोक्त कोड किसी तरह सख्त मानकों की चेतावनी की रिपोर्ट करता है, लेकिन यह नहीं होगा:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
तो यह वैसे भी चेतावनी कब रिपोर्ट करेगा?
$el = array_shift($instance->find(..))
उपरोक्त कोड किसी तरह सख्त मानकों की चेतावनी की रिपोर्ट करता है, लेकिन यह नहीं होगा:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
तो यह वैसे भी चेतावनी कब रिपोर्ट करेगा?
get_arr()
फ़ंक्शन) सख्त मानकों के नोटिस (PHP 5.2 और PHP 5.5 का परीक्षण ) का उत्पादन करता है ।
जवाबों:
निम्नलिखित कोड पर विचार करें:
error_reporting(E_STRICT);
class test {
function test_arr(&$a) {
var_dump($a);
}
function get_arr() {
return array(1, 2);
}
}
$t = new test;
$t->test_arr($t->get_arr());
यह निम्न आउटपुट उत्पन्न करेगा:
Strict Standards: Only variables should be passed by reference in `test.php` on line 14
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
कारण? test::get_arr()
विधि एक चर नहीं है और सख्त मोड के तहत यह एक चेतावनी उत्पन्न होगा। यह व्यवहार अत्यंत गैर सहज ज्ञान युक्त के रूप में है get_arr()
विधि देता है एक सरणी मूल्य।
सख्त मोड में इस त्रुटि को प्राप्त करने के लिए, या तो विधि के हस्ताक्षर को बदल दें ताकि यह एक संदर्भ का उपयोग न करे:
function test_arr($a) {
var_dump($a);
}
चूँकि आप अपना हस्ताक्षर नहीं बदल सकते हैं, array_shift
आप एक मध्यवर्ती चर का भी उपयोग कर सकते हैं:
$inter = get_arr();
$el = array_shift($inter);
current
यह धारणा बनाता है कि सरणी सूचक पहले तत्व पर है। यह ज्यादातर मामलों में एक मान्य धारणा हो सकती है, लेकिन एक को देखने के लिए।
array_shift()
जो यह संशोधित करने के लिए एक संदर्भ की उम्मीद करता है :-)
$intermediate
कोष्ठक की एक अतिरिक्त जोड़ी का उपयोग करके आप मूल्य से बच सकते हैं । $el = array_shift( ( get_arr() ) );
। देखें stackoverflow.com/questions/9848295/…
$instance->find()
एक चर के लिए एक संदर्भ देता है।
जब आप इस संदर्भ को किसी फ़ंक्शन में तर्क के रूप में उपयोग करने का प्रयास कर रहे हैं, तो इसे पहले एक चर में संग्रहीत किए बिना प्राप्त करें।
यह मेमोरी लीक को रोकने में मदद करता है और संभवतः अगले PHP संस्करणों में एक त्रुटि बन जाएगा।
यदि यह लिखा गया है तो आपका दूसरा कोड ब्लॉक एक त्रुटि फेंक देगा ( &
फ़ंक्शन हस्ताक्षर में ध्यान दें ):
function &get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
तो एक त्वरित (और इतना अच्छा नहीं) ठीक हो जाएगा:
$el = array_shift($tmp = $instance->find(..));
मूल रूप से, आप पहले एक अस्थायी चर के लिए एक असाइनमेंट करते हैं और चर को तर्क के रूप में भेजते हैं।
array_shift($tmp = $instance->find(..))
के मान को असाइन करता $instance->find(..)
है $tmp
और फिर असाइनमेंट के मूल्य को पास करता है है array_shift()
- जो कि $tmp
खुद को पारित करने के समान नहीं है, इसलिए असाइनमेंट के बिना मूल स्थिति से बेहतर नहीं है।
त्रुटि का कारण आंतरिक PHP प्रोग्रामिंग डेटा संरचनाओं फ़ंक्शन, array_shift () [php.net/end] का उपयोग है।
फ़ंक्शन एक पैरामीटर के रूप में एक सरणी लेता है। यद्यपि एक एम्परसेंड को array_shift()
मैनुअल के प्रोटोटाइप में दर्शाया गया है ", उस फ़ंक्शन की विस्तारित परिभाषा में निम्नलिखित कोई सावधानी संबंधी दस्तावेज नहीं है, न ही कोई स्पष्ट स्पष्टीकरण है कि पैरामीटर वास्तव में संदर्भ द्वारा पारित किया गया है।
शायद यह / समझा / है। हालांकि, मुझे समझ में नहीं आया, इसलिए मेरे लिए त्रुटि के कारण का पता लगाना मुश्किल था।
कोड पुन: प्रस्तुत करें:
function get_arr()
{
return array(1, 2);
}
$array = get_arr();
$el = array_shift($array);
यह कोड:
$monthly_index = array_shift(unpack('H*', date('m/Y')));
इसे में बदलने की आवश्यकता है:
$date_time = date('m/Y');
$unpack = unpack('H*', $date_time);
array_shift($unpack);
दूसरा स्निपेट या तो काम नहीं करता है और इसीलिए।
array_shift
एक संशोधक फ़ंक्शन है, जो इसके तर्क को बदलता है। इसलिए यह उम्मीद करता है कि इसका पैरामीटर एक संदर्भ होगा, और आप ऐसी चीज का संदर्भ नहीं दे सकते हैं जो एक चर नहीं है। रासमस के स्पष्टीकरण यहां देखें: सख्त मानक: केवल चर को संदर्भ द्वारा पारित किया जाना चाहिए
खैर, इस तरह के स्पष्ट मामलों में, आप हमेशा फ़ंक्शन के सामने "@" का उपयोग करके संदेशों को दबाने के लिए PHP बता सकते हैं।
$monthly_index = @array_shift(unpack('H*', date('m/Y')));
यह सभी को दबाने के लिए सर्वोत्तम प्रोग्रामिंग प्रथाओं में से एक नहीं हो सकता है इस तरह से त्रुटियों , लेकिन कुछ मामलों में (जैसे यह) यह काम आता है और स्वीकार्य है।
परिणामस्वरूप, मुझे यकीन है कि आपका मित्र 'सिस्टम प्रशासक' कम प्रदूषित होने से प्रसन्न होगा error.log
।