PHP में गतिशील स्थिर नाम


80

मैं गतिशील रूप से एक स्थिर नाम बनाने की कोशिश कर रहा हूं और फिर मूल्य पर पहुंच सकता हूं।

define( CONSTANT_1 , "Some value" ) ;

// try to use it dynamically ...
$constant_number = 1 ;
$constant_name = ("CONSTANT_" . $constant_number) ;

// try to assign the constant value to a variable...
$constant_value = $constant_name;

लेकिन मुझे लगता है कि $ निरंतर मूल्य में अभी भी NAME की स्थिरांक है, और VALUE नहीं है।

मैंने अप्रत्यक्ष स्तर के दूसरे स्तर की भी कोशिश की $$constant_name लेकिन यह एक चर को स्थिर नहीं बना देगा।

क्या कोई इस पर कुछ प्रकाश डाल सकता है?

जवाबों:



73

और यह प्रदर्शित करने के लिए कि यह वर्ग स्थिरांक के साथ भी काम करता है:

class Joshua {
    const SAY_HELLO = "Hello, World";
}

$command = "HELLO";
echo constant("Joshua::SAY_$command");

12
वर्थ नोटिंग कि आपको पूरी तरह से योग्य (नामांकित) वर्ग नाम निर्दिष्ट करने की आवश्यकता हो सकती है यदि निरंतर एक वर्ग में है जो वर्तमान नामस्थान में नहीं है - भले ही आपने अपनी फ़ाइल में कक्षा के लिए "उपयोग" जोड़ा हो।
एकतरफा

1
यह उत्तर अच्छे उदाहरण के कारण महान है। कि वास्तव में मैं क्या देख रहा था :) धन्यवाद!
एलचुपकाबरा

6
@lopsided ::classनिरंतर का उपयोग पूरी तरह से योग्य नाम स्थान को प्राप्त करने के लिए किया जा सकता है, उदाहरण के लिए:constant(YourClass::class . '::CONSTANT_' . $yourVariable);
विलेम-एर्ट

1
ध्यान दें कि ::classकीवर्ड php 5.5
T30

9

अपनी कक्षा में गतिशील स्थिर नामों का उपयोग करने के लिए आप परावर्तन सुविधा (php5 के बाद से) का उपयोग कर सकते हैं:

$thisClass = new ReflectionClass(__CLASS__);
$thisClass->getConstant($constName);

उदाहरण के लिए: यदि आप वर्ग में केवल विशिष्ट (SORT_ *) स्थिरांक को फ़िल्टर करना चाहते हैं

class MyClass 
{
    const SORT_RELEVANCE = 1;
    const SORT_STARTDATE = 2;

    const DISTANCE_DEFAULT = 20;

    public static function getAvailableSortDirections()
    {
        $thisClass = new ReflectionClass(__CLASS__);
        $classConstants = array_keys($thisClass->getConstants());

        $sortDirections = [];
        foreach ($classConstants as $constName) {
            if (0 === strpos($constName, 'SORT_')) {
                $sortDirections[] =  $thisClass->getConstant($constName);
            }
        }

        return $sortDirections;
    }
}

var_dump(MyClass::getAvailableSortDirections());

परिणाम:

array (size=2)
  0 => int 1
  1 => int 2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.