[PHP]回调函数参数(callable类型)的一些细节

Posted yiyide266

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PHP]回调函数参数(callable类型)的一些细节相关的知识,希望对你有一定的参考价值。

$foo = function()
    echo "foo()\\n";
;
$foo();
($foo);

以上两种调用callable类型的语法是无问题的,函数可以正常运行

下面来说一下习惯上认为可行,但事实上不可行的两个调用方法
假设有以下代码,A实例的foo属性为一个callable:

class A
    public $foo;
    public function bar()
        echo "bar()\\n";
    

$t = new A();
$t->foo = function()
    echo "foo()\\n";
;

对对象调用方法的语法对callable类型无效,因为这个语法已经被php仅用于调用方法来解析,如果执行,php会提示:"Call to undefined method":

$t->foo(); //提示:"Call to undefined method"

调用call_user_func函数,第一个参数是callable有效:

($t->foo); //正常调用

调用call_user_func函数,但使用重新指定上下文的形式无效,因为这种语法规定参数array的第二项是一个方法(或函数)名,而不是一个callable:

(array($t, $t->foo)); //提示:"second array member is not a valid method"

想要实现重新定位上下文,只需要借助一下Closure :: bind()方法,它接受一个callable,重新返回一个指定了新的上下文的callable,然后再次用call_user_func函数普通的调用方式,就没问题:

(Closure :: bind($t->foo, $t)); //Okay!

 

php值callback类型和匿名函数(闭包)

callback、callable类型

自PHP5.4起可以使用callable类型制定回调类型callback。
本文档基于同样理由使用callback类型信息。

一些函数如call_user_func()或者usort()可以接受用户自定义的回调函数作为参数,回调函数不不止可以是简单的函数,
还可以是对象的方法,包括静态类方法。

传递???????????

PHP是将函数已string形式传递的。keyi9使用任何内置或者用户自定义函数,但除了语言结构例如:array、echo、empty、eval、exit、isset、list、print、unset。

一个已实例化的object的方法被作为array传递。小标0包含该object,下标1包含方法名。
在同一个类里面可以访问projected和private方法。

静态类方法也可不经实例化该类的对象而传递。只要在下标0中包含类名而不是对象。自PHP5.2.3起,也可以传递"类型::方法名"

除了普通的用户自定义函数外,也可以传递匿名函数给回调函数。

call_user_func();

匿名函数

匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。
最经常用作回调函数(callback)参数的值。当然,也有其他应用的情况。

匿名函数示例

echo preg_replace_callback(‘~-([a-z])~‘, function ($match) {
return strtoupper($match[1]);
}, ‘hello-world‘);
// 输出 helloWorld

闭包函数也可以作为变量的值来来使用。PHP会自动把此种表达式转化成内置类Closure的对象实例,。把一个closure
对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最好也要加上分号;

匿名函数变量赋值示例

$greet = function($name)
{
printf("Hello %s ", $name);
};

$greet(‘World‘);
$greet(‘PHP‘);

call_user_func($greet);

闭包可以从父作用域中继承变量。
任何此类变量都应该用use 语言结构传递进去。PHP7,1起,不能传入此类变量。

superglobals。$this或者和参数重名。

这些变量都必须在函数或者类的头部声明,从父作用域中继承变量与使用全局变量是不同的。
全局变量存在于一个全局的范围,
无论当前在执行的是那个函数,而闭包的父作用域是定义该闭包的函数(不一定是调用它的函数)。
示例如下:

















以上是关于[PHP]回调函数参数(callable类型)的一些细节的主要内容,如果未能解决你的问题,请参考以下文章

php中的回调函数

关于PHP的方法参数类型约束

php回调函数的概念及实例

is_callable Callbacks / Callables What is a “callable”?

is_callable Callbacks / Callables What is a “callable”?

如何使用 PHPDoc 对 Callable 的参数进行类型提示?