मुझे पता है कि आप एक दूसरे का उपयोग कर स्ट्रिंग संयोजन के मामले में वैश्विक स्थिरांक बना सकते हैं:क्या मैं 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?
मैं के लिए तर्क समझ में नहीं आता वैश्विक स्थिरांक और कक्षा स्थिरांक के बीच अलग सेटर व्यवहार। मुझे लगता है कि मैं जल्द ही bugs.php.net पर जाउंगा :) लेकिन अल्पकालिक के लिए, मैं शायद कक्षाओं से बाहर स्थिरांक को स्थानांतरित कर दूंगा और फिर उन्हें कक्षा में कॉपी कर दूंगा। तो kludgy! – selfsimilar
bug.php.net ने मूल रूप से मुझे बताया कि वे इसे ठीक नहीं करेंगे। "यह कार्यान्वयन में एक सीमा है। कक्षा निरंतर के लिए हमें संकलन समय पर निरंतर मूल्य की आवश्यकता होती है और अभिव्यक्तियों का मूल्यांकन नहीं कर सकता। परिभाषित() एक नियमित कार्य है, जिसे रन टाइम पर मूल्यांकन किया जाता है और इसलिए किसी भी रूप का कोई मूल्य हो सकता है इसे बदलने से कंपाइलर में निष्पादन चरण जोड़ना होगा ... " जो वास्तव में बीएस है, निम्न कोड काम करता है: परिभाषित करें ('बार', यह वर्क्स :: foo। 'Bar'); कक्षा इस वर्क्स { const foo = 'foo'; कॉन्स बार = बार; } इस कार्य को प्रतिबिंबित करें :: बार; यह बिना किसी त्रुटि के 'foobar' आउटपुट करेगा। – selfsimilar
किसी और के लिए इसे ढूंढने के लिए, बग [# 42355] (https://bugs.php.net/bug.php?id=42355) है। –