質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2122閲覧

PHP動的に処理したい

kenny_sayama

総合スコア1036

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

2クリップ

投稿2016/10/25 04:32

###補足情報(言語/FW/ツール等のバージョンなど)

  • PHP5.4

###前提・実現したいこと
PHPで汎用的な処理をしたいのですが、いまいち書き方がわからないので質問させてください。

user_call_func()を使えばできるみたいな記事を見たのですが、いまいちわからなかったです。

###該当のソースコード

PHP

1// controller 2$travelObjects = objects; //オブジェクトを引っ張ってきてる 3$this->view->travelObjects = $travelObjects; //viewに渡す 4 5 6 7// 以下 view 8$locations = array("japan","korea","australia"); 9 10foreach ($locations as $location){ 11 // 以下を動的にしたい 12 $travel = $this->traveObjects->getTravel_japan(); 13}

foreachでループを回し、$travelないのゲッターで取得する部分を動的にしたいです。

イメージは、以下です

getTravel_japan(); getTravel_korea(); getTravel_australia();

以上のようにしたいです。
説明足らずかと思いますが、よろしくお願いします。

act823👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

3パターンとも実行結果は同じです。

php

1class Travel 2{ 3 public function getJapan() 4 { 5 return 'japan'; 6 } 7 8 public function getKorea() 9 { 10 return 'korea'; 11 } 12 13 public function getAustralia() 14 { 15 return 'australia'; 16 } 17} 18 19$locations = ['japan', 'korea', 'australia']; 20$travel = new Travel(); 21 22 23// 可変関数 24foreach ($locations as $location){ 25 $method_name = 'get' . ucfirst($location); 26 echo $travel->{$method_name}(), PHP_EOL; 27} 28 29// リフレクション 30foreach ($locations as $location){ 31 $method_name = 'get' . ucfirst($location); 32 $method = new ReflectionMethod($travel, $method_name); 33 echo $method->invoke($travel), PHP_EOL; 34} 35 36// call_user_func 37foreach ($locations as $location){ 38 $method_name = 'get' . ucfirst($location); 39 echo call_user_func([$travel, $method_name]), PHP_EOL; 40}

投稿2016/10/25 04:53

nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

無名関数で処理してください
(ただしくは無名関数ではなく可変関数です)

PHP

1$cl=new myclass; 2$cl->myfunc(); 3class myclass{ 4 function myfunc(){ 5 $locations = array("japan","korea","australia"); 6 foreach ($locations as $location){ 7 $func="getTravel_{$location}"; 8 print $this->$func(); 9 } 10 } 11 function getTravel_japan(){return "j";} 12 function getTravel_korea(){return "k";} 13 function getTravel_australia(){return "a";} 14}

なるべくis_callable()などと併用したほうがよいでしょう

投稿2016/10/25 04:52

編集2016/10/25 13:55
yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/10/25 12:34

> 無名関数で処理してください は、無名関数ではなく可変関数ではありませんか?
yambejp

2016/10/25 13:53

KiyoshiMotokiさん、ありがとうございます おっしゃるとおりです。
guest

0

「japan」とか「korea」とかのメソッド名を動的に指定したいという事でしょうか?
であれば、普通に変数名で指定可能です。

PHP

1<?php 2class Test { 3 public function func_japan() { 4 return 'I am japan'; 5 } 6 public function func_korea() { 7 return 'I am korea'; 8 } 9} 10 11function getFunc($postfix) { 12 return 'func_'.$postfix; 13} 14 15 16$test = new Test(); 17 18$func = getFunc('japan'); 19echo $test->$func().PHP_EOL; 20 21$func = getFunc('korea'); 22echo $test->$func().PHP_EOL;

この出力結果は
I am japan
I am korea
となります。

投稿2016/10/25 04:44

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ゲッターであれば__setのマジックメソッドを使用するか、
下記のように動的に関数名を使用するかですね。

// controller $travelObjects = objects; //オブジェクトを引っ張ってきてる $this->view->travelObjects = $travelObjects; //viewに渡す $getMethod = "getTravel_japa"; // $this->view->travelObjects->getTravel_japa foreach(...){ $data = $travel->$getMethod(); }

投稿2016/10/25 04:37

himakuma

総合スコア952

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問