2011-10-26 21 views
13

मैं इस तरह कोड का उपयोग क्यों नहीं कर सकता?PHP के पास कोई डिफ़ॉल्ट कन्स्ट्रक्टर क्यों नहीं है?

<?php 

class NoConstructor { 
} 

class ChildWithConstructor extends NoConstructor { 
    public function __construct() { 
     parent::__construct(); 
     // do something 
    } 
} 

$foo = new ChildWithConstructor(); 
// **Fatal error: Cannot call constructor in file.php on line 8** 

ईजी। जावा कक्षाओं में डिफ़ॉल्ट है, कोई तर्क कन्स्ट्रक्टर नहीं है। इसे स्पष्ट रूप से परिभाषित नहीं किया जा सकता है।

PHP व्यवहार परेशानी का कारण बन सकता है जब हम अभिभावक वर्ग से कोई तर्क निर्माता नहीं निकालते हैं, उदाहरण के लिए। जब हमें लगता है कि इसकी आवश्यकता नहीं है।

क्या किसी को पता है कि PHP निर्माता इसे इस तरह क्यों बनाते हैं?

+1

अपने प्रश्न के अलावा यह उल्लेख किया जाना चाहिए कि आप इसे हल कर सकते हैं: कॉल से पहले कार्य अस्तित्व की जांच करें। –

+6

PHP रचनाकारों ने मूर्खतापूर्ण निर्णयों का * बहुत * बनाया ... –

+1

http://www.php.net/manual/en/function.is-callable.php: अगर (is_callable ('parent :: __ build')) { माता-पिता :: __ निर्माण(); } –

उत्तर

20

जावा वर्गों डिफ़ॉल्ट, कोई आर्ग निर्माता है।

क्या किसी को पता है कि PHP निर्माता इसे इस तरह क्यों बनाते हैं?

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

PHP के डिजाइनरों ने कभी भी इतनी चरम तक भाषा की योजना नहीं बनाई। जब वे साथ जाते हैं तो वे इसे बनाते हैं। बेहतर या बदतर के लिए, वे भाषा को अलग-अलग फेंकने और अगले संस्करण में इसे पुनर्निर्माण करने के लिए तैयार हैं। PHP 1 और 2 के बाद से यह अपरिचित रूप से बदल गया है। हाल ही में, PHP 5 में, आपके द्वारा वस्तुओं के लिए बाय-वैल्यू से बाय-रेफरेंस सेमेन्टिक्स में नाटकीय परिवर्तन आया था।यह वही शानदार पद्धति है जो हमें जादू उद्धरण, यूनिकोड की कमी, असंगत रूप से नामित (और अक्सर नामित) कार्यों, और एक पार्सर है कि त्रुटि के संकेत के बिना (error_reporting(-1); के साथ भी), संख्यात्मक शाब्दिक 09 को 0 के रूप में स्पष्ट रूप से व्याख्या करेगा ।

PHP व्यवहार परेशानी का कारण बन सकता है जब हम अभिभावक वर्ग से कोई तर्क निर्माता नहीं निकालते हैं, उदाहरण के लिए। जब हमें लगता है कि इसकी आवश्यकता नहीं है।

आप इस अनुरोध कर सकता bugs.php.net पर बदला जा, लेकिन संभावना है कि वे इसे अनदेखा या आप साथ लुकाछिपी जाएगा रहे हैं "क्षमा करें, लेकिन आपकी समस्या पीएचपी अपने आप में एक समस्या संकेत नहीं करता है ... "

+2

+1, यह एकमात्र उत्तर है जो प्रश्नों को संबोधित करता है। – Brad

1

PHP 5 से पहले निर्माता के पास जावा जैसे वर्ग के समान नाम था। PHP 5 में एक वर्ग में कक्षा के समान नाम के साथ एक कन्स्ट्रक्टर विधि हो सकती है (यदि नामस्थान में नहीं है) या __construct नाम दिया गया है। शायद इसके साथ कुछ करने के लिए है।

4

जैसा कि हमने 5.3.7 disaster के साथ देखा, PHP विकास को और अधिक स्थिरता की आवश्यकता हो सकती है। इसके अलावा PHP कई और तरीकों से अलग है।

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

मुझे वास्तव में PHP पसंद है और रोज़ाना इसके साथ काम करते हैं, लेकिन कभी-कभी यह थोड़ा सा क्विर्क होता है। दूसरी ओर, यदि आप __construct() को हटाते हैं तो दो चीजें हैं जिन पर आपको विचार करना चाहिए।

  1. कभी आप init एक मूल अवधारणा में कार्य करता है के बाद से इन भी अच्छा अभ्यास कर रहे हैं एक रूपरेखा का निर्माण कर रहे हैं यह, बस निर्माता खाली
  2. है।

मैं इसका मतलब यह:

class BaseClass { 
    public function __construct() { 
     if(method_exists($this, 'init') { 
      $this->init(); 
     } 
    } 
} 
1

लाइन

parent::__construct(); 

माता पिता वर्ग के निर्माता को सुस्पष्ट रूप से कॉल है। "PHP" आपको एक त्रुटि दे रहा है क्योंकि यह अस्तित्व में नहीं है।

क्या आप वास्तव में जावा में माता-पिता के अस्तित्व के निर्माता को स्पष्ट रूप से कॉल कर सकते हैं और कोई त्रुटि नहीं मिल सकती है?

याद रखें कि एक वर्ग वर्ग का विस्तार करने वाली कक्षा का निर्माता माता-पिता वर्ग के निर्माता को ओवरराइड करेगा जब विस्तारित वर्ग का निर्माण किया जाता है। एक अभिभावक कन्स्ट्रक्टर को कॉल करने का तात्पर्य है कि आप इसे कुछ करने की उम्मीद कर रहे हैं। यदि कन्स्ट्रक्टर मौजूद नहीं है तो उस पर आपका कॉल कोड में नहीं है कि क्या दुभाषिया आपको त्रुटि देता है या नहीं।

+0

जावा में कोई कन्स्ट्रक्टर के बिना कक्षा जैसी कोई चीज़ नहीं है - यदि संकलक स्रोत कोड में लिखा नहीं गया है तो संकलक एक जोड़ता है। Https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9 देखें – bdsl