2012-04-23 15 views
13

में विधि है, तो वर्तमान में मेरे कोड इस तरह दिखता है:चेक वर्ग पीएचपी

switch ($_POST['operation']) { 
    case 'create': 
     $db_manager->create(); 
     break; 
    case 'retrieve': 
     $db_manager->retrieve(); 
     break; 
... 
} 

मुझे क्या करना चाहते हैं, अगर विधि कहा जाता $_POST['operation'] मौजूद है की जाँच करने के लिए: यदि हाँ तो इसे कहते हैं, और "त्रुटि" गूंज क्या यह संभव है? मैं यह कैसे कर सकता हूँ?

उत्तर

29

आप method_exists उपयोग कर सकते हैं:

if (method_exists($db_manager, $_POST['operation'])){ 
    $db_manager->{$_POST['operation']}(); 
} else { 
    echo 'error'; 
} 

हालांकि मैं दृढ़ता से सलाह आप प्रोग्रामिंग इस तरह के बारे में मत जाओ ...

+1

इस तरह क्यों नहीं जाना है? – heron

+4

@epic_syntax: क्योंकि मैं wget/curl के साथ, POST वैरिएबल को धोखा दे सकता हूं और उन विधियों के लिए प्रिये जो आप जरूरी नहीं चाहते हैं। साथ ही, आप सीधे उपयोगकर्ता इनपुट पर भरोसा नहीं करते हैं, आप हमेशा इसे स्वच्छ करना चाहते हैं। मूल रूप से, यदि आप कहीं भी '$ _POST [...] 'का उपयोग कर रहे हैं, लेकिन सुरक्षित फ़ाइल के लिए चेक में एम्बेड की गई आपकी फ़ाइल का शीर्ष, आप इसे गलत कर रहे हैं और परेशानी के लिए पूछ रहे हैं। –

+0

और मैं लगभग हालांकि, आप [PHP का उपयोग न करने के लिए] की सिफारिश करेंगे [http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/) :) – iblue

9

आप is_callable() या method_exists() उपयोग कर सकते हैं।

उनके बीच का अंतर यह है कि उत्तरार्द्ध मामले के लिए काम नहीं करेगा, अगर __call() विधि कॉल को संभालता है।

2

आप method_exists() उपयोग कर सकते हैं। लेकिन यह एक बहुत बुरा विचार है

$_POST['operation'] कुछ जादू समारोह नाम (__set() की तरह) के लिए सेट है, तो अपने कोड अभी भी विस्फोट हो जाएगा। बेहतर फ़ंक्शन नामों की सरणी का बेहतर उपयोग करें।

+0

मुझे लगता है, आपका मतलब कुछ ऐसा है। $ ऑपरेशंस = सरणी ("पुनर्प्राप्त करें", "बनाएं"); अगर (जारीकर्ता ($ _ POST ['ऑपरेशन']) && in_array ($ _ POST ['ऑपरेशन'], $ संचालन)) { $ db_manager -> {$ _ POST ['ऑपरेशन']}(); } क्या मैं सभी उपलब्ध विधियों को स्वचालित रूप से या केवल मैन्युअल रूप से सरणी में एकत्र कर सकता हूं? – heron

+0

उपयोगकर्ताओं को किसी ऑब्जेक्ट में मनमाना तरीके से कॉल करने देना आम तौर पर एक बुरा विचार है (और यह नरक के रूप में धीमा है)। अपनी खुद की सूची बनाएं, या अपने प्रश्न से स्विच स्टेटमेंट का बेहतर उपयोग करें। – iblue

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