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;那么这个接口还能做什么,有哪些应用场景,下篇文章继续讲
应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...
<?php /** * @throws Exception */ function curl() { throw new \Exception('err...
posix_ttyname - 获取当前终端设备名称。<?php var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...
PHP简单定时器可以通过pcntl_signal创建闹钟信号来实现。但是缺点很明显,性能一般,要自己实现守护进程,不支持毫秒级定时器,单进程不支持多个闹钟信号,不能跨平台运行event扩展支持的事件多,性能高。<?php //创建event配置.[空配置] $eventConfig ...
文章篇幅较长,如果不喜欢看文章的,此处抛出韩顺丰老师的位运算视频,韩老师应该是全网讲php位运算符最详细的一个老师了。链接:https://pan.baidu.com/s/14xj7er8eVSUcJ-jYXyA0GA 提取码:731m 链接:https://pan.baidu.com...
(1).今天遇到一件奇怪的事情,在event事件中是无法自定义异常处理,例如我们使用set_exception_handler来统一处理异常。例如下面的代码:<?php error_reporting(E_ALL); set_error_handler(function ($errn...