سؤال

هذا فشل:

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

على ما يبدو، لا يمكن الثوابت عقد المصفوفات. ما هي أفضل طريقة للتغلب على هذا؟

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

//...

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

هذا يبدو وكأنه جهد غير ضروري.

هل كانت مفيدة؟

المحلول

ملاحظة: في حين أن هذه هي الإجابة المقبولة، تجدر الإشارة إلى أنه في PHP 5.6+ يمكنك الحصول على صفائف const انظر Andrea Foulds "إجابة أدناه.

يمكنك أيضا تسلسل صفيفك ثم وضعه في ثابت:

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

# use it
$my_fruits = unserialize (FRUITS);

نصائح أخرى

منذ 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'));

يمكنك تخزينها كمغيرات ثابتة لفئة:

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

إذا كنت لا تحب فكرة أن الصفيف يمكن تغييرها من قبل الآخرين، فقد يساعد Getter:

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

إذا كنت تستخدم PHP 5.6 أو أعلى، استخدم Andrea Foulds الإجابة

أنا أستخدمه مثل هذا. آمل أن يساعد الآخرين.

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

هذا ما أستخدمه. يشبه المثال الذي يوفره Soulmerge، ولكن بهذه الطريقة يمكنك الحصول على الصفيف الكامل أو مجرد قيمة واحدة في الصفيف.

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'

يمكنك تخزينها كسلسلة JSON في ثابت. وجهة نظر التطبيق، يمكن أن يكون JSON مفيدا في حالات أخرى.

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

بدءا من PHP 5.6، يمكنك تحديد المصفوفات المستمرة باستخدام const الكلمات المفتاحية مثل أدناه

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

وعناصر مختلفة يمكن الوصول إليها على النحو التالي:

echo DEFAULT_ROLES[1]; 
....

بدءا من PHP 7، يمكن تعريف المصفوفات المستمرة باستخدام define على النحو التالي:

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

وعناصر مختلفة يمكن الوصول إليها بنفس الطريقة كما كان من قبل.

أعلم أنه سؤال قديم بعض الشيء، ولكن هنا هو الحل:

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

حددت ذلك لأنني كنت بحاجة إلى تخزين الكائنات والمصفوفات في الثوابت، لذلك قمت بتثبيت أيضا Runkit إلى PHP، لذلك يمكنني جعل Superglobal $ CONTER VARTGLOBAL.

يمكنك استخدامه $const->define("my_constant",array("my","values")); أو فقط $const->my_constant = array("my","values");

للحصول على القيمة فقط اتصل ببساطة $const->my_constant;

باستخدام وظيفة تنفجر وتجريدنا نستطيع تحسين الحل:

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

امل ان يساعد . الترميز السعيد.

قم بعمل نوع من خدعة Ser / Deser أو تشفير / فك تشفير قبيحة ويتطلب منك أن تتذكر ما قمت به بالضبط عندما تحاول استخدام الثابت. أعتقد أن المتغير الثابت فئة خاصة مع Accessor هو حل لائق، لكنني سأفعل لك أفضل. ما عليك سوى الحصول على طريقة Getter Static العامة التي ترجع تعريف الصفيف الثابت. يتطلب هذا الحد الأدنى من التعليمات البرمجية الإضافية ويمكن تعديل تعريف الصفيف بطريق الخطأ.

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

initMyRoles( UserRoles::getDefaultRoles() );

إذا كنت ترغب في جعلها حقا تبدو ثابتة محددة، فيمكنك إعطائها اسم كافة CAPS، ولكن بعد ذلك، ستكون مربكة لتذكر أن تضيف الأقواس "()" بعد الاسم.

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

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

أفترض أنك يمكن أن تجعل الطريقة العالمية أقرب إلى الوظيفة المعرفة () التي كنت تطلبها، ولكن عليك حقا النطاق الاسم الثابت على أي حال وتجنب العالم.

يمكنك تحديد مثل هذا

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

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

PHP 7+.

اعتبارا من PHP 7، يمكنك فقط استخدام حدد() وظيفة لتحديد صفيف ثابت:

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

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

يمكن أن تعمل حتى مع صفائف النظامية .. على سبيل المثال في الفصل.

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.

نعم، يمكنك تحديد مجموعة ثابتة. من PHP 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"
?>

مع مرجع هذا الرابط

لديك ترميز سعيد.

إذا كنت تبحث عن هذا من عام 2009، فأنت لا تحب التزلجين اللضيحة، إليك بعض الخيارات الأخرى الأخرى.

تذكر أن المصفوفات "نسخ" عند تعيينها، أو في هذه الحالة، إرجاعها، لذلك تقوم بعملية الحصول على نفس الصفيف في كل مرة. (انظر سلوك النسخ على الكتابة من الصفائف في 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;
}

يمكن أن تحتوي الثوابت فقط على قيم العددية، أقترح عليك تخزين التسلسل (أو تمثيل JSON المشفر) من الصفيف.

أوافق مع Eyze، تميل الثوابت إلى أن تكون قيم قيمة واحدة اللازمة للحياة بأكملها من طلبك. قد تفكر في استخدام ملف التكوين بدلا من الثوابت لهذا النوع من الأشياء.

إذا كنت بحاجة حقا إلى صفائف ثابتة، فيمكنك استخدام اتفاقيات التسمية إلى صفائف محاكية إلى حد ما: على سبيل المثال db_name، db_user، db_host، إلخ.

هذا صحيح، لا يمكنك استخدام المصفوفات للحصول على ثابت، سكاعد فقط واغتالية. تبدو فكرة استخدام مجموعة الثوابت للخلف قليلا بالنسبة لي.

ما أقترح القيام به بدلا من ذلك هو تحديد فئة ثابتة خاصة بك واستخدامها للحصول على ثابت.

define('MY_ARRAY_CONSTANT_DELIMETER', '|');       
define('MY_ARRAY',implode(MY_ARRAY_CONSTANT_DELIMETER,array(1,2,3,4)));

//retrieving the array
$my_array = explode(MY_ARRAY_CONSTANT_DELIMETER, MY_ARRAY);

قد تقوم أيضا بتنفجر الصفيف في سلسلة من الثوابت. (حل المدرسة القديمة الجميلة) بعد كل شيء، الصفيف هو مستمر, ، لذلك السبب الوحيد الذي تحتاجه إليه، هو عالمي، سريع، بحث من بعض المفاتيح.

وبالتالي هذا:

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

سوف تتحول إلى:

define('DEFAULT_ROLES_0', 'guy');
define('DEFAULT_ROLES_1', 'development team');

نعم، هناك تلوث مساحة الاسم (والكثير من البادئة لمنعها) لأخذ في الاعتبار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top