php之 Callable 可调用对象

2024-06-12 16:08
文章标签 php 对象 调用 callable

本文主要是介绍php之 Callable 可调用对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近期在读laravel源码,感觉收获蛮多。php官方文档果然是最佳学习教程。

一些函数如 call_user_func()usort() 可以接受用户自定义的回调函数作为参数。

回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。(补充 可调用对象包括 带有___invoke方法类的对象)


传递

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

静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'

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


Example #1 回调函数示例

// An example callback function
function my_callback_function() {echo 'hello world!';
}// An example callback method
class MyClass {static function myCallbackMethod() {echo 'Hello World!';}
}// Type 1: Simple callback
call_user_func('my_callback_function'); // Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod')); // Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');// Type 5: Relative static class method call (As of PHP 5.3.0)
class A {public static function who() {echo "A\n";}
}class B extends A {public static function who() {echo "B\n";}
}call_user_func(array('B', 'parent::who')); // A// Type 6: Objects implementing __invoke can be used as callables (since PHP 5.3)
class C {public function __invoke($name) {echo 'Hello ', $name, "\n";}
}$c = new C();
call_user_func($c, 'PHP!');


Example #2 使用 Closure 的示例

/ Our closure
$double = function($a) {return $a * 2;
};// This is our range of numbers
$numbers = range(1, 5);// Use the closure as a callback here to 
// double the size of each element in our 
// range
$new_numbers = array_map($double, $numbers);print implode(' ', $new_numbers);  // 2 4 6 8 10

注:

在函数中注册有多个回调内容时(如使用call_user_func()call_user_func_array()),如在前一个回调中有未捕获的异常,其后的将不再被调用。

附1 使用$this 变量代理方法后期调用

class MyClass {public $property = 'Hello World!';public function MyMethod(){call_user_func(array($this, 'myCallbackMethod'));}public function MyCallbackMethod(){echo $this->property;}} 


这篇关于php之 Callable 可调用对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054690

相关文章

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音