PHP魔术方法__GET、__SET使用实例

阿橙
阿橙
发布时间:2026-10-15| 6人浏览过
原创

在 PHP 中,当对象访问不可见或未定义属性时会触发特殊方法,分别是用于读取的 __get() 和用于赋值的 __set()。下面通过一个具体的例子来演示这两个魔术方法的触发时机和使用方式。

准备代码环境

首先定义一个类 Example,包含不同权限控制的属性以及对应的魔术方法实现:

<?php
/**
 * 清晰的认识__get() __set()
 */
class Example {
    //公有的属性
    public $public = 'pub' ;
    //受保护的 - 子类中该属性可用
    protected $protected = 'pro';
    //私有的 - 只能此类使用此属性
    private $private = 'pri';
    
    //当访问对象中的属性不存在或者非公有属性的时候自动加载__get()方法
    public function __get($name){
        return '调用__get()方法:'.$name;
    }
    
    //当给对象的一个属性赋值的时候如果该属性不存在或者是非公有属性则自动加载__set()方法
    public function __set($name,$value){
        echo "\nname:".$name.',value:'.$value."\n";
    }
}

测试属性访问

接下来,实例化该对象并尝试访问和修改各个属性:

  1. 读取公有属性:直接读取 $example->public。
  2. 读取受保护和私有属性:由于外部不可直接访问,会触发 __get()。
  3. 读取不存在的属性:如 $example->other,也会触发 __get()。
  4. 设置非公有或新属性:为 protected、private 和非存在的 other 赋值,均触发 __set()。

完整的测试代码如下:

$example = new Example;
echo '<pre>';
echo $example->public."\n";
echo $example->protected."\n";
echo $example->private."\n";
echo $example->other."\n";
echo '<hr>';
$example->public = 'lic';   //这个赋值成功所有没有显示
$example->protected = 'tec';
$example->private = 'vat';
$example->other = 'er';
echo '<br/>';
echo '打印 public 属性:'.$example->public;

运行结果分析

执行上述代码后,得到的输出结果为:

pub
调用__get()方法:protected
调用__get()方法:private
调用__get()方法:other

name:protected,value:tec
name:private,value:vat
name:other,value:er

打印 public 属性:lic

可以看到:

  • 直接输出:pub 是公有属性的原始值;lic 是被成功重写的公有属性值。
  • __get() 触发:由于 protected、private 和 other(不存在)在类外部不可直接访问,所以调用了自定义的 __get() 方法,返回了相应的提示信息。
  • __set() 触发:对 protected、private 和非存在的 other 进行赋值时,由于不符合公共访问规则,触发了 __set() 方法,输出了属性名和新的值。

总结

在 PHP 开发中,理解并使用 __get() 和 __set() 可以帮助你对对象的属性进行更灵活的管理,比如在数据验证、动态属性映射或简化 API 接口时使用。以上就是 PHP 魔术方法 __get() 和 __set() 的使用实例详细内容,更多关于 PHP 动态属性操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。