PHP फ़ंक्शन हस्ताक्षर इतने असंगत क्यों हैं? [बन्द है]


17

मैं कुछ PHP कार्यों के माध्यम से जा रहा था और मैं निम्नलिखित को नोटिस करने में मदद नहीं कर सकता:

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

नोटिस array_key_exists()और property_exists()समारोह। पहले एक में, संपत्ति का नाम (एक सरणी के लिए कुंजी) पहला पैरामीटर है जबकि दूसरे में यह दूसरा पैरामीटर है। अंतर्ज्ञान से, कोई उनसे समान हस्ताक्षर की उम्मीद करेगा। इससे भ्रम की स्थिति पैदा हो सकती है और इस प्रकार के सुधार करके विकास का समय बर्बाद हो सकता है।

क्या PHP, या उस विषय के लिए कोई भाषा नहीं होनी चाहिए, संबंधित कार्यों के हस्ताक्षर को सुसंगत बनाने पर विचार करें?


2
+1 ब्रावो, यह पहली चीजों में से एक है जिसे मैंने php के बारे में देखा है और हमेशा परेशान पाया है
केविन

भावहीन। एक IDE का उपयोग करें।
बेन डबिसन

जवाबों:


10

आप जो प्रस्ताव करते हैं वह अनिवार्य रूप से कई मौजूदा कार्यों के लिए हस्ताक्षर बदल रहा है। एक मिनट के लिए सोचें कि मौजूदा कोड पर इसका क्या प्रभाव पड़ेगा। अब मान लें कि PHP समूह ने PHP संस्करण N जारी कर दिया है जो 30% फ़ंक्शन के हस्ताक्षर बदलता है। अब कल्पना कीजिए कि आपको PHP vN और PHP v। {N-1} दोनों पर चलने वाले कोड लिखने होंगे - कितना मज़ा आएगा?

अब कल्पना कीजिए कि आप एक होस्टर या कॉर्पोरेटिव डेटा सेंटर मैनेजर हैं - आपको PHP vN का समर्थन करने के लिए क्या प्रोत्साहन मिलेगा, बशर्ते कि एक बार स्विच करने के बाद, सभी कोड टूट जाएँ और उपयोगकर्ता आपके कार्यालय में पिचफोर्क और टॉर्च लेकर आएं?


4
+1 यह मुश्किल है कि एक बार आपने कुछ गलत तरीके से शुरू कर दिया है, लेकिन इसके वर्तमान स्थिति में इसका उपयोग करने वाले इतने बड़े उपयोगकर्ता-आधार हैं।
एंडी फ्लेमिंग

4
ये एक अच्छा बिंदु है। मुझे वास्तव में इसके बारे में पता था, लेकिन मेरी मुख्य बात यह है कि उन्हें इसके बारे में पहले से पता होना चाहिए था।
शमीम हाफिज़

7
@ शमीम ट्रू, जो इस बात का हिस्सा है कि PHP की पहली जगह में खराब प्रतिष्ठा क्यों है?)
एंडी फ्लेमिंग

1
PHP, बहुत सी चीजों की तरह, एक छोटी सी समस्या को हल करने के लिए एक छोटे से उपकरण के रूप में शुरू हुआ, अगर कोई इसे "ठीक से" वापस डिज़ाइन करता, तो यह अच्छे से अच्छा हो सकता था, लेकिन शायद कर्षण तक नहीं पहुंचा होगा, इसलिए कोई भी इसका उपयोग नहीं करेगा ... और एक और छोटा उपकरण "जीता" होगा, विभिन्न विसंगतियों के साथ एक उपकरण ...
जोहान्स

3
इसीलिए वंचना जैसी कोई चीज नहीं है। आप नए, मानकीकृत नाम बनाते हैं, और फ़ंक्शन नामों के पुराने "सलाद-बार" को हटाते हैं, लेकिन उन्हें कुछ रिलीज के लिए छोड़ देते हैं। कुछ अच्छी तरह से प्रचारित बिंदु पर आप एक नया प्रमुख संस्करण जारी करते हैं जो उनके साथ दूर होता है। ऐसा ही किया जाता है। यह PHP देवों के हिस्से पर शुद्ध कायरता है कि उन्होंने ऐसा नहीं किया है। वे प्रवेश के लिए कम अवरोध की सवारी कर रहे हैं जो PHP को अन्य वेब भाषाओं पर बढ़त देता है, और वे इस वजह से सफल होते हैं, इसलिए वे कोर भाषा में सुधार करते रहना नहीं चाहते हैं।
दान रे

10

क्योंकि PHP बिना किसी Specification के The Language है।

और वस्तुतः हर कोई कुछ कार्यों को जोड़ सकता है, और शुरुआत में स्थिरता का कोई सवाल ही नहीं था। एसओ, गड़बड़।


हर कोई कार्यों को नहीं जोड़ सकता
9

@StasM: कौन कर सकता है, DEV समूह? कोई भी लिंक जहां मैं पा सकता हूं कि वह समूह कैसे संचालित होता है?
शमीम हाफिज

@StasM: ठीक है, मैं थोड़ा अतिरंजित। वास्तविक समस्या शुरुआत से ही सम्मेलनों की कमी है या एक व्यक्ति कोड सामंजस्य के लिए जिम्मेदार है। अब बहुत देर हो चुकी है। मुझे संदेह है कि अगर PHP को दूसरी भाषा के रूप में समझने के बिना इसे बदला जा सकता है।
ts01

@ शमीम देव समूह संचालन के सिद्धांत दो हैं: सर्वसम्मति और विश्वास। जो शांत है, लेकिन मुझे अच्छी भाषा के विकास के लिए पर्याप्त डर नहीं है
ts01

@ शमीम: php.net और wiki.php.net से शुरू करें।
StasM

4

अधिकांश अच्छी भाषाएं हैं और सुसंगत होने का प्रयास करती हैं।

यह PHP की स्थिति की वास्तविकता है। जैसा कि स्टैसम ने उल्लेख किया है, यह इस तथ्य के बाद चीजों को आजमाने और स्विच करने के लिए एक दुःस्वप्न होगा। यह बहुत अधिक मौजूदा कोड को प्रभावित करेगा। अक्सर PHP केवल कार्यों को चित्रित करती है और नए बेहतर कार्य बनाती है जो अधिक सुसंगत हैं, लेकिन इसमें बहुत समय लग सकता है।

मुझे लगता है कि सफल PHP प्रोग्रामर या तो विशेष सिंटैक्स को याद करते हैं या सॉफ़्टवेयर का उपयोग करते हैं जो स्वचालित रूप से उन्हें सिंटैक्स बताता है।


पदावनत समारोह एक बात है, आसान है। बदल रहा है तर्क ताकि और अधिक, और अधिक कठिन है
ts01

@ ts01 नाखून जरूरी समस्या। केवल स्थितीय मापदंडों के साथ यह जानने का कोई तरीका नहीं है कि आपका मौजूदा foo(a,b)अब होना चाहिए foo(b,a)क्योंकि किसी ने फू के हस्ताक्षर को बदल दिया है।
फ्रैंक शियरर

@ ts01, @Frank: आप भी समारोह का नाम बदलने के लिए होगा ... "property_exists" जहां की तरह सामान के लिए नहीं एक विशेष रूप से अच्छा विचार है और कोई सभ्य नाम। व्यक्तिगत रूप से, मैं एरे को वास्तविक वस्तु बनते देखना चाहूंगा ताकि आप कह सकें $array->key_exists('whatever')लेकिन, meh :-)
डीन हार्डिंग

वास्तव में, कोई भी PHP देव जो कर सकता है, उसे लपेटने के लिए अपने स्वयं के नए कार्य बना सकता है। यह भी ध्यान दें कि (उदाहरण के दोनों उल्लिखित उदाहरणों के लिए) एक सार्वभौमिक सिंटैक्स है, लेकिन वे केवल संकलित कल्पना के हिस्से के रूप में पदावनत नहीं हैं।
user1122069

3

असंगतता का प्रमुख स्रोत यह है कि निर्मित कार्यों में php के कई (अधिकांश?) वास्तव में कुछ सी लाइब्रेरी के आसपास रैपर हैं। प्रारंभिक सोच थी "मैं सी फ़ंक्शन xxxx लपेट रहा हूं इसलिए मुझे पैरामीटर ऑर्डर समान रखना चाहिए"। जब यह एक "शुद्ध php" फ़ंक्शन लिखने की बात आई, तो इस सोच को "xxxx फ़ाइल में ले जाया गया और विकल्प नया विकल्प फ़ाइल नाम और विकल्प लेता है, तो यह समझ में आता है कि yyyy को समान क्रम में समान पैरामीटर लेना है।

यहाँ बड़ा दोष यह है कि अंतर्निहित सी पुस्तकालयों के साथ शुरू करने के लिए बहुत असंगत थे।


उन्होंने सी फ़ंक्शन नामों को भी रखा था जो वे कुछ मामलों में लपेट रहे थे (विशेष रूप से स्ट्रिंग फ़ंक्शन), जबकि अन्य फ़ंक्शन नामों के लिए सी के नामकरण सम्मेलनों (जैसे वे हैं) से बेतहाशा विचलन।
दान रे

2

(ए?) कारण PHP के पिछले संस्करणों के साथ संगत रहना था। कई अनुप्रयोगों को तोड़ने वाले फ़ंक्शन नामों को बदलने के बजाय, फ़ंक्शन बने रहते हैं। हालांकि, अंतर्ज्ञान द्वारा, नई भाषाओं के लिए हाँ सुसंगत फ़ंक्शन नामकरण को ध्यान में रखा जाना चाहिए।

मुझे इस बात से असहमत होना है कि विकास का समय बर्बाद हो रहा है। PHP सीखना कुछ कार्यों के नामकरण को समझने में अधिक समय ले सकता है, लेकिन एक बार महारत हासिल (या कम से कम जागरूक) यह एक गैर मुद्दा बन जाता है।

संगतता> संगति (कम से कम PHP)


1
अन्य भाषाओं में, मैं डॉक्स के निरंतर संदर्भ के बिना लिख ​​सकता हूं। PHP मुझे हमेशा चिंता करने की है ... क्या यह फ़ंक्शन "str_" या सिर्फ "str" ​​वर्तनी है? क्या यह "सरणी _" है - कुछ या हम सरणियों का उल्लेख नहीं करते हैं? एक तार दिए जाने पर "लंबाई ()" क्या करता है? अरे नरक, नहीं, यह "स्ट्रलेन ()" मैं वास्तव में चाहता था ... क्या यह "सुई, घास का ढेर" या "घास का ढेर, सुई" है? कोई अन्य भाषा मुझे उस सब के माध्यम से नहीं डालती है।
दान रे

आपकी तरह मैं भी इस @DanRay से लगातार परेशान था। मैंने अब NetBeans PHP IDE का उपयोग करना शुरू कर दिया है, जो मुझे सही जानकारी देता है जो मुझे संपादक में सही चाहिए।
deed02392
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.