2010-10-28 17 views
9

मैंने कई भाषाओं में ज्यादा प्रोग्रामिंग नहीं की है, लेकिन मुझे सी (++) में पता है, आपको एक वैरिएबल प्रकार (int, char इत्यादि) घोषित करना होगा।PHP कैसे जानता है कि यह किस प्रकार के चर का उपयोग करता है (या करता है)?

PHP में, आपको निश्चित रूप से ऐसा करने की ज़रूरत नहीं है। आप $str = "something"; से बाद में $str = array("something" => "smells"); से शुरू कर सकते हैं और वह खुश है।

PHP कैसे संकलित करता है? यह कैसे पता चलता है कि परिवर्तनीय प्रकार क्या होगा? क्या यह भी परवाह करता है?

इस प्रश्न में मेरे द्वारा किए जा रहे कुछ भी करने की कोई प्रासंगिकता नहीं है। मैं बस उत्सुक हूँ।

संपादित करें।

मुझे इस प्रश्न को थोड़ा सा स्पष्ट करने की आवश्यकता है।

सी में, यदि मैं कहता हूँ:

int y; 

यह y के लिए बाइट्स की एक्स राशि सुरक्षित रखता है। यदि y अतिप्रवाह, बुरी खबर।

PHP में यह प्रकृति नहीं है (कम से कम मुझे नहीं लगता कि यह करता है)।

$i = "a number"; 
$i = 8; 
$i = 1000000000000000000; 

यह भाषा के समान ही है। यह कैसे पता चलेगा कि कितना आरक्षित करना है? या मैं संतरे से संतरे की तुलना कर रहा हूं? अगर मैं इस गलत के बारे में जा रहा हूं, तो क्या आपके पास कोई अच्छा विषय है जिसे मैं बेहतर समझने के लिए पढ़ सकता हूं?

+1

यह हास्केल, जहाँ आप की तरह कुछ लिख सकते हैं के रूप में कुछ भाषाओं, देखते हैं कि यह भी ध्यान देने योग्य है 'एक्स = एफ 1000', और यह 'x'' के प्रकार के आधार पर 'x'-type का प्रकार क्या होगा, यह अनुमान लगाएगा, संकलन पर, यह सी की तरह दिखता है; घोषणा पर, यह PHP की तरह दिखता है। थैरस की तरह PHP काम करता है, ज़ाहिर है। –

उत्तर

6

जब से तुम सी अनुभव है, की तरह बनना एक PHP चर पर विचार निम्नलिखित:

typedef struct { 
int varType; 
void* data; 
} variable_t; 

जब आप एक नया चर बनाने, यह एक variable_t बनाने के लिए, यह एक प्रकार टैग दे देंगे (की सुविधा देता है के लिए कहते हैं कि 1 int, स्ट्रिंग के लिए 2), और इसे किसी सूची में कहीं भी स्टोर करें (दायरे से, नाम से संदर्भ)। वास्तविक सामग्री *data में संग्रहीत की जाएगी। जब चर को फिर से एक्सेस किया जाता है, तो प्रकार int varType से निर्धारित किया जा सकता है, और एप्राइपिएट कार्रवाई void* data पर ली गई है, जैसे इसे एक int या स्ट्रिंग के रूप में उपयोग करना।

कल्पना कीजिए कि पीएचपी टुकड़ा:

$data = 12; 
$data2 = $data + 1; 
$data = "Hello"; 

निम्नलिखित (छद्म CISH) की तरह निर्देश का उत्पादन:

Line 1: 
variable_t* var = new_variable(TYPE_INT, data); 
store_variable("data", var); 

Line 2: 
variable_t* var = get_variable("data2"); 
if (var->varType == TYPE_INT) 
    int value = 1 + *(int*)var->data); 
else 
    error("Can't add non int"); 
var = new_variable(TYPE_INT, value); 
store_variable("data2", var); 

Line 3: 
variable_t* var = get_variable("data"); 
if (var) 
    destroy_variable(var); 
// Do like line 1, but for TYPE_STRING 

संवर्धित डेटा के इस प्रकार, bytecoded संकलित, या सीधे व्याख्या की भाषाओं में काम करता है ।

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

+2

यह एक अच्छा जवाब था और वास्तव में जो मैं खोज रहा था। धन्यवाद! – Jason

1

PHP वास्तव में संकलित नहीं करता है - यह व्याख्या (ओप-कोड में) है।

यदि आप किसी निश्चित डेटा प्रकार पर कुछ करने का प्रयास नहीं करते हैं, तो यह बहुत अधिक है, यह आपको एक त्रुटि देगा। कोई प्रकार की जांच नहीं है।

+0

आगे विस्तार करने के लिए: त्रुटियों से बचने के लिए आप कुछ संचालन (मानक "अगर" कथन) करने से पहले एक चर के प्रकार की जांच करने के लिए कुछ विधियों का उपयोग कर सकते हैं। – KPthunder

+0

मुझे पता है कि मैं 'is_numeric()' जैसी चीजों का उपयोग कर सकता हूं लेकिन वह कैसे जानता है? डेटाटाइप स्वाभाविक रूप से कैसे बनाए जाते हैं? क्या वे हमेशा स्ट्रिंग करते हैं और 'is_numeric() 'फ़ंक्शन में स्विच के माध्यम से जाते हैं? या यह आकार को देखता है। यही वह उत्तर है जिसे मैं ढूंढ रहा हूं। PHP को इसके अलावा कुछ भी पता है कि इसमें एक चर ''c' और' $ c = "कुछ है"; '? – Jason

+0

मुझे अपने प्रश्न को थोड़ा सा स्पष्ट करने दें। – Jason

1

यह संकलित नहीं करता है। यह जावास्क्रिप्ट की तरह interpreted language है।

+0

यहां तक ​​कि जेएस भी दुखी हो सकता है अगर मैं एक चर के लिए कुछ करता हूं जिसे घोषित नहीं किया गया है। क्या PHP स्वचालित रूप से इसे घोषित करता है अगर यह अभी तक नहीं हुआ है? – Jason

+0

थिएट्रस ने यहां एक अच्छा जवाब दिया कि php चर कैसे संभालता है। यदि आप एक चर का उपयोग करने का प्रयास करते हैं और php इसके बारे में नहीं जानता है, तो यह एक अपवाद फेंक सकता है (एक चेतावनी, मुझे लगता है, मुझे यकीन नहीं है ..)। 'isset ($ variable) 'आपको बता सकता है कि एक चर परिभाषित किया गया है, और आप' अनसेट ($ चर) 'जैसी चीजें भी कर सकते हैं। लेकिन [मैनुअल] (http://php.net/manual/en/index.php) मुझे – cambraca

+0

@ कंब्राका से बेहतर बताता है - क्या आप मैन्युअल में 'unset() 'के बारे में बात कर रहे हैं, या मैन्युअल उत्तर देने के लिए मेरा प्रश्न? मैं टीओसी पर कहीं भी नहीं देख रहा हूं, जहां यह बात करता है कि यह डेटाटाइप को कैसे संभालता है। बस वहाँ प्रकार हैं? शायद मैं कुछ दिख रहा हूँ। पूरे मुद्दे के बारे में – Jason

-1

PHP अब टाइपिंग संकेत का समर्थन करता है, आप फ़ंक्शन परिभाषाओं में 'स्ट्रिंग' या 'सरणी' जैसी चीजें शामिल कर सकते हैं जो स्क्रिप्ट को पार्स किया जाता है ताकि संकेत मिलता है कि एक प्रकार का मेल नहीं है।

+0

मैं विभिन्न प्रकारों को खोजने के लिए कैसे नहीं देख रहा था। PHP कैसे डेटाटाइप जानता है। – Jason

+0

क्या मैंने कुछ गलत जानकारी प्रदान की? – KeatsKelleher

0

"कैसे पीएचपी संकलित करता है? यह कैसे जान लेता है कि क्या वैरिएबल प्रकार होने जा रहा है? तो यह और भी परवाह करता है?

यह सवाल कुछ भी मैं कर रहा हूँ करने के लिए कोई प्रासंगिकता है। मैं सिर्फ उत्सुक हूँ।"

PHP एक व्याख्या की गई भाषा है और यह संकलित नहीं है।

PHP नहीं जानता कि चर किस प्रकार का जा रहा है, क्योंकि चर का प्रकार उस चर के प्रकार द्वारा निर्धारित किया जाता है जो उस चर के लिए पिछली बार असाइन किया गया था।

आप ऐसा कर सकते हैं:

$foo = 5; 
var_dump($foo); 
$foo = "5"; 
var_dump($foo); 
$foo = array(); 
$foo[] = 0; 
$foo[] = 1; 
$foo[] = 2; 
var_dump($foo); 

आप देख सकते हैं, जब भी एक मूल्य foo को सौंपा गया है, प्रकार बदला जा सकता है।

PHP आपके चर के प्रकार की परवाह नहीं करता है, क्योंकि यह एक प्रोग्रामिंग भाषा है और इसमें भावनाएं नहीं हैं।

संपादित करें:

"? या मैं संतरे के लिए सेब की तुलना"

हाँ, आप हैं। Here आप भाषा के बारे में और जान सकते हैं।

EDIT2:

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

ये लिंक आप के लिए उपयोगी हो सकता है:

http://www.gidforums.com/t-11866.html

http://www.webmaster-talk.com/coding-forum/186350-fundamental-differences-between-php-c-c.html

Variable scope difference between PHP and C: block scope is not exactly the same?

ध्यान दें, कि PHP सर्वर पर निष्पादित किया जाता है, तो आप, ग्राहक घटनाओं बनाने के लिए जावास्क्रिप्ट चाहते हैं मेरा सुझाव है

+0

हाहा। प्रोग्रामिंग भाषाएं परवाह करते हैं। कभी अर्ध-कोलन भूल गए? PHP.net बात करता है कि PHP चीजें कैसे करता है। बस कार्यान्वयन। मैं एक विद्युत अभियंता (या कॉम्प) स्तर पर जानना चाहता हूं (जैसा कि मैं हूं)। – Jason

+0

अंतिम वाक्य आवश्यक नहीं है। मैं जेएस और PHP की तुलना करने और इसके विपरीत करने की कोशिश नहीं कर रहा हूं। मुझे पता है कि जेएस क्लाइंट के लिए है और PHP सर्वर है। उन लिंक को खोदने के लिए धन्यवाद। – Jason

+0

कोई समस्या नहीं, अगर मैं मदद कर सकता हूं तो मुझे खुशी है। –

0

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन ओपी द्वारा पूछे गए प्रश्नों को PHP कैसे प्रबंधित करता है, इस बारे में कुछ और विशिष्ट जानकारी यहां दी गई है।

Introduction to Variables

मुझे पता जोड़ने को प्राथमिकता नहीं है, लेकिन है कि लिंक स्थिर होना चाहिए और मैं नहीं करना चाहता:

यह पीएचपी संदर्भ से पेज है कि आप के साथ शुरू करना चाहते हैं है थोक प्रतिलिपि PHP संदर्भ प्रलेखन। यहां पर प्रकाश डाला गया है।

ओपी: PHP कैसे जानता है कि यह किस प्रकार के चर का उपयोग करता है (या करता है)?

पीएचपी सी में लिखे और एक सी struct typedef जो इसे एक सी संघ typedef जो एक zval_value सभी चर का प्रतिनिधित्व करने के लिए कॉल है के साथ एक zval कॉल का उपयोग करता है।

typedef struct _zval_struct { 
    zvalue_value value;  /* variable value */ 
    zend_uint refcount__gc; /* reference counter */ 
    zend_uchar type;   /* value type */ 
    zend_uchar is_ref__gc;  /* reference flag */ 
} zval; 

"इंजन एक चर की अवधारणा की जटिलता है कि संरचनाओं विभिन्न क्षेत्रों तक पहुँचने के लिए मैक्रो की एक समान और सहज ज्ञान युक्त सेट उपलब्ध कराने के द्वारा किसी भी प्रकार किया जा सकता है को कवर करने के लिए प्रयास करता है।"

"PHP एक गतिशील, ढीली टाइप की गई भाषा है, जो कॉपी-ऑन-राइट और संदर्भ गिनती का उपयोग करती है।" रेफरेंस गिनती और कॉपी-ऑन-राइट (गाय) दो शक्तिशाली अवधारणाएं PHP हैं जिनका उपयोग मैं यहां नहीं जाऊंगा लेकिन पढ़ने के लायक हैं।

"कमजोर टाइपिंग कनवर्ट करते हैं, या निष्पादन समय पर आवश्यक प्रकार में चर मजबूर करने के लिए इंजन की वरीयता के निहित है। संदर्भ गिनती साधन है जिसके द्वारा इंजन जब एक चर नहीं रह गया है किसी भी संदर्भ होते हैं यह मान सकते हैं है उपयोगकर्ता कोड, और चर के साथ जुड़े संरचनाओं को मुक्त करने में सक्षम है। "

"zval_value एक संघ है जो सभी प्रकार के एक चर पकड़ सकता है प्रतिनिधित्व कर सकते हैं।"

"... एक चर एक प्रकार का हो सकता है, चर डेटा में उपयुक्त क्षेत्र का प्रतिनिधित्व करती है zval_value संघ। zval ही प्रकार, संदर्भ गिनती और एक झंडा यदि किसी वैरिएबल एक संदर्भ है इंगित करने के लिए आयोजित करता है। "

पीएचपी कैसे संकलित करता है?

"संकलन" एक व्यापक शब्द है जिसका अलग अर्थ हो सकता है और PHP पारंपरिक अर्थ में संकलित नहीं होता है। यह एक प्रकार का प्री-संकलन करता है जो स्रोत कोड को ऑपकोड में परिवर्तित करता है जो निर्देशक हैं जिन्हें प्रोसेसर द्वारा निष्पादित किया जा सकता है। ये ऑपकोड कैश किए जाते हैं जो PHP को अक्सर स्क्रिप्ट नामक पार्स से रोकते हैं।

यह कैसे पता चलता है कि परिवर्तनीय प्रकार क्या होगा? क्या यह भी परवाह करता है?

जैसा कि पहले ही यह ऊपर उद्धृत "परिवर्तित, या चर मजबूर करने के लिए निष्पादन समय पर आवश्यक प्रकार में वरीयता।" PHP इंजन की है Baiscally PHP हमेशा यह संग्रहीत करता है कि यह एक चर के प्रकार को निर्धारित करता है जब यह बनाया जाता है, लेकिन जब एक चर का संदर्भ दिया जाता है, तो PHP का संदर्भ उस संदर्भ पर आधारित होता है जिस पर इसका उपयोग किया जा रहा है।

"पीएचपी दुर्बलता से लिखा गया, के रूप में इस तरह के इंजन एक प्रकार से दूसरे चर परिवर्तित करने के लिए एपीआई कार्यों प्रदान करता है।"

इंजन मैक्रो का समूह यह zvals के साथ काम करने के लिए एक कन्वर्ट करने के लिए उपयोग करता है वेरिएबल का प्रकार ताकि आपको आमतौर पर इसका सामना न करना पड़े।

आप क्या zvals कार्रवाई में की तरह लग रहे वे के साथ फेंक दिया जा सकता है देखना चाहते हैं:

debug_zval_dump($variableName); 
संबंधित मुद्दे