2010-12-12 5 views
18

निम्न उदाहरण में, यदि कक्षा मौजूद नहीं है, तो मैं त्रुटि को पकड़ना चाहता हूं और इसके बजाय Null कक्षा बनाना चाहता हूं।PHP "क्लास नहीं मिला" त्रुटि क्यों पकड़ता है?

लेकिन मेरे प्रयास/पकड़ विवरणों के बावजूद, PHP बस मुझे Class 'SmartFormasdfasdf' not found बताता है।

मैं 'कक्षा नहीं मिली' त्रुटि को पकड़ने के लिए PHP कैसे प्राप्त कर सकता हूं?

<?php 
class SmartFormLogin extends SmartForm { 
    public function render() { 
     echo '<p>this is the login form</p>'; 
    } 
} 

class SmartFormCodeWrapper extends SmartForm { 
    public function render() { 
     echo '<p>this is the code wrapper form</p>'; 
    } 
} 

class SmartFormNull extends SmartForm { 
    public function render() { 
     echo '<p>the form "' . htmlentities($this->idCode) . '" does not exist</p>'; 
    } 
} 

class SmartForm { 

    protected $idCode; 

    public function __construct($idCode) { 
     $this->idCode = $idCode; 
    } 

    public static function create($smartFormIdCode) { 
     $className = 'SmartForm' . $smartFormIdCode; 
     try { 
      return new $className($smartFormIdCode); 
     } catch (Exception $ex) { 
      return new SmartFormNull($smartformIdCode); 
     } 
    } 
} 

$formLogin = SmartForm::create('Login'); 
$formLogin->render(); 
$formLogin = SmartForm::create('CodeWrapper'); 
$formLogin->render(); 
$formLogin = SmartForm::create('asdfasdf'); 
$formLogin->render(); 
?> 

समाधान:

धन्यवाद @Mchl, यह कैसे मैं यह तो हल है:

public static function create($smartFormIdCode) { 
    $className = 'SmartForm' . $smartFormIdCode; 
    if(class_exists($className)) { 
    return new $className($smartFormIdCode); 
    } else { 
    return new SmartFormNull($smartFormIdCode); 
    } 
} 

उत्तर

36

क्योंकि यह एक गंभीर त्रुटि है। कक्षा मौजूद है या नहीं, यह देखने के लिए class_exists() फ़ंक्शन का उपयोग करें।

इसके अलावा: PHP जावा नहीं है - जब तक कि आप डिफ़ॉल्ट त्रुटि हैंडलर को फिर से परिभाषित नहीं करते हैं, यह त्रुटियों को उठाएगा और अपवाद नहीं फेंक देगा।

+2

मैं भूल गया 'वर्ग नहीं मिला' , पीएचपी आज़माएं/फीचर प्राप्त करने में आपको अपनी खुद की त्रुटियों को फेंकने के लिए आपको अपना अपवाद हैंडलिंग बनाने में मदद मिलती है, लेकिन परिणामस्वरूप सी #/जावा में त्रुटियों को स्वयं नहीं पकड़ा जाता है। –

+1

http://www.php.net/manual/en/class.errorexception.php देखें उदाहरण के लिए अपवादों के लिए सभी को "पुनः लिखना" त्रुटियों को कैसे लिखें। साथ ही, जैसा कि अन्य सुझाव दिया गया है, 5.3 के बाद से आप अपवाद फेंकने के लिए ऑटोलोडर का उपयोग करना चाहेंगे जब दी गई कक्षा वाली फ़ाइल नहीं मिलती है। – Mchl

+2

@ एडवर्ड - यह निश्चित रूप से आपको * अपवाद * पकड़ने देता है, लेकिन PHP के मूल निवासी लगभग सभी अपवादों को फेंक नहीं देते हैं, केवल त्रुटियां। आप अपने स्वयं के * error_handler * को परिभाषित करके आसानी से काम कर सकते हैं और यह त्रुटि अपवाद का उपयोग करके अपवादों को फेंक कर (http://au.php.net/errorexception और वहां उदाहरण देखें)। यह आसानी से एक उपयोगी अपवाद आधारित प्रणाली में PHP की मूल त्रुटि प्रणाली को स्विच करता है जो फेंक/कोशिश/पकड़ आदि के साथ काफी अच्छी तरह से काम करता है –

5

आपको यह देखने के लिए कि class_exists का उपयोग करने की आवश्यकता है, यह देखने के लिए कि कक्षा आपके प्रयास करने से पहले मौजूद है या नहीं।

संयोग से, यदि आप कक्षा ऑटोलोडर का उपयोग कर रहे हैं, तो दूसरे तर्क को सत्य पर सेट करना सुनिश्चित करें।

0

क्योंकि जब आप गैर मौजूदा वर्ग की नई वस्तु बनाने के लिए टाइप करते हैं तो php घातक त्रुटि को उत्सर्जित करता है। इसे काम करने के लिए आपको php> = 5.3 और autoload फ़ंक्शन की आवश्यकता होगी, जहां आपको कक्षा परिभाषा के साथ फ़ाइल देखने की कोशिश करनी चाहिए या अपना कस्टम अपवाद फेंकना चाहिए।

+0

ए) ऑटोलोड लोड करने का गलत तरीका है - http: //au.php.net/manual/en/function.spl-autoload-register.php और b) इसे PHP 5.3 –

+1

की आवश्यकता नहीं है ऑटोलोडर में अपवाद फेंकने के लिए वास्तव में 5.3 की आवश्यकता होती है। एएनडी के बारे में कुछ भी गलत नहीं है जब तक कि आप जानते हैं कि आप क्या कर रहे हैं (यानी यह एक अपवाद फेंकने के लिए थोड़ा मूर्ख है जब स्वत: लोड कतार में अधिक ऑटोलोडर हैं)। – Mchl

+0

@ एएल योबो - क्या आप ऑटोलोड के साथ गलत क्या बता सकते हैं?स्प्ल फ़ंक्शन वही करता है, केवल अंतर यह है कि यह आपको सही फ़ाइल की खोज में चलाने के लिए और अधिक फ़ंक्शन प्रदान करने की अनुमति देता है। बी के लिए उत्तर दें), जैसा कि एमएचएल ने कहा था, आपको अभी भी अपवाद फेंकने के लिए PHP 5.3 की आवश्यकता होगी। –

10

पुराना सवाल, लेकिन PHP7 में यह एक आकर्षक अपवाद है। हालांकि मुझे अभी भी लगता है कि class_exists($class) ऐसा करने का एक और स्पष्ट तरीका है। हालांकि, अगर आप एक आज़माएं/कैच ब्लॉक नई \Throwable अपवाद प्रकार का उपयोग कर सकता है:

$className = 'SmartForm' . $smartFormIdCode; 
try { 
    return new $className($smartFormIdCode); 
} catch (\Throwable $ex) { 
    return new SmartFormNull($smartformIdCode); 
} 
+1

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

0

php> = 7.0

php पकड़ कर सकते हैं के रूप में फेंकने योग्य

try { 
     return new $className($smartFormIdCode); 
} catch (\Throwable $ex) { 
     return new SmartFormNull($smartformIdCode); 
}