- ベストアンサー
phpクラスのメソッド名を変数で定義する方法について
- phpにおいて、クラスのメソッド名を変数で与えることはできないのでしょうか?定義の際に変数展開ができないため、他の方法を探しています。
- 現在のところ、クラスのメソッド名を変数で定義する方法は見つかっていません。一方、メソッドを使用する際には変数展開ができるため、定義の際にも同じように行える方法があるのではないかと考えています。
- 質問者は、クラスのメソッド名を変数で定義する方法について詳しく知りたいと述べています。何かアドバイスや情報があれば、お教えいただけるとうれしいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
意図次第なんですけど、これは、いわゆるアクセッサを作るのが面倒くさいとか そういう意図ということでいいですか? もしそのような理由なのであれば、マジックメソッドを使うと良いです。 <?php class ClassA{ private $vars = array('AA'=>'', 'BB'=>'', 'CC'=>''); public function __get($name){ if(isset($this->vars[$name])) return $this->vars[$name]; return null; } public function __set($name, $value){ if(isset($this->vars[$name])){ $this->vars[$name] = $value; } } } $class = new ClassA(); $class->AA = "nanika"; $class->BB = "nantoka"; ?> と言ったように記述出来るようになります。(__setメソッドがそれ。) また、どうしても「setAA(value)」とか「setBB(value)」といった記述が良いということであれば、 同じくマジックメソッドで、「__call」というものがあるのでそれを使うと良いと思います。 <?php class ClassB{ private $vars = array('AA'=>'', 'BB'=>'', 'CC'=>''); private function set($name, $value){ $this->vars[$name] = $value; } private function get($name){ return $this->vars[$name]; } public function __call($method, $arguments){ if(preg_match('/^set([A-Za-z0-9_]+)/', $method, $match)){ if(in_array(array_keys($this->vars), $match[1])){ return $this->set($match[1], $arguments[0]); } } if(preg_match('/^get([A-Za-z0-9_]+)/', $method, $match)){ if(in_array(array_keys($this->vars), $match[1])){ return $this->get($match[1]); } } } $class = new ClassB(); $class->setAA("atai"); echo $class->getAA(); // 「atai」と表示 ?> いかがでしょうか。
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
姑息な処理をすればできないことはないでしょう。 ただそんな名前に依存する関数をつくるよりは create_function()で匿名関数を作る方がよいと思いますが・・・ <? class ClassA{ function __construct(){ $setAA=create_function('$arg','return $arg+1;'); print $setAA(3); } } new ClassA; ?>
補足
ご回答いただきありがとうございます。 もう少し教えていただきたいのですが、 $hoge = new ClassA; $hoge->setAA(3); のような形で、setAAをメソッドとして用いることはできないのでしょうか?
- idaira
- ベストアンサー率33% (2/6)
なぜ、そんなことをする必要があるのですか? $valの部分を引数で持つのではだめなのですか?
補足
ご回答ありがとうございます。 なるほど、そのようにしてもよさそうですね。 ご質問させていただいたことは、やはり不可能なのでしょうか?
お礼
ご推察の通り、アクセッサの定義をしたいのでした。 まさに、このようなご回答を欲しておりました。 本当にありがとうございます!!! このようなことができると知り、とても勉強になりました。 さて、ご記載頂いたコードの in_arrayの引数の順序が逆であったのと、 class定義の括弧閉じが落ちていましたので、 修正版を下記に再掲いたします。 素晴らしい回答をいただきましてありがとうございました!!!!! <?php class ClassB{ private $vars = array('AA'=>'', 'BB'=>'', 'CC'=>''); private function set($name, $value){ $this->vars[$name] = $value; } private function get($name){ return $this->vars[$name]; } public function __call($method, $arguments){ if(preg_match('/^set([A-Za-z0-9_]+)/', $method, $match)){ if(in_array($match[1], array_keys($this->vars))){ return $this->set($match[1], $arguments[0]); } } if(preg_match('/^get([A-Za-z0-9_]+)/', $method, $match)){ if(in_array($match[1], array_keys($this->vars))){ return $this->get($match[1]); } } } } $class = new ClassB(); $class->setAA("atai"); echo $class->getAA(); // 「atai」と表示 ?>