文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解php中__set和__get方法及其应用场景

2023-05-14 20:47

关注

在PHP中,有两个非常有用的魔术方法(__set和__get),它们用来控制成员属性的读和写操作。本文将深入探讨这两个魔术方法的使用及其在PHP中的应用场景。

__set方法

当我们给一个不存在或不可访问的属性赋值时,PHP会自动调用__set方法。例如:

class Person {
    private $name;

    public function __set($key, $value) {
        if ($key == 'name') {
            $this->name = $value;
        }
    }
}

$person = new Person();
$person->name = 'Lucas';

在上面的例子中,我们创建了一个类Person,并在类中定义了一个私有属性$name。我们也定义了一个__set方法,它会根据传入的$key来判断要设置哪个属性的值。如果$key等于'name',则将传入的值赋给$name属性。

我们创建了一个$person对象并给它设置了name属性的值。由于该属性是私有的,因此我们无法直接访问它。但是,我们通过$person->name的方式给它赋值,实际上会自动调用__set方法。

__get方法

相比__set方法,__get方法更加常用。当我们尝试读取一个不存在或不可访问的属性的值时,PHP会自动调用__get方法。例如:

class Person {
    private $name;

    public function __get($key) {
        if ($key == 'name') {
            return $this->name;
        }
    }
}

$person = new Person();
echo $person->name;

在上面的例子中,我们定义了一个__get方法,它会根据传入的$key来判断要获取哪个属性的值。如果$key等于'name',则返回$name属性的值。

我们创建了一个$person对象并尝试读取它的name属性的值。由于该属性是私有的,因此我们无法直接访问它。但是,我们通过$person->name的方式获取它的值,实际上会自动调用__get方法。

应用场景

__set和__get方法可以被用来控制成员属性的读和写操作。这在代码中非常有用,特别是在需要对私有属性进行访问控制和数据验证的代码中。

以下是一个名为User的简单类,它使用__set和__get方法来控制用户的姓名和年龄属性的读写操作:

class User {
    private $name;
    private $age;

    public function __set($key, $value) {
        switch ($key) {
            case 'name':
                $this->setName($value);
                break;
            case 'age':
                $this->setAge($value);
                break;
        }
    }

    public function __get($key) {
        switch ($key) {
            case 'name':
                return $this->name;
                break;
            case 'age':
                return $this->age;
                break;
        }
    }

    private function setName($name) {
        if (!is_string($name)) {
            throw new InvalidArgumentException('name must be a string');
        }

        $this->name = $name;
    }

    private function setAge($age) {
        if (!is_int($age)) {
            throw new InvalidArgumentException('age must be an integer');
        }

        $this->age = $age;
    }
}

$user = new User();
$user->name = 'Lucas';
$user->age = 26;

echo $user->name;
echo $user->age;

在上面的例子中,我们创建了一个User类,并在它们实现了__set和__get方法。我们还定义了一个私有方法setName和setAge来检查用户输入的姓名和年龄属性的合法性。

当我们给name和age属性赋值时,会自动调用__set方法。在__set方法中,我们根据$key的值将赋值操作委托给setName或setAge方法来处理。

当我们尝试读取name和age属性时,会自动调用__get方法。在__get方法中,我们根据$key的值获取相应的属性值。

总结

__set和__get方法是PHP语言中的两个非常有用的魔术方法。它们可以被用来控制成员属性的读和写操作,特别是在需要对私有属性进行访问控制和数据验证的代码中。我们通过一些示例代码掌握了这两个方法的基本用法和应用场景,希望能对读者有所帮助。

以上就是详解php中__set和__get方法及其应用场景的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯