• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:phpにおいて、クラスのメソッド名を定義する際に、)

phpクラスのメソッド名を変数で定義する方法について

このQ&Aのポイント
  • phpにおいて、クラスのメソッド名を変数で与えることはできないのでしょうか?定義の際に変数展開ができないため、他の方法を探しています。
  • 現在のところ、クラスのメソッド名を変数で定義する方法は見つかっていません。一方、メソッドを使用する際には変数展開ができるため、定義の際にも同じように行える方法があるのではないかと考えています。
  • 質問者は、クラスのメソッド名を変数で定義する方法について詳しく知りたいと述べています。何かアドバイスや情報があれば、お教えいただけるとうれしいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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」と表示 ?> いかがでしょうか。

gwky
質問者

お礼

ご推察の通り、アクセッサの定義をしたいのでした。 まさに、このようなご回答を欲しておりました。 本当にありがとうございます!!! このようなことができると知り、とても勉強になりました。 さて、ご記載頂いたコードの 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」と表示 ?>

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

姑息な処理をすればできないことはないでしょう。 ただそんな名前に依存する関数をつくるよりは create_function()で匿名関数を作る方がよいと思いますが・・・ <? class ClassA{ function __construct(){ $setAA=create_function('$arg','return $arg+1;'); print $setAA(3); } } new ClassA; ?>

参考URL:
http://www.php.net/manual/ja/function.create-function.php
gwky
質問者

補足

ご回答いただきありがとうございます。 もう少し教えていただきたいのですが、 $hoge = new ClassA; $hoge->setAA(3); のような形で、setAAをメソッドとして用いることはできないのでしょうか?

  • idaira
  • ベストアンサー率33% (2/6)
回答No.1

なぜ、そんなことをする必要があるのですか? $valの部分を引数で持つのではだめなのですか?

gwky
質問者

補足

ご回答ありがとうございます。 なるほど、そのようにしてもよさそうですね。 ご質問させていただいたことは、やはり不可能なのでしょうか?

関連するQ&A