अस्वीकरण; मैं नुकसान और eval के "बुराइयों" से पूरी तरह वाकिफ हूँ, सहित, लेकिन तक सीमित नहीं: प्रदर्शन के मुद्दों, सुरक्षा, पोर्टेबिलिटी आदिPHP eval और कैप्चरिंग त्रुटियों (जितना संभव हो सके)
समस्या
eval पर पीएचपी मैनुअल पढ़ना .. ।
eval() NULL भेजता है जब तक वापसी का मूल्यांकन किया कोड में कहा जाता है, जो मामले में वापस जाने के लिए भेजे गए मान वापस लौटा है। यदि में एक पार्स त्रुटि है, तो मूल्यांकन कोड, eval() लौटाता है और निम्नलिखित कोड का निष्पादन सामान्य रूप से जारी रहता है। eval() में set_error_handler() का उपयोग करके एक पार्स त्रुटि को पकड़ने के लिए संभव नहीं है।
संक्षेप में, झूठी वापसी को छोड़कर कोई त्रुटि कैप्चर नहीं है जो बहुत उपयोगी है, लेकिन मैं सुर ईआई बेहतर तरीके से कर सकता हूं!
कारण
साइट की कार्यक्षमता मैं पर काम कर रहा हूँ का एक हिस्सा भाव को क्रियान्वित करने पर निर्भर करता है। मैं सैंडबॉक्स या निष्पादन मॉड्यूल के पथ से गुजरना नहीं चाहता, इसलिए मैंने eval का उपयोग समाप्त कर दिया है। इससे पहले कि आप चिल्लाओ "क्या होगा यदि ग्राहक खराब हो गया ?!" पता है कि ग्राहक बहुत भरोसेमंद है; वह अपनी साइट को तोड़ना नहीं चाहेगा, और किसी को भी इस कार्यक्षमता तक पहुंच प्राप्त करने के लिए सर्वर की मालिकाना बहुत अधिक है, बेकार होने के बावजूद।
क्लाइंट एक्सेल जैसे अभिव्यक्तियों के बारे में जानता है, और यह थोड़ा अंतर बताते हुए कोई समस्या नहीं है, हालांकि, कुछ प्रकार की चेतावनी बहुत अधिक मानक कार्यक्षमता है।
define('CR',chr(13));
define('LF',chr(10));
function test($cond=''){
$cond=trim($cond);
if($cond=='')return 'Success (condition was empty).'; $result=false;
$cond='$result = '.str_replace(array(CR,LF),' ',$cond).';';
try {
$success=eval($cond);
if($success===false)return 'Error: could not run expression.';
return 'Success (condition return '.($result?'true':'false').').';
}catch(Exception $e){
return 'Error: exception '.get_class($e).', '.$e->getMessage().'.';
}
}
नोट्स
- समारोह किसी भी घटना
- में एक संदेश स्ट्रिंग रिटर्न कोड अभिव्यक्ति एक एकल लाइन टुकड़ा होना चाहिए:
यह वही है मैं अब तक किया है PHP के बिना, PHP टैग के बिना और बिना किसी अर्धविराम के
- नई लाइनें रिक्त स्थान में परिवर्तित हो जाती हैं
- एक चर परिणाम को रोकने के लिए जोड़ा जाता है (अभिव्यक्ति, एक अस्थायी चर प्रयोग किया जाता है सही या गलत, और आदेश eval की वापसी के साथ संघर्ष के लिए नहीं में लौटना चाहिए।)
तो, क्या आप आगे बढ़ेगी उपयोगकर्ता सहयोगी? क्या कोई और पार्सिंग फ़ंक्शंस है जो संभावित त्रुटियों/मुद्दों को बेहतर तरीके से इंगित कर सकता है?
क्रिस।
अगर आप क्या "भाव" आप का उपयोग करेगा के बारे में अधिक प्रतिक्रिया प्रदान कर सकता है के साथ, हो सकता है हम मदद कर सकते हैं चाहिए अधिक। मैं उपयोगकर्ता इनपुट को प्रमाणित करने के लिए कुछ अच्छी टोकन_get_all सामग्री के बारे में सोच सकता हूं;) – NikiC
सामान्य PHP कोड? मैं परिभाषित कार्यों और कक्षाओं के संभावित अपवाद के साथ, PHP की पूर्ण पहुंच की अनुमति देने की योजना बना रहा हूं, जिसकी आवश्यकता नहीं है। – Christian