PHP以数组的形式使用对象属性 - 接口 ArrayAccess
标签搜索

PHP以数组的形式使用对象属性 - 接口 ArrayAccess

远航
2022-05-27 / 0 评论 / 24 阅读 / 正在检测是否收录...

接口介绍 - ArrayAccess

让你能以数组的形式访问对象的接口

接口实现
/**
 * 创建User类 实现ArrayAccess接口 必须实现 ArrayAccess接口的全部方法
 */
class User implements \ArrayAccess
{
    public $name = ''; // 姓名
    public $age = 0; // 年龄
    private $sex = ''; // 性别

    public function __construct($name, $age, $sex)
    {
        $this->name = $name;
        $this->age = $age;
        $this->sex = $sex;
    }

    /** 使用 isset方法时调用
         * @param mixed $offset 数组key
         */
    public function offsetExists($offset)
    {
        //return property_exists($this, $offset); // 这种写法 unset已定义的属性还是返回true
        return isset($this->$offset);
    }

    /** 数组取值时调用
         * @param mixed $offset 数组key
         */
    public function offsetGet($offset)
    {
        return $this->$offset;
    }

    /** 数组赋值时调用
         * @param mixed $offset 数组key
         */
    public function offsetSet($offset, $value)
    {
        $this->$offset = $value;
    }

    /** 使用 unset方法时调用
         * @param mixed $offset 数组key
         */
    public function offsetUnset($offset)
    {
        unset($this->$offset);
    }
}
使用效果
// 引入类文件
require 'User.php';
// 实例化并初始化熟悉值
$user = new User('李白', 108, '男');

var_dump($user->name); // 输出 "李白"
var_dump($user['name']); // 输出 "李白"

var_dump($user->age); // 输出 108
var_dump($user['age']); // 输出 108

var_dump(isset($user['name'])); // 输出 true
var_dump(isset($user['height'])); // 输出 false

unset($user['name']);
var_dump(isset($user['name'])); // 返回 false

$user['height'] = 178;
var_dump($user['height']); // 返回 178
var_dump(isset($user['height'])); // 返回 true

// 还能操作私有熟悉
var_dump($user['sex']); // 返回 男
总结

1

评论

博主关闭了当前页面的评论