メンバーフィールドのコンテナである不変クラスを作成する必要があります。私はそのフィールドをコンストラクタで一度インスタンス化したい(値はコンストラクタのパラメータとして与えられるべきです)。私はフィールドを公開しても変わらないものにしたい。各フィールドの前にキーワードfinal
を使用してJavaで実行できました。それはPHPでどのように行われますか?PHP:不変パブリックメンバーフィールド
10
A
答えて
16
のdinamyc数を持っている場合は、__set
と__get
マジックメソッドを使用する必要がありますし、保護またはプライベートとしてそのプロパティを宣言:
class Example
{
private $value;
public function __construct()
{
$this->value = "test";
}
public function __get($key)
{
if (property_exists($this, $key)) {
return $this->{$key};
} else {
return null; // or throw an exception
}
}
public function __set($key, $value)
{
return; // or throw an exception
}
}
使用法:
$example = new Example();
var_dump($example->value);
$example->value = "invalid";
var_dump($example->value);
出力:
string(4) "test"
string(4) "test"
2
マジックメソッド__set()
を使用して、誰かがプロパティを直接設定しようとしたときに例外をスローすることができます。
class ClassName {
public function __set($key, $value) {
throw new Exception('Can't modify property directly.');
}
}
ただし、公開されているかどうかにかかわらず、プロパティの変更が防止されます。
2
ので、あなたがより良い行うことができます - あなたはフィールド
class ClassName {
private $fields = array();
// use class : $cl = new ClassName(array('f'=>2,'field_4'=>5,''12));
// echo $cl->field_4; echo $cl->f;
public function __construct($data= array())
{
if (!is_array($data) || !count($data)) throw new Exception('Not enough args')
foreach ($data as $key=>$val)
{
if (is_numeric($key))
$this->fields['field_'.$key] = $val;
else
$this->fields[$key] = $val;
}
}
/* in this case you can use this class like $cl = new ClassName(12,14,13,15,12); echo $cl->field_1;
public function __construct()
{
$ata = funcs_get_args();
if (!count($data)) throw new Exception('Not enough args')
foreach ($data as $key=>$val)
{
if (is_numeric($key))
$this->fields['field_'.$key] = $val;
else
$this->fields[$key] = $val;
}
}
*/
public function __get($var) {
if (isset($this->fields[$var]))
return $this->fields[$var];
return false;
//or throw new Exception ('Undeclared property');
}
}
+4
'__set'はパブリックプロパティで呼び出されません – sanmai
関連する問題
- 1. PHP DOMNode insertBefore(変更不可能なエラー)
- 2. PHP不正なオフセットタイプ
- 3. PHPのメモリ不足
- 4. PHP '不正なオフセット'
- 5. 不変のベクトルの不変のサブベクトル
- 6. PHPの可変変数は不正な変数名を許可しますか?
- 7. PHP Cpanel_PublicAPI不正な変数を渡すアカウントを作成する
- 8. PHP画像アップロードとサイズ変更でメモリ不足(96MBメモリ制限)
- 9. クローンを使用したPHP疑似不変オブジェクト
- 10. PHPエラー不明列句
- 11. 不明な送信者PHP
- 12. PHPの不正なMIMEタイプ
- 13. PHP不明なエラーRRDサポート
- 14. PHP印刷不確定カテゴリツリー
- 15. PHPログインの問題。不明
- 16. SmartyへのPHP、不明
- 17. 配列 - PHPのメモリ不足
- 18. PHP正体不明のインデックスエラーメッセージ
- 19. PHPセッションが不明なエラー
- 20. PHP IRC Bot不定オフセット
- 21. PHPのエラー - 不定インデックス:ID
- 22. セッション、PHP不完全クラス
- 23. PHP GD不適切なtransparancy
- 24. PHP SoapClient:アクションの不一致
- 25. phpゼリービーンゲーム - 不正確なシーケンシング
- 26. PHPのコンストラクトコンセプトが不明確
- 27. 不変ハッシュから不変ハッシュへのラケット可変ハッシュ
- 28. 不変のクラスデザイン
- 29. .NET不変オブジェクト
- 30. 再/不変オブジェクトリスト
これはPHPでは不可能です。 – Sjoerd
フィールドを公開する必要があるのはなぜですか? – Pete171
@ pete171おそらく読み込み専用です – fbstj