php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。
(1).创建一个学生类,并且实现arrayaccess 接口。
<?php class student implements ArrayAccess { public $name = '小美'; private $age = 17; public function offsetExists($offset) { // TODO: Implement offsetExists() method. } public function offsetGet($offset) { // TODO: Implement offsetGet() method. } public function offsetSet($offset, $value) { // TODO: Implement offsetSet() method. } public function offsetUnset($offset) { // TODO: Implement offsetUnset() method. } } //实例化一个学生小美 $student = new student(); //用对象的方式去访问学生姓名 echo $student->name.PHP_EOL; //用对象的方式给学生重新起名字 $student->name = '小茜'; //用对象的方式去访问学生姓名 echo $student->name,PHP_EOL;
上面是个很简单的类,初始化这个学生叫小美,然后通过对象的方式去访问和修改对象的属性,修改了学生的姓名。以上代码分别输出:
小美 小茜
(2).既然这里要讲以数组的方式访问对象,那就来试试数组访问对象属性,访问学生的姓名
class student implements ArrayAccess { public $name = '小美'; private $age = 17; public function offsetExists($offset) { // TODO: Implement offsetExists() method. } public function offsetGet($offset) { var_dump($offset); } public function offsetSet($offset, $value) { // TODO: Implement offsetSet() method. } public function offsetUnset($offset) { // TODO: Implement offsetUnset() method. } } //实例化一个学生小美 $student = new student(); //数组方式访问学生的姓名 echo $student['name'];
我们直接输出$student['name']人家并没有输出学生小美的名字,而是调用内部的offsetGet方法,并将我传递的name下标传递进去。也就是说实现了ArrayAccess接口的类,如果用数组的方式访问对象,PHP底层先会调用offsetGet方法,并且将数组的下标传递进去。那么问题来了,我怎么用数组的方式去获取学生的名字呢?其实PHP只提供了我们访问数组形式访问对象的能力,但是具体的实现要我们来实现。如果真的只是简单的用数组形式访问对象,那么我们完全可以通过方法将对象转换为数组。PHP仅仅只提供我们这个能力,实现交由我们开发者,发挥的空间更大。完全可以自定义。
(3)通过上面我们知道一个类实现了ArrayAccess接口,当用数组形式访问它,它会自动调用offsetGet方法,那么用数组形式赋值,它就应该会调用offsetSet方法,使用empty方法检测数组的key是否存在,它就应该会自动调用offsetExists方法,使用unset方法删除数组的key是否存在,它就应该会自动调用offsetUnset方法,
class student implements ArrayAccess { public $name = '小美'; private $age = 17; public function offsetExists($offset) { return property_exists('student', $offset); } public function offsetGet($offset) { return $this->$offset; } public function offsetSet($offset, $value) { $this->$offset = $value; } public function offsetUnset($offset) { $this->$offset = ''; } } //实例化一个学生小美 $student = new student(); //数组方式访问学生的姓名 echo $student['name'].PHP_EOL; //数组方式重新给学生起名字,改年龄 $student['name'] = '小倩'; $student['age'] = 12; //数组方式访问姓名和年龄 echo $student['name'].PHP_EOL; echo $student['age'].PHP_EOL;
那么这个接口还能做什么,有哪些应用场景,下篇文章继续讲
因为一个TP项目中客户需要全部网页分享支持自定义图片和描述信息,于是自己封装了下 //share()微信分享链接 //参数1 appid //参数2 appsert //参数3 nonceStr随机码 //参数4 timestamp时间戳 public&nb...
<!doctype html> <html> <head> <meta charset="utf-8"> <title>demo</title> </head> <bod...
md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...
主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /** * 订单任务 */ class Order { &n...
在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...