実装方法"を読み取り専用のメンバー変数PHP?
-
23-09-2019 - |
質問
きを変えようとしているので、例外をスローします。
解決
と思い、解決のためのクラス物件とする。
- な定義の名のもと、自分の興味のあるす
- 利用のマジック
__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