PHP - एक वर्ग के अंदर निरंतर परिभाषित करता है


87

मैं किसी वर्ग के अंदर एक स्थिरांक को कैसे परिभाषित कर सकता हूं, और इसे बनाता हूं इसलिए यह केवल तब दिखाई देता है जब इसे कक्षा के संदर्भ में कहा जाता है?

....कुछ इस तरह Foo::app()->MYCONSTANT;

(और अगर इसे MYCONSTANTनजरअंदाज किया जाना चाहिए)


3
मैं इस मुद्दे पर हाल ही में stackoverflow.com/q/5710676/560299
Ibu

जवाबों:


140

देखें क्लास कांस्टेंट :

class MyClass
{
    const MYCONSTANT = 'constant value';

    function showConstant() {
        echo  self::MYCONSTANT. "\n";
    }
}

echo MyClass::MYCONSTANT. "\n";

$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0

इस मामले MYCONSTANTमें स्वयं के द्वारा गूँजने से अपरिभाषित स्थिरांक के बारे में एक सूचना जुटेगी और निरंतर नाम स्ट्रिंग में परिवर्तित हो जाएगा "MYCONSTANT"


संपादित करें - शायद आप जो देख रहे हैं वह इस स्थिर गुण / चर है :

class MyClass
{
    private static $staticVariable = null;

    public static function showStaticVariable($value = null)
    {
        if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
        {
            self::$staticVariable = $value;
        }

        return self::$staticVariable;
    }
}

MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"

लेकिन यह कक्षा के एक समारोह के अंदर इसे परिभाषित करने के लिए काम नहीं करता है :(
एलेक्स

@ एलेक्स: नहीं, यह (AFAIK, कोई अस्पष्ट तरीका हो सकता है)।
एलिक्स एक्सल

3
(is_null(self::$staticVariable) === true) && (isset($value) === true)के रूप में बहुत अधिक सफल होगा self::$staticVariable === null && $value !== null$valueहमेशा फ़ंक्शन के अंदर सेट किया जाएगा , इसलिए उपयोग करने की कोई आवश्यकता नहीं है isset। और हाइपर-स्पष्ट === trueकुछ भी नहीं जोड़ता है।
deceze

1
क्या हमारी यह बातचीत पहले हुई थी? यह मदद नहीं कर सकता, मैं वास्तव में उस शैली को नापसंद करता हूं। ;-D
deceze

@ डिसेज़: हाँ। मुझे इस शैली की बहुत आदत है और यह मेरे लिए काम करता है इसलिए मैं इसके साथ रहना चाहता हूं, लेकिन आप सही भी हैं। =)
एलिक्स एक्सल

24

यह पुराना सवाल है, लेकिन अब PHP 7.1 पर आप निरंतर दृश्यता को परिभाषित कर सकते हैं।

उदाहरण

<?php
class Foo {
    // As of PHP 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>

PHP 7.1 में उपरोक्त उदाहरण का आउटपुट:

बार

घातक त्रुटि: अनकवर्ड एरर: निजी कास्ट को एक्सेस नहीं कर सकता Foo :: BAZ in…

नोट: PHP के रूप में 7.1.0 दृश्यता संशोधक वर्ग स्थिरांक के लिए अनुमति दी जाती है।

अधिक जानकारी यहाँ


11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

यह वर्ग स्थिरांक बनाने का एकमात्र तरीका है । ये स्थिरांक हमेशा विश्व स्तर पर सुलभ Foo::BARहोते हैं, लेकिन वे केवल माध्यम से सुलभ नहीं होते हैं BAR

जैसे सिंटैक्स प्राप्त करने के लिए Foo::baz()->BAR, आपको उस baz()वर्ग के फ़ंक्शन से एक ऑब्जेक्ट वापस करना होगा Fooजिसके पास एक संपत्ति है BAR । हालांकि यह एक स्थिर नहीं है। आपके द्वारा परिभाषित कोई भी स्थिरांक हमेशा कहीं से भी वैश्विक रूप से सुलभ होता है और इसे फ़ंक्शन कॉल परिणामों तक सीमित नहीं किया जा सकता है।


6

यह एक बहुत पुराना सवाल है, लेकिन शायद यह जवाब अभी भी किसी और की मदद कर सकता है।

आप एक सार्वजनिक स्थिरांक का अनुकरण कर सकते हैं जो एक अंतिम दायरे को लागू करने के लिए एक वर्ग गुंजाइश के भीतर प्रतिबंधित है जो एक पूर्व-परिभाषित मान लौटाता है, जैसे:

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

किसी विधि पर अंतिम कीवर्ड विधि के विस्तार को फिर से परिभाषित करने से रोकता है। आप अंतिम कीवर्ड को कक्षा की घोषणा के सामने रख सकते हैं, जिस स्थिति में कीवर्ड क्लास इनहेरिटेंस को रोकता है।

निम्नलिखित कोड का उपयोग करने के लिए एलेक्स को वास्तव में क्या मिल रहा था:

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}

उत्सर्जित स्थिर मूल्य इस तरह सुलभ होगा:

Foo::app()->MYCONSTANT();

3

आप php में एक वर्ग स्थिरांक को परिभाषित कर सकते हैं। लेकिन आपकी कक्षा निरंतर किसी भी वस्तु उदाहरण से सुलभ होगी। यह php की कार्यक्षमता है। हालाँकि, php7.1 के रूप में , आप अपने वर्ग स्थिरांक को पहुँच संशोधक ( public, privateया protected) के साथ परिभाषित कर सकते हैं ।

चारों ओर एक कार्य आपके स्थिरांक को परिभाषित करना होगा privateया protectedफिर उन्हें एक के माध्यम से पठनीय बनाना होगा static function। यह फ़ंक्शन स्थैतिक संदर्भ से कॉल करने पर केवल स्थिर मान लौटाता है।

आप इस मूल फ़ंक्शन को अपने मूल वर्ग में भी बना सकते हैं और इसे मूल कार्यक्षमता बनाने के लिए अन्य सभी वर्गों पर बस इस मूल वर्ग को इनहेरिट कर सकते हैं।

क्रेडिट: http://dwellupper.io/post/48/defining-class-constants-in-php

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