2016-12-29 8 views
0

私は見つけることができない、または多分私は間違って考えていますが、私は変更することができない変数を作成する必要がある、などの読み取り専用、何かのように:定数とは別にPHPで最終変数を作成するには?

final $finalVar = 'extremely secret number'; // don't change 

$finalVar = 'hacked...'; // THROW I GIANT BIG ERROR HERE ! 
+8

定数を使用します。 –

+1

https://secure.php.net/manual/en/language.constants.php – aynber

+0

ええ、私は一定していると思っていましたが、ドルでそれを使用することはできませんか? – user544262772

答えて

1

(述べたようにコメントで)、私はこれを行うに考えることができる唯一の方法は、リフレクションクラスを使用してa hacky way around thatがあることprivate変数

class ParentC { 
    private $var = 'bob'; 
} 

class ChildC extends ParentC { 
    public function setVar() { 
     // Fatal error: Uncaught Error: Cannot access private property ParentC::$var 
     echo parent::$var; 
    } 
} 

注意して親子関係を使用することです。しかし、ほとんどの部分は、あなたは子クラス

+0

子クラスは変数を変更できませんが、それも読み取ることはできません。 – Andrea

+0

@Andreaええ、ゲッターメソッドを作成するか、それを回避するためにオーバーロードすることができます – Machavity

1

オブジェクトにそれを提案してもRFCで、少なくとも2012年以来の読み取り専用変数のtalkがあったものの、サポートからprivate親変数に触れることができません言語には存在しません。

class Readonly { 
    public function __construct(...$vars) { 
     $this->vars; 
    } 

    public function __set($var, $value) { 
     if (array_key_exists($var, $this->vars)) { 
      throw new \LogicException("Variable $var is read-only"); 
     } else { 
      $this->vars[$var] = $value; 
     } 
    } 

    public function __get($var) { 
     return array_key_exists($var, $this->vars) ? $this->vars[$var] : null; 
    } 

    protected $vars = []; 
} 

あなたが作成することができます:(特定の設定値を使用して重要であるかもしれないとして、または読み取り専用変数の集まり)読み取り専用の変数を達成するために

一つの方法は、仲介コンテナであります読み取り専用変数のコンテナ:

$config = new Readonly('apikey'); 

$config->apikey = 'A01AB020'; // this works, first time set 
echo $config->apikey; 

$config->apikey = '00000000'; // boom! it's "final" 
+0

実際の解決策が定数を使用する場合は、なぜそのような長い答えが不思議ですか?そこには本当の問題はありません。OPはドル記号なしでコードを書いているだけではありません。これは総過不足IMOのように思えますが、問題はコンピュータではなく、議長にあります。 OPは、特定の目的のために提供されたコンストラクトを使用したくないという明白な理由がない場合、彼の意志にそれを曲げないように、言語を使用することを学ぶべきです。私はこれに投票しませんでしたが、将来の訪問者を誤解させるので、これは間違っていると思います。 – Mjh

+0

@Mjh定数は、スカラまたは配列(5.6+では 'const'、7.0+では' define'を使用)のみです。定数は、グローバル名前空間を汚染します。 'const'はコンパイル時であり、関数、ループ、try/catchではなく、トップレベルのスコープで宣言しなければなりません。 'const'は変数から初期化できません。これは、OPが設定ファイルから読み込んでいる場合に重要になります。 ( 'define'は可能ですが、<7では配列の問題と名前空間と地球汚染の問題があります)。要するに、実際の解決策は、定数 "となる。 – bishop

+1

@bishopはクラスレベルの定数を定義できます。実際の解決策は定数を使うことです。グローバルなスコープやクラスで管理するかどうか。定数を避ける必要はありません。何かが不変の場合、それは変数ではありません。スカラー以外のものを保存する必要がある場合は、IoCとテクニックを使って実証します。仕事には常に適切なツールがあります。 – Mjh

関連する問題