2010-06-06 14 views
7

क्या फ़ाइल में शामिल करने का प्रयास करने के लिए PHP में कोई तरीका है, लेकिन अगर फ़ाइल में त्रुटियां हैं जो इसे संकलित करने से रोकती हैं तो बस उस फ़ाइल को शामिल करने से छोड़ दें?एक वर्ग की खराब प्रोग्रामिंग से एक वर्ग की रक्षा करना?

+2

यह एक दिलचस्प सवाल है, लेकिन क्या उस फ़ाइल पर निर्भर कुछ भी तोड़ने वाला नहीं होगा जिससे अधिक संकलन त्रुटियां हो सकती हैं? –

+1

क्यों सुनिश्चित नहीं है कि हर कोई यूनिट परीक्षण का उपयोग कर रहा है और यह सत्यापित करने से पहले परीक्षण पास हो रहा है। यदि समस्याएं हैं, तो टूटी हुई कक्षा को ठीक होने तक मॉक करें। –

+0

वास्तव में दिलचस्प सवाल है। हालांकि मैं उपयोग के मामले के बारे में सोच रहा हूँ। अगर कोई फ़ाइल संकलित नहीं होती है, तो यह स्पष्ट रूप से कभी भी नहीं चला है। यदि आप स्वयं फ़ाइल को शामिल करते हैं, तो आप आसानी से समस्याओं को ठीक करने में सक्षम होना चाहिए। या आप अपनी टीम पर दूसरों द्वारा किए गए खराब कोड से एप्लिकेशन की रक्षा करने की कोशिश कर रहे हैं? यदि यह चिंता का विषय है, तो समाधान को 'शामिल' से एचआर विभाग के साथ अधिक करना है। या आप गतिशील रूप से उपयोगकर्ता योगदान फ़ाइलों सहित हैं? तो यह मुद्दा शायद आपकी चिंताओं का कम से कम है। – deceze

उत्तर

4

आप प्रश्न में फ़ाइल पर php -l को कॉल कर सकते हैं। हालांकि यह खोल जाएगा और धीमा होगा। हालांकि यह रनटाइम त्रुटियों को प्रबंधित नहीं करता है जैसे मर() हालांकि।

test.php:

<?php 
function check_code_file($filename) 
{ 
    $filename = escapeshellcmd($filename); 
    system("php -l $filename 2>/dev/null 1>/dev/null", $status); 
    if ($status) return false; 
    return true; 
} 
if (check_code_file('test-good.php')) 
{ 
    include('test-good.php'); 
} 
if (check_code_file('test-bad.php')) 
{ 
    include('test-bad.php'); 
} 
print "finished\n"; 

परीक्षण good.php:

<?php 
print "here\n"; 

परीक्षण bad.php:

<?php 
die(

$ php test.php

here 
finished 
+0

संकलन त्रुटियों के लिए नहीं। – Artefacto

+0

हाँ क्षमा करें, टेस्ट केस थोड़ा सा पहुंचा, एक टाइपो था। काम करता है कि एक के साथ इसे redid। –

+1

हालांकि यह समाधान महंगा हो सकता है हालांकि। –

0

PHP संस्करण के आधार पर आप php_check_syntax() (व्यावहारिक रूप से php -l के समान) का उपयोग कर सकते हैं।

लेकिन यह वास्तव में एक म्यू पॉइंट है .. या तो आपको अपनी सामग्री को शामिल करने की कोशिश करने की आवश्यकता है या आप इसे शामिल नहीं करते हैं।

+0

मुझे उन चीज़ों की आवश्यकता नहीं है जिन्हें मैं शामिल करने का प्रयास कर रहा हूं, लेकिन यह कोड में कार्यक्षमता जोड़ता है। तो मैं सुरक्षित रूप से शामिल करने की कोशिश कर रहा हूं। इसके अलावा, मैंने अभी जांच की है, यह फ़ंक्शन 5.0.4 के रूप में बहिष्कृत है। उत्तर के लिए धन्यवाद! –

1

आदर्श समाधान से कम मैंने सोचा कि मैं यहां जन्म के लिए उल्लेख करूँगा। मूल विचार here है।

आप एक बुरी 'आवश्यकता' पर प्राप्त होने वाली E_PARSE त्रुटि को कैप्चर कर सकते हैं और इसे शटडाउन फ़ंक्शन पर सौंप सकते हैं। विचार पार्सिंग त्रुटि को दबाने के लिए है ...

register_shutdown_function('post_plugin_include'); 
@require 'bad_include.php'; 

फिर तथ्य के बाद अपना प्राथमिक निष्पादन करें।

function post_plugin_include() { 
    if(is_null($e = error_get_last()) === false) { 
     // do something else 
    } 
} 

जैसा कि मैंने कहा, आदर्श से कम लेकिन दिलचस्प है।

+0

मैंने इसे पहले कभी नहीं देखा है, और यह कुछ रोचक विचार प्रदान करता है। साझा करने के लिए धन्यवाद। +1 –

+0

@ मार्क टॉमलिन, निश्चित रूप से। – allnightgrocery

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