2016-09-22 6 views
7

私はいくつかの設定を保存するキー値のデータベーステーブルを持っています。PHPに定数オブジェクトがないのはなぜですか?

これらの設定は、編集可能ではないので、PHP定数オブジェクトに入れたいと思います。

define('MySettings', array(
    'title' => 'My title' 
    // etc 
)); 

// And call it with 
echo MySettings['title']; 

をそして、それは素晴らしい作品:

PHP7では、我々は今、これを行うことができます。

しかし、なぜ私が行うことはできません。

define('MySettings', (object) array('title' => 'My title')); 

は、だから私は、この代わりのようにそれを呼び出すことができます。

echo MySettings->title; 
// or 
echo MySettings::title; 

これは私がそれのようにそれを入力するために迅速かつきれいだと思うだけの理由でありますオブジェクトのプロパティ/定数($obj->key$obj::key)よりも配列($array['key']

これは不可能な理由はありますか?

+7

技術的にオブジェクトを定数にすることはできないためです。それらはコードを含むことができます。つまり、オブジェクトの内部を変更することができます。つまり、定数ではありません。それが定数を持っている理由です。定数に入れるものが決して変更されないという約束/保証です。 –

+1

現在、不変オブジェクトをサポートするためのPHPの将来のバージョンについて議論中の提案があります。これにより、プログラムは一連の値を持つオブジェクトを作成することができ、オブジェクトが作成されるとその値は固定され、変更できなくなります。 https://wiki.php.net/rfc/immutabilityで詳しく読むことができます。ただし、PHP(7.0)にはまだ含まれていないことに注意してください。また、今後の7.1リリースには含まれません。ディスカッションの流れに応じて、7.2に入るかもしれませんが、この段階で何かを約束するのは時期尚早です。 – Simba

答えて

12

PHPの場合、すべてのオブジェクトは変更可能です。実行時には定数は決して変更されるべきではないがオブジェクトはできるので、オブジェクト定数は現在サポートされていない。

constキーワードのみスカラーデータ(ブール、整数、 浮動小数点、文字列)を使用して前PHP 5.6に定数に含めることができる:phpdoc about constants

は、あると述べています。 PHP 5.6以降では、定数をスカラー式の 式として定義することができ、配列定数を定義することもできます。定数をリソースとして定義することが可能なのは ですが、予期しない結果が生じる可能性があるので、 は避けてください。

配列には矛盾がありますが、なぜ配列定数が許可されるのかについては合理的ではありません。 (私もそれが悪いの呼び出しだったと主張するだろう。)それはarray-constantsが不変であることに留意しなければならない、PHP7からこのコードにより展示として、したがって彼らに致命的なエラーで結果を変更しようとしている:

<?php 
$aNormalMutableArray = ['key' => 'original']; 
$aNormalMutableArray['key'] = 'changed'; 
echo $aNormalMutableArray['key']; 

define(
    'IMMUTABLE_ARRAY', 
    [ 
     'key' => 'original', 
    ] 
); 
IMMUTABLE_ARRAY['key'] = 'if I am an array, I change; if I am a constant I throw an error'; 
echo IMMUTABLE_ARRAY['key']; 

投げ:

PHP Fatal error: Cannot use temporary expression in write context 
in ~/wtf.php on line 12 

同様のエラーでオブジェクト定数を定義できないのはなぜですか? 1つは、その力を求める必要があります。

配列やオブジェクトから定数を取り除くことをおすすめします。むしろ不変オブジェクトを作成するか、代わりにimmutable collectionsを使用してください。

特定の構文を探しているので、すでにclass constantsという概念があります。

<?php 
class MyClass 
{ 
    const CONSTANT = 'constant value'; 

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

echo MyClass::CONSTANT . "\n"; 

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

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

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

インターフェイスでも定義できます。

+0

あなたの答えをありがとう。クラス定数では、PHPファイル内のすべての定数を「ハードコード」する必要がありますが、動的にしたいので、データベース設定テーブルで新しい行を作成すると、設定として利用できます。しかし、これはクラス定数では不可能です。それが意味をなさないならば。これが私が定数配列を使う理由です。 – JemoeE

+0

@ user245734感謝していますが、コメントは感謝のためのものではありません。 upvoteまたは答えを受け入れるだけで十分です:) – k0pernikus

+0

@ user245734そして、すべての定数をハードコードするのを避けるためのあなたのフォローアップの質問に従って、それはフォローアップの質問であり、元の質問の範囲内ではありません。新しい質問を自由に開くことができます。 – k0pernikus

関連する問題