2011-08-16 6 views
5

स्वीकार करता है मैंने PHP मैनुअल में कुछ विसंगतियों को देखा है; संदर्भ के द्वारा तर्क स्वीकार करने के लिए कई कोर फ़ंक्शन हस्ताक्षर दस्तावेज किए जाते हैं, हालांकि वे मान द्वारा तर्क स्वीकार करते हैं।PHP कोर फ़ंक्शन तर्क; मैनुअल संदर्भ कहता है, हालांकि यह मान

मैं पहले एक और अधिक specific question तैनात है, और @cweiske एक महान जवाब (उचित पीएचपी स्रोत के संदर्भ में ) प्रदान की तथापि इन विसंगतियों अधिक बड़े पैमाने पर दिखाई देते हैं।

कार्यों है कि इस से प्रभावित हैं की एक संख्या हैं;

  • http://www.php.net/manual/en/function.current.php
      (मैं वारंट के रूप में इस सूची को अपडेट कर देंगे यह भी ध्यान रखें, इन परीक्षणों एक error_reporting(-1) पर्यावरण में किया गया था)
    • यह पहले से ही जुड़ा हुआ सवाल
  • http://www.php.net/manual/en/function.key.php पर चर्चा की गई थी
    • यह पहले से ही जुड़ा हुआ सवाल
  • http://www.php.net/manual/en/function.array-replace-recursive.php
    • array  array_replace_recursive  ( array  &$array  , array  &$array1  [, array  पर चर्चा की गई थी &$ ... ] )
    • , तर्क $array, $array1, आदि स्वीकार मूल्य द्वारा। इसे ठीक किया गया है।
  • http://www.php.net/manual/en/function.array-multisort.php
    • bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )
    • , तर्क $arr, आदि स्वीकार मूल्य द्वारा। यह एक त्रुटि फेंकना चाहिए, क्योंकि तर्क एक चर नहीं है, तो यह कुछ भी नहीं करेगा।

अब मेरा सवाल है, इसलिए नहीं कि मैं प्रलेखन के बारे में गुदा जा रहा हूँ, लेकिन क्योंकि मुझे डर है कि पीएचपी devs इन कार्यों के कार्यान्वयन के विवरण के बारे में बाड़ (या कुछ और भी उतना ही अविश्वसनीय पर हैं)

उदाहरण के लिए, मैं array_replace_recursive() का उपयोग करता हूं, एक सरणी तर्क लेने के लिए, और इसे डिफ़ॉल्ट वाले अन्य सरणी के विरुद्ध लागू करता हूं। मेरी codebase में से कुछ इस विसंगति का लाभ उठाया है, बस करने के लिए:

$values = array_replace_recursive(array(
    'setting_1' => array(
     'sub-setting_1' => '', 
     'sub-setting_2' => '', 
     'sub-setting_3' => '', 
    ), 
    'setting_2' => array(
     'sub-setting_1' => 0, 
     'sub-setting_2' => 0, 
    ), 
    'setting_3' => true, 
), $values); 

इस प्रकार

मैं इस पर विचार करना होगा (करीब नि: शुल्क isset() कॉल पाने के लिए ) उचित रूप से स्वरूपित सरणी का निर्माण? मैं एक दस्तावेज संबंधी बग अनुरोध सबमिट करने के बारे में सोच रहा हूं, लेकिन अगर मैं SO (आपकी दिशा में देख रहा हूं तो @ cweiske) पर कोई भी व्यक्ति उत्सुक हूं, पर अंतर्दृष्टि है क्यों यह किया गया है।

उत्तर

2

शायद मैं आपकी दुविधा को समझ नहीं रहा हूं, लेकिन वे फ़ंक्शन सीधे अपने पैरामीटर में डेटा को संशोधित नहीं करते हैं, इसलिए क्या वे संदर्भ या मान के माध्यम से स्वीकार करते हैं, यह एक महत्वपूर्ण बिंदु है? अगर आप वास्तव में पर फंक्शन कॉल चाहते हैं तो आपके लिए कुछ भी रिटर्न वैल्यू असाइन करने की आवश्यकता होगी। आपके लिए कुछ भी करें।

में अंतर्दृष्टि के संदर्भ में आपको विसंगति दिखाई दे रही है। PHP 5 में संदर्भ कार्यों के तरीके में किए गए कई बदलाव हुए हैं। असल में मेरा मानना ​​है कि यह PHP 5.3+ है जो अब संदर्भ द्वारा असाइन करने के लिए & के कुछ उपयोगों की अनुमति नहीं देता है। संदर्भ कार्य के बारे में नए नियमों का अनुपालन करने के लिए आप जो कुछ देख रहे हैं वह PHP कोर फ़ंक्शंस में से कुछ का संक्रमण है। अगर स्मृति मेरी सेवा करती है, तो PHP 5.3 शाखा वास्तव में PHP 6 होने का इरादा था, लेकिन निश्चित रूप से कई जटिल सुविधाओं को समाप्त करने की प्रतीक्षा करने के बजाय शाखा के रूप में ट्रंक में विलय कर दिया गया था। यह इस बात का कारण होगा कि आपने PHP में पहले इस तरह भ्रम क्यों नहीं देखा है।

+0

धन्यवाद @ ब्रायन - मेरा दुविधा, यह मुद्दा इस तथ्य के लिए मंथन नहीं है कि PHP देवताओं ने स्पष्ट रूप से यह दस्तावेज किया होगा क्योंकि क्षितिज में परिवर्तन है। यदि फ़ंक्शन * तर्कों को संशोधित नहीं करता है, तो संदर्भ के अनुसार उन्हें परिभाषित क्यों करें? यदि फ़ंक्शन * तर्कों को संशोधित करता है, तो पास किए गए मान क्यों स्वीकार करते हैं? यदि यह एक दस्तावेज़ीकरण निरीक्षण है, और 5.4 के साथ, सभी संस्करण परिवर्तन/शाखाओं के साथ, (* जैसा आपने बताया है; 5.3, 6.0, आदि *) तो यह पूरी तरह समझ में आता है। हालांकि कार्यान्वयन मूल्यों को पारित करने की अनुमति देता है। यह सही प्रतीत नहीं होता है, और मैं सिर्फ यह जानना चाहता हूं कि क्यों। – Dan

+0

आह मैं देखता हूं कि आप अपनी चिंता के साथ कहां जा रहे हैं, तो यह है कि यदि वे इन कार्यों को संशोधित करने का इरादा रखते हैं तो उन्हें संदर्भ के रूप में अपने पैरामीटर लेने की अनुमति देकर काम करना होगा और कार्य के परिणाम की आवश्यकता के बजाय सीधे उन पर काम करना होगा लौटा हुआ? मैं देख सकता था कि यह एक मुद्दा कैसे हो सकता है: दुर्भाग्यवश मैं ऐसे व्यक्ति भी नहीं हूं जो आम तौर पर PHP के स्रोत में पहुंचे, इसलिए मैं प्रश्न के क्षेत्ररक्षण को यहां पर एक बेवकूफ नरक में से एक में छोड़ दूंगा;) – Brian

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