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

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

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

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

Q&A

解決済

2回答

5039閲覧

php invokeとは

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2020/10/18 09:14

PHPでのinvokeとはどのようなものなのでしょうか?
具体的にはスクリプトがオブジェクトを関数としてコールしようとした際にコールされます。の意味がわかりません。他のものとは違う点やなぜそれを使う場面があるのかなどを教えていただけると幸いです。

PHPマニュアルを見た際には以下の説明が記載されており、これだけでは理解することはできませんでした。

PHP

1__invoke()2__invoke ([ $... ] ) : mixed

__invoke() メソッドは、 スクリプトがオブジェクトを関数としてコールしようとした際にコールされます。

注意: この機能は PHP 5.3.0 以降で使用可能です。

例4 __invoke() の使用

PHP

1<?php 2class CallableClass 3{ 4 public function __invoke($x) 5 { 6 var_dump($x); 7 } 8} 9$obj = new CallableClass; 10$obj(5); 11var_dump(is_callable($obj)); 12?>

上の例の出力は以下となります。

int(5) bool(true)

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

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

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

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

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

hentaiman

2020/10/18 09:25

他のものとは?どれも動きが違うのでどれに対しての違いですか?
退会済みユーザー

退会済みユーザー

2020/10/18 09:51

説明不十分でした。 普通の関数とはどの様な点が違うのかをお聞きしたいと思っております!
guest

回答2

0

ベストアンサー

スクリプトがオブジェクトを関数としてコールしようとした際にコールされます。

オブジェクト化したクラス(クラスのインスタンス)の持つメソッドを実行するには、ご存じの通り以下のようにメソッドを明示的に呼び出す必要があります

php

1class ABC{ 2 public function ioputs(){ 3 echo 'called'; 4 } 5} 6$obj = new ABC(); 7$obj->ioputs();

__invokeを定義すると、以下のようにメソッドを指定せずにインスタンス自身を実行した時に呼び出される関数となります

php

1class EFG{ 2 public function __invoke(){ 3 echo 'called'; 4 } 5} 6$obj = new EFG(); 7$obj(); 8$obj->__invoke();//明示的に呼び出すことも可能

なぜそれを使う場面が

以下のようにclass変数によって動作の変わるfunctionを引数に取る関数を定義する場面では使いどころがありそうですが、正直言ってフレームワーク自作するとかでもない限り使いどころは無さそうです。

php

1class INV{ 2 public $talk = true; 3 4 public function __invoke(){ 5 if($this->talk){ 6 $this->talk(); 7 }else{ 8 $this->mute(); 9 } 10 } 11 public function talk(){ 12 echo 'talk'; 13 } 14 public function mute(){ 15 echo ''; 16 } 17} 18 19function func($inFunc){ 20 $inFunc(); 21} 22 23$obj = new INV(); 24func($obj); 25$obj->talk=false; 26func($obj);

投稿2020/10/18 11:36

hentaiman

総合スコア6426

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

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

退会済みユーザー

退会済みユーザー

2020/10/20 07:41

ご回答ありがとうございます。 一点疑問に残るのですが、この場合__construct() でも同じ動作を実装できるかと思うのですがどうでしょうか?
hentaiman

2020/10/20 07:59

出来ませんよ。newした時の動作なので。 この辺の特殊なメソッドは実際試して動作確認した方が早く理解できますよ。
退会済みユーザー

退会済みユーザー

2020/10/20 14:52

下記のサンプルを自身で作成してみて理解することができました。 https://paiza.io/projects/RATl1Bz4DydbMmVFQb0-0Q Laravel等でinvokeを使用するのはアクションが1つだけであり、そのコントローラーだけを呼び出すだけど実行されるためでしょうか?
hentaiman

2020/10/21 15:31

laravel5.xは使った事ありますが、そのコメントだけだとどの部分のこと言ってるのか分かりません。 呼び出し方法と、invokeが使われている具体的なソースと行を提示して新たに質問するのが良いでしょう。
guest

0

callableやクロージャの説明見たほうが分かりやすい。
https://www.php.net/manual/ja/language.types.callable.php
https://www.php.net/manual/ja/functions.anonymous.php

入門としては関数を入れた変数に()を付けて実行できる。

php

1$func = function() { 2 return 'test'; 3}; 4 5echo $func();

call_user_funcでも同じ。

php

1echo call_user_func($func);

このcall_user_func()に渡せる形式がいろいろとある。

関数ではなくクラスインスタンスとメソッド。

php

1$foo = new Foo(); 2call_user_func([$foo, 'bar']); 3// $foo->bar()と同じ

__invokeはここでメソッドを省略したい時に使える。
メソッドが指定されてなければ__invokeが実行される。

php

1$foo = new Foo(); 2call_user_func($foo);

最初の()を付ける形も可能。

php

1$foo = new Foo(); 2$foo(); 3// $foo->__invoke()を省略してると考えればいい

とはいえ素のPHPで使う場面は少ない。
関数の例はよく使うけど__invokeはLaravelで初めて使った人が多そう。

投稿2020/10/18 11:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/10/20 07:39 編集

ご回答ありがとうございます! Laravelで使われる__invokeに関してはどうして使われるのか分からないのですが、1つのControllerで1つの関数しかない場合__invokeを使用されることが多いのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問