PHP स्थिरांक Arrays युक्त?


407

यह विफल रहा:

 define('DEFAULT_ROLES', array('guy', 'development team'));

जाहिर है, स्थिरांक सरणियों पकड़ नहीं कर सकते। इसके आसपास पाने का सबसे अच्छा तरीका क्या है?

define('DEFAULT_ROLES', 'guy|development team');

//...

$default = explode('|', DEFAULT_ROLES);

यह अनावश्यक प्रयास की तरह लगता है।


17
PHP 5.6 निरंतर सरणियों का समर्थन करता है, नीचे मेरा जवाब देखें।
एंड्रिया

1
जब आपको किसी सरणी को स्थिरांक के रूप में उपयोग करने की आवश्यकता होती है, तो क्या आप एक गणना करने की कोशिश कर रहे हैं? यदि ऐसा है, तो SplEnum का उपयोग करें: php.net/manual/en/class.splenum.php
ziGi

2
@ziGi आज इस मुद्दे पर आया, स्टोर करने के लिए विभिन्न प्रकार के चित्र हैं जिनके लिए विशिष्ट आयामों की आवश्यकता होती है, यह इन आयामों को चौड़ाई के लिए एक के बजाय निरंतर सरणियों और ऊंचाई के लिए एक के रूप में संग्रहीत करने के लिए उपयोगी हो गया।
मैट के

जवाबों:


498

नोट: जब यह स्वीकृत उत्तर है, तो यह ध्यान देने योग्य है कि PHP 5.6+ में आपके पास कॉन्स्टेबल सरणियाँ हो सकती हैं - नीचे एंड्रिया फॉल्स का उत्तर देखें

आप अपनी सारणी को क्रमबद्ध भी कर सकते हैं और फिर इसे स्थिर में रख सकते हैं:

# define constant, serialize array
define ("FRUITS", serialize (array ("apple", "cherry", "banana")));

# use it
$my_fruits = unserialize (FRUITS);

40
बस मैं इस समाधान को प्यार करना चाहता हूं :)
गेटकिलर

16
अच्छा लगा। लेकिन बुरी बात यह है कि आप किसी वर्ग को इस तरह परिभाषित नहीं कर सकते हैं।
ग्रीगोइरे

19
एक वर्ग में स्थिर चर के लिए बेहतर छड़ी।
जुरगेन पॉल

5
बहुत बुरा आप नहीं कर सकते:$fruit = FRUITS[0];
सोफीवॉर्स

20
यह कोड सुरुचिपूर्ण है, लेकिन बहुत धीमा है। यह सार्वजनिक स्टेटिक क्लास पद्धति का उपयोग करके कहीं बेहतर है जो सरणी लौटाता है।
संज्ञा

844

PHP 5.6 के बाद, आप एक ऐरे को स्थिर घोषित कर सकते हैं const:

<?php
const DEFAULT_ROLES = array('guy', 'development team');

जैसा कि आप अपेक्षा करेंगे, लघु सिंटैक्स भी काम करता है:

<?php
const DEFAULT_ROLES = ['guy', 'development team'];

यदि आपके पास PHP 7 है, तो आप अंततः उपयोग कर सकते हैं define(), जैसे आपने पहली बार कोशिश की थी:

<?php
define('DEFAULT_ROLES', array('guy', 'development team'));

41
इसे उखाड़ने की जरूरत है क्योंकि अन्य सभी उत्तर पुराने हैं या गलत उपयोगकर्ताओं द्वारा लिखे गए हैं।
एंड्रियास बर्गस्ट्रॉम्म

क्या यह केवल वाक्यविन्यास है? क्या आप पुराने परिभाषित फ़ंक्शन का उपयोग करने में सक्षम हैं? परिभाषित ('ARRAY_CONSTANT', सरणी ('आइटम 1', 'आइटम 2', 'आइटम 3'));
जैक

5
@JackNicholsonn दुर्भाग्य से आप define()यहाँ PHP 5.6 में उपयोग नहीं कर सकते हैं , लेकिन यह PHP 7.0 के लिए तय किया गया है । :)
एंड्रिया

@ AndreasBergström नहीं, यह सवाल बहुत नया है। यह सवाल 2009 में किया गया था! यह वाक्यविन्यास अब अधिकांश उपयोगकर्ताओं के लिए लगभग बेकार हो जाएगा। लगभग किसी के पास अपने सर्वर पर PHP 5.6 है। अन्य उत्तर पूरी तरह से ठीक हैं क्योंकि वे विकल्प भी प्रदान करते हैं। स्वीकृत उत्तर अब तक का एकमात्र व्यवहार्य तरीका है, यदि आप कक्षाओं का उपयोग नहीं करना चाहते हैं।
इस्माइल मिगुएल

@IsmaelMiguel इतना यकीन नहीं है कि वे सभी 5.6 है। विंडोज़ सर्वर पर किसी को भी अभी माइक्रोसॉफ्ट से 5.6 sql सर्वर ड्राइवर लगभग एक महीने पहले मिला था।
MH

141

आप उन्हें एक वर्ग के स्थिर चर के रूप में संग्रहीत कर सकते हैं:

class Constants {
    public static $array = array('guy', 'development team');
}
# Warning: array can be changed lateron, so this is not a real constant value:
Constants::$array[] = 'newValue';

यदि आपको यह विचार पसंद नहीं है कि सरणी को दूसरों द्वारा बदला जा सकता है, तो एक गेट्टर मदद कर सकता है:

class Constants {
    private static $array = array('guy', 'development team');
    public static function getArray() {
        return self::$array;
    }
}
$constantArray = Constants::getArray();

संपादित करें

PHP5.4 के बाद से, इंटरमीडिएट चर की आवश्यकता के बिना सरणी मूल्यों तक पहुंचना संभव है, अर्थात निम्नलिखित कार्य:

$x = Constants::getArray()['index'];

1
+1। मैं इसके लिए वर्षों से जा रहा हूं:const AtomicValue =42; public static $fooArray = ('how','di')
फ्रैंक नॉक

9
हालांकि यह मेरे लिए हास्यास्पद है कि हम php में अपरिवर्तनीय सरणियाँ नहीं बना सकते हैं, यह एक अच्छा समाधान प्रदान करता है।
एकोई Meexx

यदि आप निरंतर का उपयोग कर रहे हैं, तो मैं निश्चित रूप से एक फ़ंक्शन कॉल से बचूंगा, वे काफी महंगे हैं। स्टेटिक जाने का रास्ता है।
क्रिस सेफ़र्ट

1
यह समाधान मेरी उम्मीद से कहीं अधिक भयानक था: मुझे केवल सरणी के मूल्यों का हिस्सा चाहिए, इसलिए केवल सरणी प्राप्त करने के बजाय, मैंने फ़ंक्शन में कुछ मापदंडों का उपयोग किया। मेरे मामले में कॉन्स्टेंट :: getRelatedIDs ($ myID) मुझे केवल उन मूल्यों के साथ एक आंतरिक सरणी मिलती है जिनकी मुझे ज़रूरत थी (मैं इस फ़ंक्शन के अंदर कुछ आईडी सत्यापन भी करता हूं)। @cseufert पूरे एरे को प्राप्त करना और प्रत्येक मामले के लिए फ़िल्टर करना मेरे लिए बहुत अधिक महंगा होगा ...
आर्मफुट

1
निजी स्थैतिक सदस्य के साथ एक समारोह (getArray) होना स्थिरांक के लिए सबसे अच्छा प्रतिनिधित्व है क्योंकि वे परिवर्तन हो सकते हैं Bhat
सिंह भाटिया

41

यदि आप PHP 5.6 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो Andrea Faulds उत्तर का उपयोग करें

मैं इसे इस तरह उपयोग कर रहा हूं। मुझे उम्मीद है, यह दूसरों की मदद करेगा।

config.php

class app{
    private static $options = array(
        'app_id' => 'hello',
    );
    public static function config($key){
        return self::$options[$key];
    }
}

फ़ाइल में, जहाँ मुझे स्थिरांक की आवश्यकता है।

require('config.php');
print_r(app::config('app_id'));

मैंने वैसा ही किया जैसा आपने किया। तो प्रदर्शन अनुकूलन की तलाश थी कि क्या यह अच्छा है या कुछ और अगर बेहतर है।
नलपॉइंटर

हां मैं इस समाधान से सहमत हूं। जैसा कि सरल और आसान समझा जा सकता है ...
फारिस रेहान

12

यही है वह जो मेरे द्वारा उपयोग किया जाता है। यह सोलमरेज द्वारा प्रदान किए गए उदाहरण के समान है, लेकिन इस तरह आप सरणी में पूर्ण सरणी या केवल एक मान प्राप्त कर सकते हैं।

class Constants {
    private static $array = array(0 => 'apple', 1 => 'orange');

    public static function getArray($index = false) {
        return $index !== false ? self::$array[$index] : self::$array;
    }
}

इसे इस तरह उपयोग करें:

Constants::getArray(); // Full array
// OR 
Constants::getArray(1); // Value of 1 which is 'orange'

10

आप इसे एक स्थिर में JSON स्ट्रिंग के रूप में संग्रहीत कर सकते हैं। और देखने का अनुप्रयोग बिंदु, JSON अन्य मामलों में उपयोगी हो सकता है।

define ("FRUITS", json_encode(array ("apple", "cherry", "banana")));    
$fruits = json_decode (FRUITS);    
var_dump($fruits);

बिलकुल यही बात है जो मैं सोच रहा था। क्या यह वैध रूप से अच्छा जवाब नहीं है?
कोन एंटोनकोस

यह वास्तव में AngularJS के साथ अच्छी तरह से काम करता है क्योंकि यह JSON का उपभोग करता है। मुझे ऐसा लगता है कि यह बहुत बेहतर है कि धारावाहिक का जवाब है, लेकिन क्या कोई कारण है कि धारावाहिक बेहतर है? क्या यह शायद तेज है?
Drellgor

हां सीरियलाइजेशन तकनीकी रूप से तेज है। हालांकि, छोटे सेटों के लिए, जो कि ज्यादातर जरूरी है, मैं इस पद्धति को पसंद करता हूं क्योंकि यह सुरक्षित है। जब आप अमान्य कर देते हैं, तो कोड निष्पादित किया जा सकता है। यहां तक ​​कि अगर इस मामले में यह बहुत कम जोखिम है, तो मुझे लगता है कि हमें केवल चरम मामलों के लिए उपयोग या अनारक्षित को आरक्षित करना चाहिए।
मारियो अवध

9

PHP 5.6 से शुरू होकर, आप constनीचे दिए गए कीवर्ड का उपयोग करके निरंतर सरणियों को परिभाषित कर सकते हैं

const DEFAULT_ROLES = ['test', 'development', 'team'];

और विभिन्न तत्वों को नीचे के रूप में एक्सेस किया जा सकता है:

echo DEFAULT_ROLES[1]; 
....

PHP 7 के साथ शुरू, निरंतर सरणियों defineको नीचे के रूप में उपयोग करके परिभाषित किया जा सकता है :

define('DEFAULT_ROLES', [
    'test',
    'development',
    'team'
]);

और विभिन्न तत्वों को पहले की तरह ही एक्सेस किया जा सकता है।


3

मुझे पता है कि यह थोड़ा पुराना सवाल है, लेकिन यहाँ मेरा समाधान है:

<?php
class Constant {

    private $data = [];

    public function define($constant, $value) {
        if (!isset($this->data[$constant])) {
            $this->data[$constant] = $value;
        } else {
            trigger_error("Cannot redefine constant $constant", E_USER_WARNING);
        }
    }

    public function __get($constant) {
        if (isset($this->data[$constant])) {
            return $this->data[$constant];
        } else {
            trigger_error("Use of undefined constant $constant - assumed '$constant'", E_USER_NOTICE);
            return $constant;
        }
    }

    public function __set($constant,$value) {
        $this->define($constant, $value);
    }

}
$const = new Constant;

मैंने इसे परिभाषित किया क्योंकि मुझे स्थिरांक में वस्तुओं और सरणियों को संग्रहीत करने की आवश्यकता थी इसलिए मैंने php को भी रनकिट स्थापित किया ताकि मैं $ कॉन्स्टेबल चर सुपरग्लिड बना सकूं।

आप इसका उपयोग $const->define("my_constant",array("my","values"));सिर्फ या सिर्फ कर सकते हैं$const->my_constant = array("my","values");

मूल्य प्राप्त करने के लिए बस कॉल करें $const->my_constant;


वाह, मुझे इस तरह की उम्मीद नहीं थी ... मैं भी नहीं जानता था __getऔर __set... मुझे कहना होगा कि यह तरीका बहुत अच्छा है।
रेडक्लोवर

इन्हें मैजिक मेथड्स कहा जाता है, इनके बारे में php दस्तावेज़ीकरण देखें।
रिकुडौ_सेनिन


3

यहां तक ​​कि एसोसिएटिव एरे के साथ काम कर सकते हैं .. उदाहरण के लिए एक कक्षा में।

class Test {

    const 
        CAN = [
            "can bark", "can meow", "can fly"
        ],
        ANIMALS = [
            self::CAN[0] => "dog",
            self::CAN[1] => "cat",
            self::CAN[2] => "bird"
        ];

    static function noParameter() {
        return self::ANIMALS[self::CAN[0]];
    }

    static function withParameter($which, $animal) {
        return "who {$which}? a {$animal}.";
    }

}

echo Test::noParameter() . "s " . Test::CAN[0] . ".<br>";
echo Test::withParameter(
    array_keys(Test::ANIMALS)[2], Test::ANIMALS["can fly"]
);

// dogs can bark.
// who can fly? a bird.

2

विस्फोट और फंक्शन फ़ंक्शन का उपयोग करके हम किसी समाधान को सुधार सकते हैं:

$array = array('lastname', 'email', 'phone');
define('DEFAULT_ROLES', implode (',' , $array));
echo explode(',' ,DEFAULT_ROLES ) [1]; 

यह गूंज उठेगा email

यदि आप इसे और अधिक अनुकूलित करना चाहते हैं तो आप इस तरह के लिए दोहराए जाने वाले कार्यों को करने के लिए 2 कार्यों को परिभाषित कर सकते हैं:

//function to define constant
function custom_define ($const , $array) {
    define($const, implode (',' , $array));
}

//function to access constant  
function return_by_index ($index,$const = DEFAULT_ROLES) {
            $explodedResult = explode(',' ,$const ) [$index];
    if (isset ($explodedResult))
        return explode(',' ,$const ) [$index] ;
}

उम्मीद है की वो मदद करदे । खुश कोडिंग।


आप दो बार विस्फोट करने से रोक सकते हैं: $ explodeResult = विस्फोट (',', $ const); अगर (isset ($ explodeResult) [$ index]) {$ $ explodeResult [$ index]};}
Saeed

@ सईद यूप जो एक अच्छी बात है। मैं अपने उत्तर को तदनुसार अपडेट करूंगा
एमडी। साहिब बिन महबूब

2

किसी प्रकार के सेर / डेसर या एन्कोड / डीकोड ट्रिक करने से बदसूरत लगता है और आपको यह याद रखने की आवश्यकता होती है कि जब आप निरंतर उपयोग करने की कोशिश कर रहे थे, तब आपने वास्तव में क्या किया था। मुझे लगता है कि गौण के साथ वर्ग निजी स्थिर चर एक सभ्य समाधान है, लेकिन मैं आपको एक बेहतर करूँगा। बस एक सार्वजनिक स्थैतिक पानेवाला विधि है जो निरंतर सरणी की परिभाषा देता है। इसके लिए न्यूनतम अतिरिक्त कोड की आवश्यकता होती है और सरणी परिभाषा को गलती से संशोधित नहीं किया जा सकता है।

class UserRoles {
    public static function getDefaultRoles() {
        return array('guy', 'development team');
    }
}

initMyRoles( UserRoles::getDefaultRoles() );

यदि आप वास्तव में इसे एक परिभाषित स्थिरांक की तरह बनाना चाहते हैं, तो आप इसे सभी कैप नाम दे सकते हैं, लेकिन फिर यह नाम के बाद '()' कोष्ठक जोड़ने के लिए याद रखना भ्रामक होगा।

class UserRoles {
    public static function DEFAULT_ROLES() { return array('guy', 'development team'); }
}

//but, then the extra () looks weird...
initMyRoles( UserRoles::DEFAULT_ROLES() );

मुझे लगता है कि आप विधि को परिभाषित करने के लिए वैश्विक बना सकते हैं () कार्यक्षमता आप के लिए पूछ रहे थे, लेकिन आपको वास्तव में किसी भी तरह निरंतर नाम का दायरा करना चाहिए और ग्लोबल्स से बचना चाहिए।


2

आप इस तरह परिभाषित कर सकते हैं

define('GENERIC_DOMAIN',json_encode(array(
    'gmail.com','gmail.co.in','yahoo.com'
)));

$domains = json_decode(GENERIC_DOMAIN);
var_dump($domains);

2

हां, आप एक सरणी को स्थिर के रूप में परिभाषित कर सकते हैं। से पीएचपी 5.6 के बाद , यह एक अदिश अभिव्यक्ति के रूप में एक निरंतर परिभाषित करना संभव है, और यह भी है एक सरणी स्थिरांक को परिभाषित करना संभव । एक संसाधन के रूप में स्थिरांक को परिभाषित करना संभव है, लेकिन इसे टाला जाना चाहिए, क्योंकि यह अप्रत्याशित परिणाम पैदा कर सकता है।

<?php
    // Works as of PHP 5.3.0
    const CONSTANT = 'Hello World';
    echo CONSTANT;

    // Works as of PHP 5.6.0
    const ANOTHER_CONST = CONSTANT.'; Goodbye World';
    echo ANOTHER_CONST;

    const ANIMALS = array('dog', 'cat', 'bird');
    echo ANIMALS[1]; // outputs "cat"

    // Works as of PHP 7
    define('ANIMALS', array(
        'dog',
        'cat',
        'bird'
    ));
    echo ANIMALS[1]; // outputs "cat"
?>

इस लिंक के संदर्भ के साथ

एक खुश कोडिंग है।


1

यदि आप 2009 से इसे देख रहे हैं, और आपको AbstractSingletonFactoryGenerators पसंद नहीं है, तो यहां कुछ अन्य विकल्प हैं।

याद रखें, असाइन किए जाने पर सरणियों की "प्रतिलिपि" की जाती है, या इस मामले में, लौटा दी जाती है, इसलिए आप व्यावहारिक रूप से हर बार एक ही सरणी प्राप्त कर रहे हैं। (PHP में सरणियों का कॉपी-ऑन-राइट व्यवहार देखें।)

function FRUITS_ARRAY(){
  return array('chicken', 'mushroom', 'dirt');
}

function FRUITS_ARRAY(){
  static $array = array('chicken', 'mushroom', 'dirt');
  return $array;
}

function WHAT_ANIMAL( $key ){
  static $array = (
    'Merrick' => 'Elephant',
    'Sprague' => 'Skeleton',
    'Shaun'   => 'Sheep',
  );
  return $array[ $key ];
}

function ANIMAL( $key = null ){
  static $array = (
    'Merrick' => 'Elephant',
    'Sprague' => 'Skeleton',
    'Shaun'   => 'Sheep',
  );
  return $key !== null ? $array[ $key ] : $array;
}

अब हम कई वर्षों से एरियर्स को स्थिरांक के रूप में परिभाषित करने में सक्षम हैं, मुझे नहीं लगता कि वर्कअराउंड का अब उपयोग करने के लिए बहुत अधिक मूल्य है।
miken32

1
@ miken32 सच होते हुए, प्रदान किया गया समाधान दिलचस्प है, किसी और द्वारा आपूर्ति नहीं की गई थी, और वैचारिक रूप से अन्य भाषाओं में आवश्यकतानुसार लागू की जा सकती है (इसे अपने टूल बॉक्स में जोड़ें)
puiu

1

यदि आप PHP 7 और 7+ का उपयोग कर रहे हैं, तो आप इस तरह से भी प्राप्त कर सकते हैं

define('TEAM', ['guy', 'development team']);
echo TEAM[0]; 
// output from system will be "guy"

0

स्थिरांक में केवल स्केलर मान हो सकते हैं, मेरा सुझाव है कि आप सरणी के क्रमांकन (या JSON एन्कोडेड प्रतिनिधित्व) को संग्रहीत करें।


1
यह स्वीकृत उत्तर में कुछ भी नहीं जोड़ता है, इसलिए शायद इसे हटा दिया जाना चाहिए?
इयान डन

4
@IanDunn: मैं यह तर्क दूंगा कि स्वीकृत उत्तर स्पष्ट नहीं करता है, या कि यह मेरे उत्तर में कुछ भी नहीं जोड़ता है लेकिन ... हालांकि हटाने के लिए स्वतंत्र महसूस करें।
एलिक्स एक्सल

1
मैं वास्तव में वांछित सरणी के किसी भी स्ट्रिंग प्रतिनिधित्व के बिंदु को नहीं देखता हूं।
टॉम ज़ातो -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.