- ベストアンサー
$obj->varの変数のアクセスの仕方
- $obj->varの変数のアクセス方法を教えてください。
- php5で$objMyClassというオブジェクトを作成し、$objMyClass->varという変数が定義されているようですが、アクセスの方法がわかりません。
- zendFrameWorkでは、$authNamespaceというZend_Session_Namespaceオブジェクトの$userプロパティを設定すると、$_SESSION['Zend_Auth']['user']に値が設定されるようです。同じような実装をしたいので、方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
マジックメソッド __call() を実装しているかしていないかの差 もしくは、class定義するときに、メンバ変数で class MyClass { public $var; } としている必要性がある。 ここから個人的な意見 class内のメンバ変数をやたらめったら外から直接叩けるようにしてしまうのはあまりよろしくない。 例えば、class内で varという変数をつかっていたとする。 なーんも考えないでアホみたいに、 public public・・・ と厳密な意味も理解せずに呪文のようにとなえていると。なんのためのメンバ変数か分からなくなる。 Zend_Session_Namespace のように単にデータをクランプしているだけであればそういう使い方もないわけじゃないが、一般的に作るclassのほとんどが何かしらの処理を行うためのもの。 例えば、var は MyClass内でのみしか使ってはいけないのにもかかわらず。 class MyClass{ public $var; public function setVar($var){ $this->var = $var; } public function getVar(){ return $this->var + 1; } } という作り方をした場合、外部から $obj = new MyClass(); $obj->setVar(1); $obj->var = 'かきくけこ'; と出来てしまう。 そうすると、 print $obj->getVar(); は全く期待していない値が返ってくることになる。 もし、何人かでシステムを組んでいるときに、このような事が出来てしまっては、非常に発見しにくいバグを生む。
お礼
zend Frameworkをダウンロードして読んだところ、__set()を使って実装してました。 public function __set($name, $value) 略… $name = (string) $name; $_SESSION[$this->_namespace][$name] = $value; public $var;として、 $obj->var = 'かきくけこ'; とできてしまうのは、カプセル化できていないという問題ですよね? 詳しいご回答ありがとうございました。