Closure bindTo $this 与 receiver

2024-06-12 16:08
文章标签 receiver closure bindto

本文主要是介绍Closure bindTo $this 与 receiver,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

闭包:在局部作用域(通常是函数或方法)内,引用了外部数据的函数

Closure Closure::bindTo ( object $newthis [, mixed $newscope = 'static' ] )

复制当前闭包对象,绑定指定的$this对象和类作用域。

newthis

绑定给匿名函数的一个对象,或者 NULL 来取消绑定。

newscope

关联到匿名函数的类作用域,或者 'static' 保持当前状态。如果是一个对象,则使用这个对象的类型为新的类作用域。 这会决定绑定的对象的 保护、私有成员 方法的可见性。

示例1:

class A {function __construct($val) {$this->val = $val;}function getClosure() {//returns closure bound to this object and scopereturn function() { return $this->val; };}
}$ob1 = new A(1);
$ob2 = new A(2);$cl = $ob1->getClosure();
echo $cl(), "\n";            //  1
$cl = $cl->bindTo($ob2);
echo $cl(), "\n";            //  2

简述:改变 对象的内$this的指向 。由此可见,是不是有点类似javascript 中的 call,apply,bind的味道。

题外,用go接口实现 的中receiver 接收器 参数 说法来更为贴切。


php对象类js (Javascript-like)

事实上也的确可以这样操作了,只需要使用以下trait

trait DynamicDefinition {public function __call($name, $args) {if (is_callable($this->$name)) {return call_user_func($this->$name, $args);}else {throw new \RuntimeException("Method {$name} does not exist");}}public function __set($name, $value) {$this->$name = is_callable($value)?$value->bindTo($this, $this):$value;}
}class Foo {use DynamicDefinition;private $privateValue = 'I am private';}$foo = new Foo;
$foo->bar = function() {return $this->privateValue;
};// prints 'I am private'
print $foo->bar();
这样 是不是感觉在写js ?


这篇关于Closure bindTo $this 与 receiver的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

电路笔记(通信):UART Universal Asynchronous Receiver/Transmitter+电缆信号完整性改善

UART协议概述 URAT(Universal Asynchronous Receiver/Transmitter)协议用于在两个设备之间进行数据传输。UART协议因其简单性和广泛应用而成为串行通信的一个基本选择,适合各种数据传输需求的应用。 异步传输 定义: UART是一种异步串行通信协议,这意味着数据在传输过程中不依赖于时钟信号,而是通过约定的波特率(baud rate)来同步数据传输。

groovy之closure

什么是闭包(Closure) 在Groovy中,闭包是一段匿名的代码段,它可以有参数,返回值,并且能够赋值给一个变量。闭包中使用的变量可以是在闭包外部定义的,也可以是在闭包内部定义的。 闭包定义的语法如下 {[closureParameters ->] statements} 上面的方括号[]表示闭包的参数可有可无,所以正常的闭包可能包括如下这些类型: {item++} //item变量

闭包表(Closure Table)

设计血缘关系(data-lineage)时,想到要使用的表模型。 表设计  节点记录表 - node CREATE TABLE `lineages_node` (`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '节点名称',`id` bigint(20) unsigned NOT NULL AUT

spark-Streaming direct和receiver方式读取的区别

区别: Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式,可以从代码中简单理解成Receiver方式是通过zookeeper来连接kafka队列,Direct方式是直接连接到kafka的节点上获取数据了。 一、基于Receiver的方式 这种方式使用Receiver来获取数据。Receiver是使用Kafka的高层次Consumer API来实

Spark Streaming 的 Receiver和 Direct模式

1 两种模式的原理和区别 Receiver模式 1. Receiver模式下的运行架构 1)InputDStream: 从流数据源接收的输入数据。 2)Receiver:负责接收数据流,并将数据写到本地。 3)Streaming Context:代表SparkStreaming,负责Streaming层面的任务调度,生成jobs发送到Spark engine处理。 4)Spark

iOS小技能:receiver message

文章目录 I Objc Runtime1.1 类的结构1.2 OC中一个类的对象实例的数据结构1.3 objc_msgSend函数 II 编译器指令 @encode()2.1 Objective-C type encodings2.2 method encodings III 运行时API应用see also 前言 receiver message不是一个简简单单的方法调用,因

Android四大组件Broadcast Receiver详解

文章来源:http://www.itnose.net/detail/6030479.html 更多文章:http://www.itnose.net/type/85.html 本文主要讲述了: 一、BroadcastReceiver概述: 二、BroadcastReceiver事件分类 三、BroadcastReceiver事件的编程流程 四、两类BroadcastReceiver 五、普通广播

广播接受者(Broadcast Receiver)

监听设备的重启 设备重启后,那些持续运行的应用通常也需要重启。通过监听具有BOOT_COMPLETED操作的broadcast intent,可得知设备是否已完成启动。 创建Broadcast Receiver package com.example.photogallery;import android.content.BroadcastReceiver;import android.c

Analyzing Receiver Operating Characteristic Curves With SAS

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/topmvp - topmvp As a diagnostic decision-making tool, receiver operating characteristic (ROC) curves provide a comprehe

Android 广播(Broadcast Receiver)使用详解

你将了解: 广播两种注册的区别 一、广播两种注册的区别 区别方式静态注册动态注册注册地方在清单文件中注册APP退出,Receiver仍然可以接收到广播并进行相应的处理代码中注册,APP退出无法接受了