2010-07-23 13 views
13

वहाँ इस के लिए एक तार्किक व्याख्या है?क्या यह एक php चर परिवर्तनीय बग है?

<?php 
$$a = 'hello world'; 
echo $$a; //displays hello world 
echo $$aa; //displays hello world 
echo $$aaa; //displays hello world 
?> 
+0

कोई यह नहीं, वह नहीं यह सही हो रही है है यह शायद एक php 5.3 व्यवहार – Dami

+0

है:

कुछ हद तक एक संबंधित बग यह पहले से ही के लिए दायर नहीं है। – Sarfraz

+0

धन्यवाद सब। यह अब दूसरे शब्दों में समझ में आता है। echo $ {null}; भी मान्य है। – Dami

उत्तर

7

अगर आप कोशिश

$$a = 'hello world'; 
echo $$a; //displays hello world 
echo $$aa; //displays hello world 
echo $$aaa; //displays hello world 


die("<pre>" . print_r(get_defined_vars(), true) . "</pre>"); 

आप देख सकते हैं कि यह कोई नाम के साथ एक चर registed है तो हाँ, पीएचपी का नामकरण सम्मेलनों के अनुसार, इस होगा एक बग

+0

तो php नामकरण सम्मेलन के विपरीत, एक चर शून्य हो सकता है, या एक खाली स्ट्रिंग – Dami

+0

मुझे लगता है कि वह परिवर्तनीय नाम के लिए नामकरण सम्मेलनों को संदर्भित करता है। '$ var' एक चर है, लेकिन' $ 'नहीं है ... –

+0

मुझे यकीन नहीं है कि यह एक बग क्या बनाता है। यह निश्चित रूप से अच्छा अभ्यास नहीं है, और मेरी इच्छा है कि PHP डिफ़ॉल्ट रूप से इस तरह की चीजों पर चेतावनी उठाएगा, लेकिन व्यवहार सुसंगत है। – Matchu

2

मैं दांव लगा रहा हूँ कि यह ${''} के प्रभाव, या कोई नाम के साथ एक चर, या कुछ उन पंक्तियों के साथ करने के लिए कुछ के रूप में चर को परिभाषित कर रहा है।

$a है और न ही $aa है और न ही $aaa के बाद से परिभाषित कर रहे हैं, वे जब एक चर चर संदर्भ में प्रयोग किया ही अजीब, खाली चर नाम करने के लिए सभी बिंदु।

1

ठीक है, अगर $ एक खाली है, तो आप = 'हैलो दुनिया' के लिए एक खाली चर नाम कर रहे हैं ... तो फिर हर बार जब आप संदर्भ है कि खाली चर नाम, आप मिल जाएगा क्या वहाँ संग्रह किया गया है .. ।

यह सिर्फ

$a = ''; 
$$a = 'Foo Bar'; 
$b = ''; 
echo $$b; //Displays Foo Bar 
1

आप यह सही हो रही है नहीं कर रहे हैं, इस पर विचार करें:

$a = 'hello'; 
$hello = "hello again"; 
echo $$a; 

आउटपुट:

hello again 

आपके मामले में, आप, निम्न वैरिएबल का मान सेट नहीं किया है तो यह आउटपुट वही।

स्पष्टीकरण:

जब आप $$a करते हैं, तो इसका मतलब है:

$       $a; 
^       ^
$ used for php vars   means a's value that is hello 

तो यह हो जाता है:

$hello 

किसका मूल्य है:

hello again 
+0

मैं परिवर्तनीय चर को समझता हूं, मैं बस इतना खुश हूं कि एक अनाम नाम हो सकता है, या एक चर या शून्य के साथ एक खाली स्ट्रिंग सेट हो सकता है। – Dami

12

जब

$$a = 'foo'; 

कर आप कह रहे हैं $a का मान ले। इसे स्ट्रिंग में कनवर्ट करें। के रूप में चर नाम यह करने के लिए 'foo' आवंटित करने के लिए स्ट्रिंग का उपयोग करें।चूंकि $a अपरिभाषित है और NULL लौटाता है, जो स्ट्रिंग को टाइपकास्ट करते समय '' है, तो आप चर ${''} निर्दिष्ट कर रहे हैं;

echo ${''}; // 'foo' 

विडंबना यह है कि आप कर सकते हैं

और आप कर सकते हैं

${''} = function() { return func_get_arg(0); }; 
echo ${''}('Hello World'); 
// or 
echo $$x('Hello World'); 

जो एक नोटिस $x के बारे में अपरिभाषित जा रहा है लेकिन उत्पादन Hello World तो ट्रिगर करेगा। काफी अजीब बात है, निम्नलिखित does not काम:

${''} = function() { return func_get_arg(0); }; 
echo $x('Hello World'); 

क्योंकि यह चलाता है गंभीर त्रुटि: समारोह नाम एक स्ट्रिंग होना चाहिए। क्विर्की: डी

पीएचपी मैनुअल के बाद से कहते हैं

Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores.

मैं वास्तव में एक खाली नामित चर एक बग आवंटित करने के लिए सक्षम किया जा रहा पर विचार होगा।

+1

यकीन नहीं है कि यह विडंबना है, क्या आप वास्तव में क्या उम्मीद करेंगे? क्या यह नहीं है कि पार्सर कैसे काम कर रहा है, इस बारे में अधिक बात करता है, जिसमें यह केवल खाली स्ट्रिंग की स्पष्ट घोषणाओं को पहचानता है। अस्वीकरण: मुझे php के बारे में कुछ नहीं पता है। – Grantismo

+0

@Grantismo मैं उम्मीद करता हूं कि PHP मुझे $ {''} = 'foo' करने से रोक देगा जब मैं $ = 'foo' नहीं कर सकता और मैनुअल कहता है कि चर के नाम का नाम होना चाहिए। इसके अलावा, चर निर्दिष्ट करने का सामान्य तरीका घुंघराले ब्रेसिज़ के बिना है। लेकिन हाँ, आपको पार्सर के बारे में आश्चर्य है :) – Gordon

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