2012-03-02 12 views
12

मैं निरंतर परिभाषित करने की कोशिश कर रहा हूं, लेकिन अगर इसे पहले ही परिभाषित किया गया है, तो मैं इसे फिर से परिभाषित नहीं करना चाहता हूं।क्या पीएचपी के पास सी/सी ++ का #ifdef है?

#ifndef BASEPATH 
#define BASEPATH /mnt/www 
#endif 

PHP में यह करने के लिए सबसे खूबसूरत तरीका क्या है: यहाँ एक सी नमूना है?

+1

http://php.net/manual/en/function.defined.php – j08691

+0

तकनीकी रूप से, नहीं, क्योंकि PHP के 'परिभाषित'/'परिभाषित' का मूल्यांकन ** रनटाइम ** पर किया जाता है (PHP परिभाषा लगभग समान होती है चर), और कोई (बिल्टिन) ** प्रीप्रोसेसर ** नहीं है जो कोड की रेखाओं के समूह को अपने सिंटैक्स शुद्धता का मूल्यांकन किए बिना अक्षम करने में सक्षम है (उदाहरण के लिए, PHP के 'के साथ वाक्यगत रूप से गलत कोड अक्षम करना (परिभाषित (...)) 'मदद नहीं करेगा)। – leemes

उत्तर

23

defined() और define() का उपयोग करें।

if (!defined('BASEPATH')) { 
    define('BASEPATH', '/mnt/www'); 
} 
+2

अच्छा! जो मैंने तय किया है वह यह है (सभी एक पंक्ति में): 'परिभाषित (' BASE_PATH ') || परिभाषित करें ('BASE_PATH', '/ mnt/www /'); 'यदि' परिभाषित() '** सत्य ** है, तो शेष सशर्त कभी मूल्यांकन नहीं किया जाता है, यदि' परिभाषित() 'रिटर्न ** झूठी ** , सशर्त के दूसरे भाग का मूल्यांकन किया जाता है और 'BASE_PATH' परिभाषित किया जाता है। – DavidH

4

उपयोग defined() समारोह

if(!defined("constantname")) { 
    define("constantname", "value"); 
} 
1

उपयोग defined():

<?php 
/* Note the use of quotes, this is important. This example is checking 
* if the string 'TEST' is the name of a constant named TEST */ 
if (defined('TEST')) { 
    echo TEST; 
} 
?> 
1

यह ऊपर राडू के जवाब की सघन नए सिरे से लिखना है (और हर कोई है)।

defined('BASE_PATH') || define('BASE_PATH', '/mnt/www/');  

यही है। यदि defined('BASE_PATH')सच का मूल्यांकन करता है, तो शेष सशर्त कभी मूल्यांकन नहीं होता है। यदि यह झूठी लौटाता है, तो सशर्त के दूसरे भाग का मूल्यांकन किया जाता है और BASE_PATH परिभाषित हो जाता है।

+2

मैं एक लाइन पर भी लंबे संस्करण की अनुशंसा करता हूं, क्योंकि अतिरिक्त पठनीयता लंबे समय तक फायदेमंद होगी ... 'if (! परिभाषित ('BASE_PATH')) परिभाषित करें ('BASE_PATH', '/ mnt/www/');' इस कंडेन्स्ड संस्करण से केवल * 3 अक्षर * लंबा है, और इसे पठनीयता में इसके लिए बनाता है। – rid

5

सी में, #ifdef में परिभाषा मौजूद है या नहीं, इस पर आधारित कस्टम कोड लिखना/सक्षम/अक्षम करना शामिल है। हालांकि ओपी इस तरह के उत्तर की तलाश नहीं कर रहा था, खोज इंजन उपयोगकर्ताओं को विस्तारित उत्तर प्राप्त करने में रुचि हो सकती है। (इस प्रश्न ने मुझे निम्नलिखित उत्तर खोजने के लिए आरटीएम की मदद की।)

यदि किसी के पास एक .php फ़ाइल है जो कई बार शामिल है, तो केवल एक फ़ंक्शन घोषित करना सुविधाजनक हो सकता है अगर इसे पहले से घोषित नहीं किया गया था एक ही फाइल के। सुविधा, इस मामले में, एक ही फ़ाइल में एक अलग include_once .php फ़ाइल और अनावश्यक रूप से अलग कोड डालने की बजाय उसी फ़ाइल में कसकर-संबंधित कोड रख रहा है जिसका अर्थ आम तौर पर अन्य संदर्भों (फ़ाइलों) में पुन: उपयोग नहीं किया जाता है।

के बाद से इसे फिर से घोषित कार्यों को कई बार करने के लिए बेकार/अनुचित लगता है, यह पता चला है कि एक # ifdef की तरह PHP में निर्माण संभव है:

if (! function_exists('myfunc')) 
{ 
    function myfunc(...) 
    { 
    ... 
    } 
} 

कहाँ ... अपनी भरण-इन-मिलने वाली इंगित करता है खाली।

यह भी देखें: function_exists (PHP 4, PHP 5) (डब्ल्यू/टिप्पणियां)।

+0

ऐसा प्रतीत होता है कि वैश्विक चर myfunc() के भीतर से दिखाई नहीं दे रहे हैं, इसलिए संदर्भों को तर्क के रूप में पारित किया जाना चाहिए (आवश्यकतानुसार)। – kbulgrien

+0

आपका कोड सिंटैक्टिक रूप से गलत है – zerkms

+0

हां, मेरे पास कथन के अंत में अर्ध-कॉलन था (और अब यह चला गया है) लेकिन '...' को उत्तर के शरीर में स्पष्ट रूप से वर्णित किया गया है। कोड वास्तविक वेबसाइट पर किसी चीज की प्रतिलिपि/पेस्ट है, केवल मैंने तर्क और फ़ंक्शन बॉडी को '...' के साथ बदल दिया है और फ़ंक्शन नाम बदल दिया है। – kbulgrien

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