2013-08-15 6 views
15

शीर्षक कहता है, मैं वास्तव में इसे स्पष्ट करना चाहता हूं। मैंने इस विषय पर कुछ लेख और पोस्टिंग पढ़ी हैं, कुछ सिर्फ मेरे लिए क्लिक नहीं कर रहा है। मैं जोड़ूंगा मैं PHP के लिए थोड़ा नया हूँ। ठीक है, मैं यही समझना चाहता हूं;PHP परिभाषित() नामस्थान स्पेयरिफिकेशन के अंदर स्थिरांक

namespace Information; 
define('ROOT_URL', 'information/'); 
define('OFFERS_URL', ROOT_URL . 'offers/'); 

namespace Products; 
define('ROOT_URL', 'products/'); 
define('OFFERS_URL', ROOT_URL . 'offers/'); 

मैं स्थिरांक, constructable होने के लिए यानी आधार निरंतर (रों) होगा, तो इस से स्थिरांक निर्माण कारण है कि मैं परिभाषित ('NAME', मूल्य) का उपयोग कर रहा चाहते हैं ;.

मेरा प्रश्न यह है कि, ROOT_URL का मूल्य उसके 'नेमस्पेस' के सापेक्ष मूल्य उत्पन्न करेगा? इस कदर;

$info_offers_url = \Information\OFFERS_URL; ('information/offers/') 
$prod_offers_url = \Products\OFFERS_URL;  ('products/offers/') 

या परिभाषित(); वैश्विक दायरे में ROOT_URL रखें, इसलिए मुझे यह नहीं करना चाहिए? क्या कोई बेहतर अभ्यास है?

सभी सहायता की बहुत सराहना की जाती है।

+4

का हवाला देते हुए: 'superglobals की तरह, एक निरंतर की गुंजाइश, global.' है वे namespaced नहीं कर रहे हैं –

+0

@Mark बेकर आप बहुत बहुत धन्यवाद। मैं आपकी प्रतिक्रिया को उत्तर के रूप में कैसे चिह्नित करूं, और आपको टिक टिके? बस आपको कुछ और प्रतिनिधि अंक देना चाहते हैं –

उत्तर

20

यदि आप किसी नामस्थान में निरंतर परिभाषित करना चाहते हैं, तो आपको परिभाषित करने के लिए अपने कॉल में नामस्थान निर्दिष्ट करना होगा(), भले ही आप किसी नामस्थान से परिभाषित() को कॉल कर रहे हों। निम्नलिखित उदाहरण जो मैंने कोशिश की थी, इसे स्पष्ट कर देगा।

निम्नलिखित कोड वैश्विक नामस्थान में निरंतर "कॉन्स्टान्टा" को परिभाषित करेगा (यानी "\ CONSTANTA")।

<?php 
namespace mynamespace; 
define('CONSTANTA', 'Hello A!'); 
?> 

यदि आप एक नाम स्थान के लिए निरंतर परिभाषित करना चाहते हैं तो आप को परिभाषित कर सकते

<?php 
namespace test; 
define('test\HELLO', 'Hello world!'); 
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!'); 
?> 

Manual

+8

इसके लायक होने के लिए, यह वास्तविक मैनुअल से नहीं, उपयोगकर्ता टिप्पणियों से है। –

+0

आप नेमस्पेड स्थिरांक भी आयात कर सकते हैं: 'कॉन्स फू \ बार' का उपयोग करें। _const_ पर ध्यान दें। – Bell

+0

उन्हें आयात करने में सक्षम होने के कारण यह भी साबित होता है कि यह नाम में बैकस्लैश की अनुमति के विपरीत असली नामस्थान है। – Bell

9

से लिया की तरह namespaced स्थिरांक का उपयोग करना काफी आसान है, लेकिन आप const कीवर्ड का उपयोग करना चाहिए।

तो फिर तुम सीधे बैकस्लैश \ का उपयोग कर लगातार कॉल कर सकते हैं:

namespace Dummy\MyTime; 
const MONTHS = 12; 
const WEEKS = 52; 
const DAYS = 365; 


namespace Test; 
use Dummy\MyTime; 

$daysPerWeek = MyTime\DAYS/MyTime\WEEKS; 
$daysPerMonth = MyTime\DAYS/MyTime\MONTHS; 

echo "Days per week: $daysPerWeek\n"; // 7.0192307692308 
echo "Days per month: $daysPerMonth\n"; // 30.416666666667 

मुझे लगता है कि इस define का उपयोग करने से क्लीनर है।

कहा करने के बाद अगर आप PHP का उपयोग कर रहे हैं, आप क्या चाहते हैं केवल काम करेंगे (एक निरंतर करने के लिए एक अदिश अभिव्यक्ति आवंटित)> = 5.6:

namespace Information; 
const ROOT_URL = 'information/'; 
const OFFERS_URL = ROOT_URL . 'offers/'; 

namespace Products; 
const ROOT_URL = 'products/'; 
const OFFERS_URL = ROOT_URL . 'offers/'; 

namespace Test; 
$info_offers_url = \Information\OFFERS_URL; // information/offers/ 
$prod_offers_url = \Products\OFFERS_URL; // products/offers/ 

मुझे आशा है कि यह आप में मदद मिलेगी।

स्रोत: namual से http://php.net/manual/en/migration56.new-features.php

+1

हालांकि यह उत्तर सीधे 'परिभाषित() 'के बारे में नहीं है, यह बहुत उपयोगी है। – BlitZ

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