質問

きを変えようとしているので、例外をスローします。

役に立ちましたか?

解決

と思い、解決のためのクラス物件とする。

  • な定義の名のもと、自分の興味のあるす
  • 利用のマジック __get 方法でアクセスプロパティを使用し、"偽"の名称
  • を定義する __set 方法で例外をスローしようとした場合に設定する物件です。
  • 過負荷, りますので、情報をマジック。

のための変数とは思わないできて、読み取り専用の変数であるPHPの例外をスローしたときのように書いています。


例えば、このクラス:

class MyClass {
    protected $_data = array(
        'myVar' => 'test'
    );

    public function __get($name) {
        if (isset($this->_data[$name])) {
            return $this->_data[$name];
        } else {
            // non-existant property
            // => up to you to decide what to do
        }
    }

    public function __set($name, $value) {
        if ($name === 'myVar') {
            throw new Exception("not allowed : $name");
        } else {
            // => up to you to decide what to do
        }
    }
}

Instanciatingのクラスを読むように:

$a = new MyClass();
echo $a->myVar . '<br />';

ですぐに予想出力:

test

したがって、何らかの物件:

$a->myVar = 10;

すぐに例外:

Exception: not allowed : myVar in /.../temp.php on line 19

他のヒント

class test {
   const CANT_CHANGE_ME = 1;
}

あなたはtest::CANT_CHANGE_MEとしてそれを参照してください。

の定数を使用してください。キーワードconst

私はこれが古い質問ですけど、PASCALの答えは本当に私を助け、私はそれに少しを追加したい。

__ getが()だけではなく、存在しないプロパティに発射したが、「アクセス不可」のものだけでなく、例えば保護されたもの。これは、それが簡単に読み取り専用プロパティを作成することができます!

class MyClass {
    protected $this;
    protected $that;
    protected $theOther;

    public function __get( $name ) {
        if ( isset( $this->$name ) ) {
            return $this->$name;
        } else {
            throw new Exception( "Call to nonexistent '$name' property of MyClass class" );
            return false;
        }
    }

    public function __set( $name ) {
        if ( isset( $this->$name ) ) {
            throw new Exception( "Tried to set nonexistent '$name' property of MyClass class" );
            return false;
        } else {
            throw new Exception( "Tried to set read-only '$name' property of MyClass class" );
            return false;
        }
    }
}

短い答えはあなたがPHPでの読み取り専用オブジェクトのメンバ変数を作成することはできませんです。

実際には、ほとんどのオブジェクト指向言語は、とにかく公にメンバ変数を公開することが悪いフォーム考える...(そのプロパティの構造とC#の大きなもの、醜い例外)。

あなたはクラス変数を使用する場合は、constキーワードを使用します:

class MyClass {
    public const myVariable = 'x';
}

この変数にアクセスすることができます。

echo MyClass::myVariable;

この変数は関係なく、あなたが作成どのように多くの異なるオブジェクト型MyClassのちょうど1バージョンに存在していますし、ほとんどのオブジェクト指向のシナリオでは、それは少し不使用する必要があります。

Ifは、しかし、あなたがオブジェクトごとに異なる値を持つことができ、読み取り専用の変数をしたい、あなたはプライベートメンバ変数とアクセサメソッド(Kゲッター)を使用する必要があります:

class MyClass {
    private $myVariable;
    public function getMyVariable() {
        return $this->myVariable;
    }
    public function __construct($myVar) {
        $this->myVariable = $myVar;
    }
}

変数は、コンストラクタで設定され、それが読み取り専用のセッターを持っていないことで作られています。しかしMyClassの各インスタンスはmyVariableのために、独自の値を持つことができます。

$a = new MyClass(1);
$b = new MyClass(2);

echo $a->getMyVariable(); // 1
echo $b->getMyVariable(); // 2

$a->setMyVariable(3); // causes an error - the method doesn't exist
$a->myVariable = 3; // also error - the variable is private
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top