PHP中的关键字“callable”有啥作用

Posted

技术标签:

【中文标题】PHP中的关键字“callable”有啥作用【英文标题】:What does the keyword "callable" do in PHPPHP中的关键字“callable”有什么作用 【发布时间】:2019-06-07 13:33:24 【问题描述】:

更准确地说,函数声明参数中使用的“可调用”。像下面那个。

function post($pattern, callable $handler) 
    $this->routes['post'][$pattern] = $handler;
    return $this;

它对我们有什么好处?

我们为什么以及如何使用它?

也许这对您来说非常基本,但是,我已经尝试搜索它,但没有得到任何答案。至少,我什么都听不懂。

希望得到一个傻瓜式的答案。我是编码新手...XD

编辑:这是我从以下位置复制上述代码的链接:link

【问题讨论】:

callable 只是参数的类型提示 - 请查看 php.net/manual/en/language.types.callable.php 了解 callable 是什么。 【参考方案1】:

callable 类型允许我们将回调函数传递给被调用的函数。也就是说,回调函数参数允许被调用的函数动态调用我们在callable函数参数中指定的代码。 这很有用,因为它允许我们将要执行的动态代码传递给函数。

例如,一个人可能想要调用一个函数,而该函数接受一个名为 log 的回调函数,它会以您想要的自定义方式记录数据。

我希望这是有道理的。详情请见this link。

【讨论】:

我明白了, callable 是一种类型,它被用于类型声明。非常感谢。【参考方案2】:

这是一个类型提示,它告诉我们此函数接受参数$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' 即使 PHP 不区分大小写,只是按照惯例。 @boctulus 感谢您的更正,我已经编辑了我的答案 如果可调用函数接受参数怎么办? callable 如何指定所需的参数?【参考方案3】:

这里是使用callable 作为参数的示例。

下面的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
)

【讨论】:

【参考方案4】:

可调用(回调)函数是在另一个函数内部调用或用作另一个函数的参数的函数

// 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

【讨论】:

【参考方案5】:

可调用

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

【讨论】:

【参考方案6】:

Callable 是一种数据类型。

注意:您始终可以使用内置的 is_callable 函数检查您的变量是否属于“可调用”类型,并将变量的处理程序作为其参数。

代码中的“callable”关键字用于“类型声明”,在 PHP 5 中也称为“类型提示”。它用于指定您的函数或方法接受的参数或参数类型。这可以通过简单地将“类型提示”或“类型声明”(即类型的名称,如本例中的“可调用”)放在参数名称之前来完成。

每当对函数声明使用“类型提示”或“类型声明”时(即,当您指定允许/接受哪些类型时),并且您调用它们时提供数据类型的参数,而不是指定为可接受,会产生错误。

注意:另外,如果你想让你的函数需要>一个从特定类实例化的对象,可以使用类名

-

参考资料:

php manual > type-declaration

php manual > callable type

-

我是编码新手,所以请纠正我的错误:)

【讨论】:

以上是关于PHP中的关键字“callable”有啥作用的主要内容,如果未能解决你的问题,请参考以下文章

python的关键字yield有啥作用

sql的主键、外键是啥意思?有啥作用,能说通俗易懂点吗?

c++:Status问题(status是c++中的关键字吗?是一种数据类型吗?它有啥作用?)

Vue中的key有啥作用

JAVA语言中,被static关键字修饰的成员变量和类变量有啥区别?

SwiftUI `@State` 关键字有啥作用?