重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

仕組みが全然分かりません。
AIで調べても、説明が日本語がよく分かりません。
どなたか教えて頂けないでしょうか?
よろしくお願いします。

<?php
function Hello() {
print "こんにちは";
}

function callfunc(callable $f) {
$f();
print "しおりさん";
}

callfunc("Hello");

?>

A 回答 (2件)

なんかここ、面白おかしく書いているから分かりやすいかもです。


https://zenn.dev/ad5/articles/116c7c58ad54b9
    • good
    • 0
この回答へのお礼

ありがとう

お礼日時:2025/03/07 04:22

関数を引数に取る関数を一般に高階関数と呼ぶ。



高階関数:
https://ja.wikipedia.org/wiki/%E9%AB%98%E9%9A%8E …

そして、高階関数に与える引数になる関数をコールバック関数、って呼ぶんだ。

PHP自体は知らんのだけど、callfuncの引数はcallableと言うキーワード(?多分)によって関数が指定されている。恐らく、文字列callfunc + "Hello"と言うコンビネーションが関数Helloを呼び出す仕組みになってて、それがcallfuncの本体で実行されてる、ってだけの話だろう。

うーん、多分PHPは「関数がファーストクラスオブジェクト」じゃない、んでcallable + "関数名"って書式になってんだろうね。

第一級オブジェクト:
https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80 …

他の主だった「関数がファーストクラスオブジェクト」な言語だと次のようになる。

;; Scheme:

(define (Hello)
 (display "こんにちわ")
 (newline))

(define (callfunc $f)
 ($f) ;; ここで引数で受け取った関数fを実行
 (display "しおりさん")
 (newline))

(callfunc Hello)

// JavaScript(ただしconsole.logは実装依存/ブラウザのAPI):

function Hello() {
 console.log("こんにちわ");
}

function callfunc(f) {
 f(); // ここで引数で受け取った関数fを実行
 console.log("しおりさん");
}

callfunc(Hello);

## Python

def Hello():
 print("こんにちわ")

def callfunc(f):
 f() ## ここで引数で受け取った関数fを実行
 print("しおりさん")

callfunc(Hello)

繰り返すが、高階関数とは関数を引数に取る関数、コールバック関数とは高階関数の引数として与える関数だ(callfuncは高階関数、Helloはコールバック関数となる)。
概念は簡単だし、「関数がファーストクラスオブジェクト」なプログラミング言語だと、データとして関数をそのまま与えられるし、そのまんまの関数名が使える。
一方、PHPは恐らく「関数がファーストクラスオブジェクト」と言う設計じゃないんて、引数で与えるキーワードとしてcallableが必要になり、関数名を直接引数として渡せないんで文字列で与えなければならない、と言うそれだけの話じゃないのかな。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A