更确切地说,函数声明参数中使用的"可调用"。就像下面的那个。
function post($pattern, callable $handler) {
$this->routes['post'][$pattern] = $handler;
return $this;
}
它对我们有什么好处?
我们为什么以及如何使用它?
也许这对你来说是非常基本的,然而,我试着寻找它,但没有得到答案。至少,我什么都听不懂。
希望得到一个傻瓜的答案。我是编码新手。。。XD-
编辑:这是我复制上述代码的链接:链接
这是一个类型提示,告诉我们这个函数接受参数$handler
作为一个函数,请参阅这个例子来澄清:
function helloWorld()
{
echo 'Hello World!';
}
function handle(callable $fn)
{
$fn(); // We know the parameter is callable then we execute the function.
}
handle('helloWorld'); // Outputs: Hello World!
这是一个非常简单的例子,但我希望它能帮助你理解这个想法。
callable
类型允许我们将回调函数传递给正在调用的函数。也就是说,回调函数参数允许被调用的函数动态调用我们在callable
函数参数中指定的代码这很有用,因为它允许我们将要执行的动态代码传递给函数
例如,您可能想要调用一个函数,而该函数接受一个名为log
的回调函数,该函数将以您想要的自定义方式记录数据。
我希望这是有道理的。有关详细信息,请参阅此链接。
下面是使用可调用函数作为参数的示例。
下面的wait_do_linebreak函数将休眠一段给定的时间,然后使用给定的拖尾参数调用一个函数,然后回显换行符。
...$params
将尾部参数打包到一个名为$params的数组中。在这里,它被用来将参数代理到可调用函数中。
在示例的末尾,您将看到一个本机函数,它将一个可调用函数作为参数。
<?php
function wait_do_linebreak($time, callable $something, ...$params)
{
sleep($time);
call_user_func_array($something, $params);
echo "n";
}
function earth_greeting() {
echo 'hello earth';
}
class Echo_Two
{
public function __invoke($baz, $bat)
{
echo $baz, " ", $bat;
}
}
class Eat_Static
{
static function another()
{
echo 'Another example.';
}
}
class Foo
{
public function more()
{
echo 'And here is another one.';
}
}
wait_do_linebreak(0, 'earth_greeting');
$my_echo = function($str) {
echo $str;
};
wait_do_linebreak(0, $my_echo, 'hello');
wait_do_linebreak(0, function() {
echo "I'm on top of the world.";
});
wait_do_linebreak(0, new Echo_Two, 'The', 'Earth');
wait_do_linebreak(0, ['Eat_Static', 'another']);
wait_do_linebreak(0, [new Foo, 'more']);
$array = [
'jim',
'bones',
'spock'
];
$word_contains_o = function (string $str) {
return strpos($str, 'o') !== false;
};
print_r(array_filter($array, $word_contains_o));
输出:
hello earth
hello
I'm on top of the world.
The Earth
Another example.
And here is another one.
Array
(
[1] => bones
[2] => spock
)
可调用(回调)函数是在另一个函数内部调用或用作另一个函数的参数的函数
// An example callback function
function my_callback_function() {
echo 'hello world!';
}
// Type 1: Simple callback
call_user_func('my_callback_function');
在某些情况下,您的函数是其他函数的模板,在这种情况下,为可调用函数使用参数。
有关详细信息:http://php.net/manual/en/language.types.callable.php
可调用
callable
是一种php数据类型。它只是指任何可以调用的东西,即函数类型。如果这个函数是一个闭包,那么只要我们能调用这个函数,静态/正则方法或其他方法都无关紧要。
示例:
//php callable type
$callback = function() {
return "hello world!n";
};
class MyClass {
static function myCallbackMethod() {
return "static method call n";
}
public function cb()
{
return "method call n";
}
public function __invoke() {
return "invoke n";
}
}
$obj = new MyClass();
// Illustrative function
function soUseful (callable $callback) {
echo $callback();
}
soUseful($callback);
soUseful(array($obj, 'cb')); // syntax for making method callable
soUseful(array('MyClass', 'myCallbackMethod')); // syntax for making static method callable
soUseful($obj); // Object can be made callable via __invoke()
soUseful(fn() => "hi from closure n"); // arrow fn
//Output
//hello world!
//method call
//static method call
//invoke
//hi from closure
可调用是一种数据类型。
注意:您可以通过使用内置的is_callable函数来检查变量是否为"可调用"类型,并将变量的处理程序作为其参数。
代码中的"callable"关键字用于"类型声明",在PHP5中也称为"类型提示"。它用于指定函数或方法接受哪种类型的参数或参数。这是通过简单地将"类型提示"或"类型声明"(即类型的名称,在本例中为"可调用")放在参数名称之前来完成的。
每当对函数声明使用"类型提示"或"类型声明"时(即,当您指定了允许/接受哪些类型时),并且您调用它们时给出的数据类型参数不是指定为可接受的数据类型的参数,就会生成错误。
注意:如果您想让函数需要从特定类实例化的对象,也可以使用类名<针对其各自的参数
-
参考文献:
php手册>类型声明
php手册>可调用类型
-
我是编码新手,所以请纠正我的错误:)
Use callable to require a callback function as an argument
We use it with argument of function it will strict to to pass callable( closure static/regular function ) when we calling the function
示例1在函数调用中不传递可调用项:
$myfuntion = function(callable $sum){
};
// when calling myfuntion i passed integer
$myfuntion(123);
// it will not allow us to do this
示例2在函数调用中传递可调用项:
$sum = function($arr){
echo array_sum($arr);
};
$myfuntion = function(callable $sum){
// do something
};
$myfuntion($sum);
// Sum is a callable function now it will work absolutely fine
合适的示例:
$sum = function( ...$args){
echo array_sum($args);
};
$myfun = function(callable $sum){
$sum(1,2,3,4,5);
};
$myfun($sum);