2017-01-04 7 views
8

मैं PHP 7.0.11 में वास्तव में एक दिलचस्प बग आया हूं जहां declare(strict_types=1); सक्षम array_map() और array_walk() सख्त टाइपिंगटिंग के बारे में जागरूक नहीं है। मैंने कहीं पढ़ा है कि सख्त प्रकारों को सक्षम करने से PHP भी मूल कार्यों में सख्त टाइपिंगिंग का उपयोग करता है, लेकिन ऐसा नहीं है। इस उदाहरण कोड में देखो, यह लेखन त्रुटि अपवाद फेंक देना चाहिए:सख्त प्रकार संकेत सक्षम होने के साथ, array_map किसी भी प्रकार को परिवर्तित करता है

declare(strict_types=1); 

$myArray = [12, 'string value', 'another string value', 5]; 

array_map('validateMyArrayValues', $myArray); 

function validateMyArrayValues(string $item) 
{ 
    var_dump($item); 
} 

var_dump परिणाम है:

test.php:13: 
    string(2) "12" 
test.php:13: 
    string(12) "string value" 
test.php:13: 
    string(20) "another string value" 
test.php:13: 
    string(1) "5" 

सभी पूर्णांक मूल्यों स्ट्रिंग जो स्पष्ट रूप से एक मुद्दा है में typecasted कर रहे हैं। इससे सवाल उठता है कि क्या मैं declare(strict_types=1); सभी को एक साथ छोड़ सकता हूं और is_* फ़ंक्शंस का उपयोग कर सकता हूं और अपवाद फेंक सकता हूं?

+0

यदि आप * सख्त * प्रकार चाहते हैं, तो php का उपयोग न करें। इसके * फायदे * में से एक है इसके ढीले प्रकार –

+0

@ raina77ow हाँ, हाँ यह थोडा अजीब भरोसा है। Int के साथ आश्चर्यजनक रूप से यह ठीक से काम करता है। असल में मैं वास्तव में खुश हूं अगर कोई भी PHP dev समूह को बग रिपोर्ट पोस्ट कर सकता है क्योंकि PHP 7.1 भी प्रभावित है; और मैं उचित बग रिपोर्ट लिखने में इतना अच्छा नहीं हूं। –

+0

@ दागोन दाएं, लेकिन प्रत्येक प्रोग्रामिंग भाषा में इसकी ताकत और कमजोरियां होती हैं। –

उत्तर

5

यह (मुझे सही दिशा में इशारा करते हुए के लिए Room 11 को टोपी टिप) एक बग नहीं है

यहाँ Strict Types RFC है। PHP के इतिहास में यह वास्तव में, वास्तव में लंबा और सबसे विवादास्पद आरएफसी है (और मैं गंभीर हूं)। यहाँ प्रासंगिक भाग डिफ़ॉल्ट रूप से के लिए आप

इस प्रस्ताव को कमजोर प्रकार की जाँच में बनाता काट आंतरिक और उपयोगकर्ता कार्यों के लिए (एक ही नियमों का उपयोग), है।

-

पीएचपी समुदाय का एक महत्वपूर्ण भाग पूरी तरह से सख्त प्रकार के पक्ष में दिखाई देता है। हालांकि, कड़ाई से टाइप-चेक स्केलर प्रकार घोषणाओं को जोड़ने से कुछ समस्याएं उत्पन्न हो सकती हैं:

मौजूदा कोड जो (शायद अनजाने में) PHP के कमजोर टाइपिंग का लाभ उठाता है, तो अगर यह पैरामीटर को स्केलर प्रकार घोषणाओं को जोड़ता है तो यह तोड़ देगा। यह मौजूदा कोडबेस, विशेष रूप से पुस्तकालयों में कार्यों के पैरामीटर के लिए स्केलर प्रकार घोषणाओं को जोड़ने में जटिल होगा।

तो यह एक बग नहीं है। यह भव्य समझौता का हिस्सा था जिसने इसे संभव बनाया (कठोर टाइपिंग की ओर बच्चे कदम, यदि आप करेंगे)। कार्य सख्त टाइपिंग को अनदेखा करते हैं। हां, यह अन्य भाषाओं के साथ असंगत है (एक तथ्य आरएफसी नोट्स विस्तार से), लेकिन इस तरह PHP समुदाय ने फैसला किया कि यह अभी होना चाहिए।

+0

हां, यह कमजोर प्रकार संकेत देने का मामला प्रतीत होता है ([ डेमो] (https://eval.in/709627))। किसी भी पूर्णांक को स्ट्रिंग में परिवर्तित किया जा सकता है, लेकिन केवल 'न्यूमेरिक' तारों को पूर्णांक में डाला जाता है। – raina77ow

+0

यह बिग-अह पल है। आपकी स्पष्टीकरण @ माचविटी के लिए धन्यवाद। मैं वर्तमान में सख्त प्रकार आरएफसी पढ़ रहा हूं यह वास्तव में दिलचस्प है। –

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