পিএইচপি কনস্ট্যান্টগুলিতে অ্যারে রয়েছে?


407

এটি ব্যর্থ হয়েছে:

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

স্পষ্টতই, ধ্রুবকরা অ্যারে ধরে রাখতে পারে না। এটির কাছাকাছি যাওয়ার সর্বোত্তম উপায় কী?

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

//...

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

এটি অপ্রয়োজনীয় প্রচেষ্টা বলে মনে হচ্ছে।


17
পিএইচপি 5.6 ধ্রুব অ্যারে সমর্থন করে, নীচে আমার উত্তর দেখুন।
আন্দ্রে

1
ধ্রুবক হিসাবে আপনার কখন অ্যারে ব্যবহার করা দরকার, আপনি কি একটি গণনা করার চেষ্টা করছেন? যদি তা হয় তবে স্প্লিনাম ব্যবহার করুন: php.net/manual/en/class.splenum.php
ziGi

2
@ziGi আজ এই ইস্যুটি নিয়ে এসেছে, বিভিন্ন ধরণের চিত্র সংরক্ষণের জন্য নির্দিষ্ট মাত্রার প্রয়োজন হয়, এই মাত্রাগুলি প্রস্থের জন্য একটি এবং উচ্চতার জন্য একটির পরিবর্তে ধ্রুব অ্যারে হিসাবে সংরক্ষণ করা কার্যকর হয়ে ওঠে।
ম্যাট কে

উত্তর:


498

দ্রষ্টব্য: যদিও এটি স্বীকৃত উত্তর, তবে এটি লক্ষণীয় যে পিএইচপি 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

পিএইচপি 5.6 সাল থেকে আপনি এর সাথে একটি অ্যারের ধ্রুবক ঘোষণা করতে পারেন const:

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

সংক্ষিপ্ত বাক্য গঠনটিও যেমনটি আপনি প্রত্যাশা করতেন তেমন কাজ করে:

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

আপনার যদি পিএইচপি 7 থাকে তবে আপনি অবশেষে ব্যবহার করতে পারেন define(), যেমন আপনি প্রথম চেষ্টা করেছিলেন:

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

41
অন্য সমস্ত উত্তর পুরানো বা কেবল ভুল তথ্য ব্যবহারকারীদের দ্বারা লিখিত হওয়ায় এটিকে আপোড করা দরকার।
Andreas Bergström

এটাই কি একমাত্র সিনট্যাক্স? আপনি কি পুরানো সংজ্ঞায়িত ফাংশনটি ব্যবহার করতে পারবেন? সংজ্ঞায়িত করুন ('এআরআয়_কন্ট্যান্ট', অ্যারে ('আইটেম 1', 'আইটেম 2', 'আইটেম 3'));
জ্যাক 0

5
@ জ্যাকনিচলসন দুর্ভাগ্যক্রমে আপনি define()এখানে পিএইচপি 5.6 ব্যবহার করতে পারবেন না , তবে এটি পিএইচপি 7.0 এর জন্য স্থির করা হয়েছে । :)
Andrea

@ AndreasBergström না, এই প্রশ্নটি খুব নতুন। এই প্রশ্নটি 2009 সালে করা হয়েছিল! এই সিনট্যাক্সটি এখন-বেশিরভাগ ব্যবহারকারীর জন্য প্রায় অকেজো। প্রায় সকলেরই সার্ভারগুলিতে পিএইচপি 5.6 রয়েছে। অন্যান্য উত্তরগুলি পুরোপুরি ঠিক আছে যেহেতু তারা বিকল্পও দেয়। আপনি যদি ক্লাস ব্যবহার করতে না চান তবে গৃহীত উত্তরটি এখন পর্যন্ত একমাত্র কার্যকর উপায়।
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল এতটা নিশ্চিত হন না যে তাদের সকলেরই 5.6 রয়েছে। উইন্ডোজ সার্ভারের যে কেউ এখনই প্রায় এক মাস আগে মাইক্রোসফ্ট থেকে 5.6 বর্গ স্ক্রোল ড্রাইভার পেয়েছিলেন।
এমএইচ

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();

সম্পাদনা

পিএইচপি 5.4 থেকে, মধ্যবর্তী ভেরিয়েবলের প্রয়োজন ছাড়াই অ্যারে মানগুলি অ্যাক্সেস করা এমনকি সম্ভব, যেমন নিম্নলিখিত কাজগুলি করা সম্ভব:

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

1
+1 টি। আমি বছরের পর বছর ধরে const AtomicValue =42; public static $fooArray = ('how','di')
এটির

9
যদিও এটি আমার কাছে হাস্যকর মনে হচ্ছে যে আমরা পিএইচপি তে অপরিবর্তনীয় অ্যারেগুলি তৈরি করতে পারি না, এটি একটি শালীন কাজ করে।
আকোই মেক্সেক্স

আপনি যদি ধ্রুবকটি অনেক ব্যবহার করে থাকেন তবে আমি অবশ্যই একটি ফাংশন কল এড়াতে পারি, সেগুলি বেশ ব্যয়বহুল। স্থির হয় উপায়।
ক্রিস সিফার্ট

1
এই সমাধানটি আমার প্রত্যাশার চেয়েও দুর্দান্ত ছিল: আমার কেবল অ্যারের মানগুলির একটি অংশের প্রয়োজন ছিল, সুতরাং কেবল অ্যারে পাওয়ার পরিবর্তে, আমি ফাংশনে কিছু পরামিতি ব্যবহার করেছি। আমার ক্ষেত্রে কনস্ট্যান্টস :: getRelatedIDs ($ myID) আমার প্রয়োজনীয় মানগুলি সহ একটি অভ্যন্তরীণ অ্যারে পায় (আমি এই ফাংশনের ভিতরে কিছু আইডি বৈধকরণও করি)। @ সিউফার্ট পুরো অ্যারে পেয়েছে এবং প্রতিটি ক্ষেত্রে ফিল্টার করা আমার জন্য আরও ব্যয়বহুল হবে ...
আর্মফুট

1
স্থির সদস্যদের সাথে বেসরকারী স্ট্যাটিক সদস্যের সাথে একটি ফাংশন (getArray) রাখা তাদের পরিবর্তনের জন্য উপযুক্ত প্রতিনিধিত্ব 👍🏻
কমলদীপ সিংহ ভাটিয়া

41

আপনি যদি পিএইচপি 5.6 বা তার বেশি ব্যবহার করে থাকেন তবে অ্যান্ড্রিয়া ফাল্ডস উত্তরটি ব্যবহার করুন

আমি এটি এভাবে ব্যবহার করছি। আমি আশা করি, এটি অন্যকে সহায়তা করবে।

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 স্ট্রিং হিসাবে সঞ্চয় করতে পারেন। এবং আবেদনের দৃষ্টিকোণ, জেএসএন অন্যান্য ক্ষেত্রে কার্যকর হতে পারে।

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

আমি যা ভাবছিলাম ঠিক এটাই ছিল। এটি কি বৈধভাবে উত্তম উত্তর নয়?
কন আন্তোনাকোস

এটি AngularJS এর ​​সাথে সত্যই ভাল কাজ করে কারণ এটি JSON গ্রাস করে। আমি অনুভব করি যে এটি সিরিয়ালাইজ উত্তরটি অনেক ভাল, তবে সিরিয়ালাইজেশন আরও ভাল হওয়ার কারণ আছে কি? এটি সম্ভবত দ্রুত?
Drellgor

হ্যাঁ সিরিয়ালাইজ প্রযুক্তিগতভাবে দ্রুত। তবে, ছোট সেটগুলির জন্য যা বেশিরভাগের জন্য প্রয়োজন, আমি এই পদ্ধতিটিকে নিরাপদ হিসাবে পছন্দ করি। আপনি যখন আনসিরিয়ালাইজ করেছেন, কোডটি কার্যকর করা হতে পারে। এমনকি যদি এই ক্ষেত্রে এটি খুব কম ঝুঁকিপূর্ণ হয় তবে আমি মনে করি আমাদের কেবলমাত্র চরম মামলার জন্য ব্যবহার সংরক্ষণ করা বা অপ্রচলিত করা উচিত।
মারিও আওয়াদ

9

পিএইচপি 5.6 দিয়ে শুরু করে আপনি constনীচের মতো কীওয়ার্ড ব্যবহার করে ধ্রুবক অ্যারেগুলি সংজ্ঞায়িত করতে পারেন

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

এবং বিভিন্ন উপাদান নীচের হিসাবে অ্যাক্সেস করা যেতে পারে:

echo DEFAULT_ROLES[1]; 
....

পিএইচপি 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;

আমি এটি সংজ্ঞায়িত করেছি কারণ আমার কনস্ট্যান্টগুলিতে অবজেক্টস এবং অ্যারেগুলি সংরক্ষণ করার দরকার ছিল তাই আমি পিএইচপি তেও রনকিট ইনস্টল করেছিলাম যাতে আমি vari কনস্ট ভেরিয়েবলকে সুপারগ্লোবাল করতে পারি।

আপনি এটি ন্যায়বিচার হিসাবে $const->define("my_constant",array("my","values"));বা ব্যবহার করতে পারেন$const->my_constant = array("my","values");

মান পেতে কেবল কল করুন $const->my_constant;


বাহ, আমি যেমন ভাবে প্রত্যাশিত নি ... আমি এমনকি সম্পর্কে জানেন না __getএবং__set ... আমাকে অবশ্যই বলতে হবে যে এই পদ্ধতিটি দুর্দান্ত।
রেডক্লুভার

এগুলিকে যাদু পদ্ধতিগুলি বলা হয়, তাদের সম্পর্কে পিএইচপি ডকুমেন্টেশন পরীক্ষা করুন।
রিকুদু_সেনিন

3

পিএইচপি 7+

পিএইচপি 7 হিসাবে, আপনি কেবল ধ্রুবক অ্যারে সংজ্ঞায়িত করতে সংজ্ঞা () ফাংশনটি ব্যবহার করতে পারেন :

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // outputs "cat"

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] ;
}

আশা করি এইটি কাজ করবে . শুভ কোডিং।


আপনি দু'বার করে বিস্ফোরণ রোধ করতে পারবেন: l explodeResult = বিস্ফোরিত (',', $ কনস্ট); যদি (isset ($ explodeResult) [$ সূচক]) {ফিরতি $ explodeResult [$ সূচক];}
সাঈদ

@ সাইদ হ্যাঁ এটি একটি দুর্দান্ত বিষয়। আমি সেই অনুযায়ী আমার উত্তর আপডেট করব
এমডি। সাহেব বিন মাহবুব

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 থেকে এটি সন্ধান করছেন, এবং আপনি অ্যাবস্ট্র্যাক্টসিংটনটন ফ্যাক্টরি জেনারেটর পছন্দ করেন না, তবে এখানে কয়েকটি অন্যান্য বিকল্প রয়েছে।

মনে রাখবেন, নিয়োগের সময় অ্যারেগুলি "অনুলিপি করা হয়" বা এই ক্ষেত্রে ফিরে আসে, তাই আপনি প্রতিবার ব্যবহারিকভাবে একই অ্যারে পাচ্ছেন। (পিএইচপি-তে অ্যারেগুলির অন-লিখনের আচরণ দেখুন))

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;
}

আমরা এখন বহু বছর ধরে অ্যারেগুলিকে ধ্রুবক হিসাবে সংজ্ঞায়িত করতে সক্ষম হয়েছি, আমি মনে করি না যে কর্মক্ষেত্রের অবসন্নতার অনেক মূল্য আছে value
miken32

1
@ মিকেন 32 সত্য হলেও, প্রদত্ত সমাধানটি আকর্ষণীয়, অন্য কারও দ্বারা সরবরাহ করা হয়নি, এবং প্রয়োজন মতো অন্যান্য ভাষায় ধারণাগতভাবে প্রয়োগ করা যেতে পারে (এটি আপনার সরঞ্জাম বাক্সে যুক্ত করুন)
পুবিউ

1

আপনি যদি পিএইচপি 7 এবং 7+ ব্যবহার করেন তবে আপনি এটির মতো আনতেও ব্যবহার করতে পারেন

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

0

ধ্রুবকগুলিতে কেবল স্কেলারের মান থাকতে পারে, আমি আপনাকে পরামর্শ দিই যে অ্যারের সিরিয়ালাইজেশন (বা জেএসএন এনকোডেড উপস্থাপনা) সংরক্ষণ করুন।


1
এটি গৃহীত উত্তরের সাথে কিছু যোগ করে না, তাই এটি মুছে ফেলা উচিত?
ইয়ান ডান

4
@ ইয়ানডুন: আমি যুক্তি দেব যে গ্রহণযোগ্য উত্তরগুলি ব্যাখ্যা করে না কেন, বা এটি আমার উত্তরে কিছু যুক্ত করে না ... তবে মুছে ফেলার জন্য নির্দ্বিধায় অনুভব করুন।
অ্যালিক্স অ্যাক্সেল

1
আমি পছন্দসই অ্যারের কোনও স্ট্রিং উপস্থাপনার পয়েন্টটি সত্যই দেখতে পাচ্ছি না।
টোমা জ্যাটো - মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.