これは失敗しました:
define('DEFAULT_ROLES', array('guy', 'development team'));
どうやら、定数は配列を保持できません。これを回避する最良の方法は何ですか?
define('DEFAULT_ROLES', 'guy|development team');
//...
$default = explode('|', DEFAULT_ROLES);
これは不必要な努力のようです。
これは失敗しました:
define('DEFAULT_ROLES', array('guy', 'development team'));
どうやら、定数は配列を保持できません。これを回避する最良の方法は何ですか?
define('DEFAULT_ROLES', 'guy|development team');
//...
$default = explode('|', DEFAULT_ROLES);
これは不必要な努力のようです。
回答:
注:これは受け入れられる回答ですが、PHP 5.6以降ではconst配列を使用できることに注意してください。以下のAndrea Fauldsの回答を参照してください。
配列をシリアル化して定数に入れることもできます:
# define constant, serialize array
define ("FRUITS", serialize (array ("apple", "cherry", "banana")));
# use it
$my_fruits = unserialize (FRUITS);
$fruit = FRUITS[0];
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'));
define()
、ここではPHP 5.6では使用できませんが、これはPHP 7.0では修正されています。:)
それらをクラスの静的変数として保存できます。
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'];
const AtomicValue =42; public static $fooArray = ('how','di')
このように使っています。他の人の役に立つことを願っています。
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
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にインストールして、$ const変数をスーパーグローバルにできるようにしました。
そのままでも$const->define("my_constant",array("my","values"));
、そのままでも使えます$const->my_constant = array("my","values");
値を取得するには、単に呼び出すだけです $const->my_constant;
__get
、__set
...この方法は素晴らしいと言わざるを得ません。
連想配列でも動作します。たとえば、クラスで。
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.
explode関数とimplode関数を使用して、ソリューションを即興で作成できます。
$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やencode / decodeのトリックを行うのは見苦しく、定数を使用しようとしたときに正確に何をしたかを覚えておく必要があります。アクセサー付きのクラスのプライベート静的変数はまともな解決策だと思いますが、私はあなたのためにもっとよくします。定数配列の定義を返すパブリックな静的ゲッターメソッドがあるだけです。これには最低限の追加コードが必要であり、配列定義を誤って変更することはできません。
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() );
メソッドをグローバルにして、求めていたdefine()機能に近づけることができると思いますが、実際には定数名のスコープを設定し、グローバルを回避する必要があります。
はい、配列を定数として定義できます。以降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年からこれを探していて、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;
}
定数にはスカラー値のみを含めることができます。配列のシリアル化(またはJSONエンコードされた表現)を保存することをお勧めします。