pthreads v3下的Volatile介绍与使用
由于pthreads v3中引入了Threaded对象自动不变性的概念,所以当我们在构造函数中给成员设置为数组时,在其他地方就无法对成员再次改写了。
例子如下:
<?php //pthreads v3引入了Threaded对象自动不变性的概念
//如果成员被设置成Threaded对象,那么它将不能被再次改写
//当然,这主要还是为了性能优化,但有时我们又需要改写成员,那么就需要继承自Volatile类了
class Task extends Thread
{
private $data;
private $result; public function __construct()
{
$this->data = 'abc';
var_dump($this->data); //成员设置成标量,是可以再次被改写的
$this->data = 'def';
var_dump($this->data); //这里给data设置为数组时,会自动转换成Volatile对象
$this->data = [1, 2, 3];
var_dump($this->data); //这个时候再给data赋值时,就会报错了
//成员被设置成Threaded对象时(Volatile继承自Threaded),该成员就不能再次被改写了
$this->data = [4, 5, 6];
var_dump($this->data); //当然,我们可以显式的强制转换,不让Threaded帮我自动转成Volatile对象
$this->result = (array)[1, 2, 3];
//打印出来是数组
var_dump($this->result);
$this->result = (array)[4, 5, 6];
//成员赋值成功
var_dump($this->result);
}
} new Task();
如果我们对成员再次进行改写,那么就会报错了。

如果确实需要对成员数据进行改写,除了上面的显式强制转换外,另一个方法就是继承Volatile类了。
例子如下:
<?php //Volatile类允许其成员可更改
class Task extends Volatile
{
private $data; public function __construct()
{
//继承自Volatile类后,我们的成员在设置成Threaded对象后,仍可改写
$this->data = [
'a' => 123,
'b' => 456,
'c' => 789,
];
var_dump($this->data); //这里成员数据成功被改写
$this->data = [
'a' => 'aaa',
'b' => 'bbb',
'c' => 'ccc',
];
var_dump($this->data); //由于Threaded对象实现了ArrayAccess接口,我们可以像访问数组一样,访问Volatile对象
echo $this->data['a'], "\t", $this->data['b'], "\t", $this->data['c'], "\n"; foreach ($this->data as $item) {
echo $item, "\n";
}
}
} new Task();
结果如下:

pthreads v3下的Volatile介绍与使用的更多相关文章
- pthreads v3下一些坑和需要注意的地方
一.子线程无法访问父线程的全局变量,但父线程可以访问子线程的变量 <?php class Task extends Thread { public $data; public function ...
- pthreads v3下的同步处理synchronized
之所以会用到同步,是因为如果多个线程中对同一个资源进行操作时,会发生混乱. 比如2个线程对变量进行加1操作,第1个线程还没来的及改写数据时,第2个线程就对变量进行操作了,那变量最终的结果就是未知的,这 ...
- pthreads v3下的worker和pool的使用
有些人会想,明明用thread已经可以很好的工作了,为什么还要搞个worker和pool? 之所以要用到worker和pool还是因为效率,因为系统创建一个新线程代价是比较昂贵,每个创建的线程会复制当 ...
- pthreads v3在centos7下的安装与配置
我的centos版本是7.4.1708,php的版本是7.2.4(注意要是线程安全版),如下图所示: 首先我们在如下网址下载好pthreads的源码: http://pecl.php.net/pack ...
- [转]Linux下的图形库介绍
[转]Linux 下的图形库介绍 http://blog.csdn.net/gogor/article/details/5925925 在进行Linux下的图形系统编程时,我们常常会遇到以下这些概念: ...
- Linux 下安装 resync 介绍
Linux 下安装 resync 介绍 这是官网,找到对应版本的下载地址. 这里提供Linux_X64的安装包 wget '' https://download-cdn.resilio.com/sta ...
- 【转帖】Windows与Linux系统下的库介绍
Windows与Linux系统下的库介绍 http://embeddedlinux.org.cn/emb-linux/entry-level/200903/12-553.html 库的定义 库文件是一 ...
- html基本标签表单实现交互原理,单选框,复选框,下拉框介绍
表单是什么?表单是前端和服务器做交互的一种机制,表单收集用户输入信息,之后发送或者提交给服务器.用户在输入的信息称之为内容,内容的文本分为普通和密码型,用户通过单选框.复选框.下拉框(也就是下拉菜单) ...
- centos7下stf安装介绍(一)----环境搭建
重要:node version需要8.x.x 介绍 stf 全称 Smartphone Test Farm ,一款WEB 端移动设备批量管理工具(Remote control all your Sma ...
随机推荐
- How to Pronounce the Days of the Week
How to Pronounce the Days of the Week Share Tweet Share Vocabulary study: how to pronounce the days ...
- 将IP地址字符串转为32位二进制
def str2bin(s): temp = s.split('.') result = '' for i in range(len(temp)): temp[i] = str(bin(int(tem ...
- sql help cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Confi ...
- [jQ]使用jQuery将多条数据插入模态框的方法
---------------------------------------------------------------------------------------------------- ...
- Unity3d资源管理分析
原创链接:http://blog.csdn.net/ox_thedarkness/article/details/9197453 分离资源管理 参考 1.Unity3D占用内存太大的解决方法 - 星尘 ...
- 创建maven项目前的准备工作
第二步: 在maven中的settings.xml文件中指定 2.1 本地仓库:计算机中一个文件夹,自己定义是哪个文件夹. 2.1 示例语法 <localRepository>D:/mav ...
- spring boot 访问jsp 弹出下载
在pom.xml中加入以下jar 包 <!-- 引入Spring Boot 内嵌的Tomcat对jsp的解析包--><dependency> <groupId>or ...
- shiro中的授权
- Conscription-最小生成树-Kruskal
Windy has a country, and he wants to build an army to protect his country. He has picked up N girls ...
- phpexcel 导入超过26列时的解决方案
$highestColumn = $sheet->getHighestColumn(); // 取得总列数 ++$highestColumn; for ($row = 5; $row <= ...