PHPで、同じクラスの中で動的にメソッドを実行する方法はありますか?
下記に似ていることをしたいです。
lang
1$this->$method($argument1, $argument2, $argument3);
上記の$methodの名前で処理を変えたいと思っています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
やり方はいろいろありますよ。
lang
1<?php 2 3class testClass { 4 public function fast_view($argument1, $argument2,$argument3) { 5 echo __METHOD__, "速い順:1位$argument2,2位$argument1,3位$argument3"; 6 } 7 8 public function large_view($argument1, $argument2,$argument3) { 9 echo __METHOD__, "大きい順:1位$argument1,2位$argument2,3位$argument3"; 10 } 11 12 public function test($method) { 13 $argument1 = "ゾウ"; 14 $argument2 = "チーター"; 15 $argument3 = "かめ"; 16 // 下記動的にメソッドを実行する3つのやり方 17 $this->{$method}($argument1, $argument2, $argument3); 18 $this->$method($argument1, $argument2, $argument3); 19 call_user_func_array(array($this, $method), array($argument1, $argument2, $argument3)); 20 } 21} 22$test_class = new testClass(); 23// 引数のメソッド名で出力が変わります 24echo $test_class->test("large_view"); 25?>
投稿2014/10/16 07:30
総合スコア139
0
マジックメソッドを利用する方法もあります。
__call
または__callstatic
メソッドをクラスに定義しておくと存在しないメソッドが呼ばれた時の動作を定義することが可能になります。
http://php.net/manual/ja/language.oop5.overloading.php
`
class Sample
{
public function dynamicCallMethod($method)
{
return $this->$method(3, 5, 7);
}
public function __call($name, $arg)
{
switch ($name) {
case 'foo':
return 'called method: ' . $name . ', result: ' . ($arg[0] + $arg[1] + $arg[2]);
break;
case 'bar':
return 'called method: ' . $name . ', result: ' . ($arg[0] * $arg[1] * $arg[2]);
break;
case 'baz':
return 'called method: ' . $name . ', result: ' . ($arg[0] . $arg[1] . $arg[2]);
break;
default:
throw new Exception('undefined method ' . $name);
break;
}
}
}
$obj = new Sample;
try {
foreach (['foo', 'bar', 'baz', 'foobar'] as $method) {
echo $obj->dynamicCallMethod($method) . PHP_EOL;
// echo $obj->$method(3, 5, 7) . PHP_EOL; ←こっちでも結果は同じ
}
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
// called method: foo, result: 15
// called method: bar, result: 105
// called method: baz, result: 357
// undefined method foobar
`
投稿2014/10/16 14:41
総合スコア50
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。