PHPにおけるタイプヒンティングでのClosureとcallableの違い
by @dekokun on 2014/07/25 00:26
概要
Closureとcallable、どちらも無名関数に使えるタイプヒンティングなのですが、callableは無名関数以外でも関数名とかでもいけるけどClosureはそういうのいけないよという話。
@do_aki氏に感謝
詳細
PHPのタイプヒンティングで。
— でこくん (@dekokun) 2014, 7月 22
@dekokun 5.5 あたりから、Closure ベースで良いよって事になってたはず。
— どぅーあき (@do_aki) 2014, 7月 22
@dekokun http://t.co/mZdkKiY3EH
— どぅーあき (@do_aki) 2014, 7月 22
@dekokun うんにゃ。 callable だと、文字列(関数名)や array (クラス名/インスタンスとメソッド名) も受け付けるよ。
— どぅーあき (@do_aki) 2014, 7月 22
<?php
function callableTest(callable $func) {
}
function closureTest(\Closure $func) {
}
callableTest('printf'); // 問題なし
closureTest('printf'); // PHP Catchable fatal error: Argument 1 passed to closureTest() must be an instance of Closure, string given
class Hoge {
public function hoge() {
}
}
$hoge = new Hoge();
callableTest([$hoge, 'hoge']); // 問題なし
closureTest([$hoge, 'hoge']); // PHP Catchable fatal error: Argument 1 passed to closureTest() must be an instance of Closure, string given
callableTest(function() {}); // 問題なし
closureTest(function() {}); // 問題なし
あとがき
@do_akiさんありがとう
Twitterさんありがとう
comments powered by Disqus