2010-05-07 16 views
43

मुझे पता है कि आप एक दूसरे का उपयोग कर स्ट्रिंग संयोजन के मामले में वैश्विक स्थिरांक बना सकते हैं:क्या मैं PHP में क्लास कॉन्स्ट को परिभाषित करने के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग कर सकता हूं?

define('FOO', 'foo'); 
define('BAR', FOO.'bar'); 
echo BAR; 

'foobar' प्रिंट होगा।

हालांकि, मुझे क्लास स्थिरांक का उपयोग करने की कोशिश करने में त्रुटि हो रही है।

class foobar { 
    const foo = 'foo'; 
    const foo2 = self::foo; 
    const bar = self::foo.'bar'; 
} 

foo2 मुद्दे के बिना परिभाषित किया गया है, लेकिन घोषित स्थिरांक बार

Parse error: syntax error, unexpected '.', expecting ',' or ';'

बाहर त्रुटि होगा मैं भी sprintf जैसे कार्यों का उपयोग कर की कोशिश की है() लेकिन यह बायां कोष्टक किसी भी तुलना में अधिक पसंद नहीं है स्ट्रिंग concatenator '।'।

तो क्या एक दूसरे के मामले में एक दूसरे के मामले में कक्षा स्थिरांक बनाने के लिए कोई तरीका है जैसे foo2?

उत्तर

15

IMHO, इस सवाल है, धन्यवाद @jammin को comment

पीएचपी 5.6 जब से तुम एक निरंतर के लिए एक स्थिर अदिश भाव परिभाषित करने के लिए अनुमति दी जाती है के लिए एक जवाब पीएचपी 5.6+ हकदार:

हालांकि यह सवाल का हिस्सा नहीं है, लेकिन किसी को कार्यान्वयन की सीमाओं से अवगत होना चाहिए।निम्नलिखित काम करेंगे नहीं है, हालांकि यह स्थिर सामग्री है (लेकिन कार्यावधि में हेरफेर किया जा सकता है):

class Foo { 
    public static $bar = "baz"; 
    const HAZ = self::$bar . " boo\n"; 
} 
// PHP Parse error: syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS) 

class Foo { 
    public static function bar() { return "baz";} 
    const HAZ = self::bar() . " boo\n"; 
} 
// PHP Parse error: syntax error, unexpected '(', expecting ',' or ';' 

के लिए और अधिक जानकारी के पर एक नज़र डालें: https://wiki.php.net/rfc/const_scalar_exprs और http://php.net/manual/en/language.oop5.constants.php

0

संख्या।

(मुझे नहीं लगता कि वहाँ है)

14

हमेशा इस तरह सामान के लिए वापस भरोसेमंद मार्गदर्शन करने के लिए आते हैं।

constants के बारे में:

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call.

तो ... "नहीं" जवाब होगा: डी

2

वर्ग स्थिरांक के लिए, आप एक निरंतर अभिव्यक्ति के अलावा और कुछ नहीं सौंप सकते। PHP manual का हवाला देते हुए:

"। मूल्य स्थिर अभिव्यक्ति, नहीं होना चाहिए एक चर, एक संपत्ति, गणितीय प्रक्रिया का एक परिणाम है, या एक समारोह कॉल (उदाहरण के लिए)"

34

एक ही रास्ता है परिभाषित() एक अभिव्यक्ति और फिर वर्ग

define('foobar', 'foo' . 'bar'); 

class Foo 
{ 
    const blah = foobar; 
} 

echo Foo::blah; 

एक अन्य विकल्प bugs.php.net और कृपया उन्हें पूछना इसे ठीक करने के लिए जाने के लिए है में है कि निरंतर का उपयोग करें।

+0

मैं के लिए तर्क समझ में नहीं आता वैश्विक स्थिरांक और कक्षा स्थिरांक के बीच अलग सेटर व्यवहार। मुझे लगता है कि मैं जल्द ही bugs.php.net पर जाउंगा :) लेकिन अल्पकालिक के लिए, मैं शायद कक्षाओं से बाहर स्थिरांक को स्थानांतरित कर दूंगा और फिर उन्हें कक्षा में कॉपी कर दूंगा। तो kludgy! – selfsimilar

+8

bug.php.net ने मूल रूप से मुझे बताया कि वे इसे ठीक नहीं करेंगे। "यह कार्यान्वयन में एक सीमा है। कक्षा निरंतर के लिए हमें संकलन समय पर निरंतर मूल्य की आवश्यकता होती है और अभिव्यक्तियों का मूल्यांकन नहीं कर सकता। परिभाषित() एक नियमित कार्य है, जिसे रन टाइम पर मूल्यांकन किया जाता है और इसलिए किसी भी रूप का कोई मूल्य हो सकता है इसे बदलने से कंपाइलर में निष्पादन चरण जोड़ना होगा ... " जो वास्तव में बीएस है, निम्न कोड काम करता है: परिभाषित करें ('बार', यह वर्क्स :: foo। 'Bar'); कक्षा इस वर्क्स { const foo = 'foo'; कॉन्स बार = बार; } इस कार्य को प्रतिबिंबित करें :: बार; यह बिना किसी त्रुटि के 'foobar' आउटपुट करेगा। – selfsimilar

+2

किसी और के लिए इसे ढूंढने के लिए, बग [# 42355] (https://bugs.php.net/bug.php?id=42355) है। –

1

यह सीधे आप जो खोज रहे हैं नहीं हो सकता है, लेकिन मैं इस सूत्र के पार है, तो यहाँ आया एक समाधान है कि मैं एक मुद्दा मैं हो रही थी के लिए इस्तेमाल किया है (@ user187291 के जवाब के आधार पर):

define('app_path', __DIR__ . '/../../'); 
const APPLICATION_PATH = app_path; 
. 
. 
. 
require_once(APPLICATION_PATH . "some_directory/some_file.php"); 
. 
. 
. 

महान काम करने लगता है!

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

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