PHP类,魔术方法

简介: 当调用var_dump函数时候,定义需要显示的属性列表 如果没有在对象上定义该方法,那么将显示所有公共、受保护和私有属性。

以下方法在 PHP 中被称为魔术方法(Magic methods)


__construct()
__destruct()
__call()
__callStatic()
__get()
__set()
__isset()
__unset()
__sleep()
__wakeup()
__toString()
__invoke()
__set_state()
__clone()
__debugInfo()


在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。 下面介绍每个方法的作用


__construct


构造函数,在实例化类的时候会隐式调用该方法,可以接收传参。如:


class A{
    public function __construct($size) {
        $this->maxSize = $size; // 做一些初始化设置等等
        echo $this->maxSize;
    }
}
new A(3);


如果有一个类B继承了上面的类A ,如


class B extends A{
    public function __construct($size) {
        echo "hello";
    }
}
new B(3);


在此例子中,不会设置和输出maxSize属性,只会输出hello。


因为在子类重写构造方法时,需要显式调用父类构造函数 parent::__construct()


注意


如果在A类的构造函数,不是写为public,而是private,则无法被子类继承使用。


__destruct


析构函数,当类被手动销毁,或者脚本结束时,gc回收触发。可以执行一些后置操作,比如删除临时目录下的文件。


注意


  • 哪怕脚本调用exit(),die() 类的析构函数也会被执行
  • 如果在析构函数中调用exit() 则该函数内部的逻辑后续不再执行


public __destruct()
{
    echo 1;
    exit();
    echo 2;// 不会输出
}


  • 与构造函数相同,子类继承后需要显式调用父类的析构函数
  • 试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。


__call


当调用一个对象中的不能用的方法的时候就会执行这个函数。有两个参数:


function __call($function_name, $args)


测试


class A{
    public function __call($funcname, $args){
        var_dump($funcname);
        var_dump($args);
    }
}
$a = new A();
$a->one();
$a->tow('一个参数');
// 以下是输出
/*
string(3) "one"
array(0) {
}
string(3) "tow"
array(1) {
  [0]=>
  string(12) "一个参数"
}
string(5) "three"
array(2) {
  [0]=>
  string(12) "一个参数"
  [1]=>
  string(12) "两个参数"
}
*/


__callStatic


跟__call一样,但是该函数触发的是调用的静态方法。


A::test();


__get


读取不可访问属性的值时,__get() 会被调用。 猜想:在thinkphp框架的ORM中,关联模型 先在Orders模型中设置大概如下的方法


// 本模型的user ,代表要关联Users模型的一个数据,本模型的u_id = Users模型的id
public function user()
{
    return $this->belongTo('Users', 'u_id', 'id');
}


当在程序中调用,因为本身的Orders模型没有该属性,所以会尝试是否有设置该关系的方法,有则调用,然后返回Users的信息。


$orders = Orders::get(1);
var_dump(orders->user);


__set


在给不可访问属性赋值时,__set() 会被调用。


__isset


当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。


__unset


当对不可访问属性调用 unset() 时,__unset() 会被调用。


__sleep


__wakeup


这两个魔术方法是 类的序列化 使用的,后续会有一篇专门的文章讲解。


__toString


__toString() 方法用于一个类被当成字符串时应怎样回应。 比如,在我们接入微信支付的时候,经常需要把参数排序、拼接成url格式 我们完全可以定义一个类,然后在toString魔术方法中,写明排序、转换为url格式的操作。


// 伪代码
$params = new SiamWechatParams();
$params->appid = '1';
$params->total_fee = 200;
// http请求
Curl::send(self::url, $params->__toString());
// 其他地方直接输出,不手动显式调用
echo $params;


__invoke


当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。


class A
{
    function __invoke($params) {
        var_dump($params);
    }
}
$obj = new A();
$obj(5);
var_dump(is_callable($obj));


__set_state


自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。


__clone


当对象复制完成时调用


__debugInfo


当调用var_dump函数时候,定义需要显示的属性列表 如果没有在对象上定义该方法,那么将显示所有公共、受保护和私有属性。

目录
相关文章
|
9月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
70 0
|
4月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
5月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
71 2
|
5月前
|
PHP
PHP中的面向对象编程:理解类与对象
本文将深入探讨PHP中面向对象编程的核心概念——类与对象。通过实例讲解,帮助读者更好地理解如何在PHP中运用OOP编写更高效、可维护的代码。
74 9
|
6月前
|
PHP 开发者
PHP中的面向对象编程:掌握类与对象的精髓
探索PHP的面向对象编程世界,本文将带你了解如何通过创建和操作类来实例化对象。我们将深入讲解类的声明、构造函数的使用以及继承和多态性的概念。准备好,让我们一起在代码的海洋中航行,揭开PHP对象编程的神秘面纱!
|
7月前
|
PHP
如何在PHP中创建一个自定义的观察者类?
【7月更文挑战第2天】如何在PHP中创建一个自定义的观察者类?
40 0
|
7月前
|
PHP
PHP中,你可以使用class关键字来定义一个类
【7月更文挑战第2天】PHP中,你可以使用class关键字来定义一个类
49 0
|
9月前
|
存储 监控 安全
PHP医院安全(不良)事件报告系统源码 vue2+element支持11大类不良事件上报、审核处理、分析改进
医院安全(不良)事件管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况,更好地掌握不良事件的发生趋势,为及时采取适当的管理措施和流程、制度改进提供了良好的量化依据。系统通过汇集不同类型事件的报告,从中分析出医院内部潜在的问题和风险,将发生的事故降到最低,从而保证病人安全和医护人员安全。
67 0
|
关系型数据库 MySQL 程序员
漏刻有时操作数据php类记录及筛选条件的写法
漏刻有时操作数据php类记录及筛选条件的写法
77 1
|
XML 移动开发 Shell
CTF中常用的php原生类总结
CTF中常用的php原生类总结
262 0