什么是魔术方法?
概述:在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利。PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发。这篇文章简单总结了PHP中提供的魔术方法。
魔术方法一览:
__set:设置私有属性值的时候调用 __construct:构造方法 __destruct:析构方法 __unset 触发时机:当销毁一个私有成员属性的时候调用 参数:属性名 __isset 触发时机:当判断一个私有成员属性是否被设置过时调用 参数:属性名 __invoke(了解) 触发时机:当将一个对象当作函数使用的时候被调用 参数:任意多个,调用时传递多少个这里就写多少个 __toString(了解) 触发时机:当echo一个对象的时候调用 参数:没有参数 返回值:返回一个字符串,该字符串就会被打印出来,这个字符串需要自己定制 __debugInfo(了解) 触发时机:当var_dump来打印这个对象的时候调用 参数:没有参数 返回值:返回一个自定义的数组,你想打印什么就打什么 __call 触发时机:当调用一个不存在的成员方法的时候触发 参数:方法名 参数数组
__clone
触发时机:对象克隆前被调用
参数:没有参数
__sleep
触发时机:对象被序列化前被调用
参数:没有参数
__wakeup
触发时机:对象反序列化前被调用
参数:没有参数
说明:
(1) 魔术方法都是系统提供,程序员使用即可.
(2) 所有的魔术方法,前面都是以 __ 开头的 _是两个下划线.
(3) 我们在自定义函数时,就不要使用 __开头了.
(4) 魔术方法是在满足某个条件(一会一个一个的说明)时,有系统自动的调用.
魔术方法之-__get 和 __set函数
l 基本的介绍
(1) 当程序员去使用不可以访问的属性时,系统就会调用__get方法.
(2) 不可以访问的属性指的是(1 . 该属性不存在 2. 直接访问了protected或者private属性)
(3) 当程序员去给不可以访问的属性直接赋值,系统就会调用__set方法
l 举例说明
需求是: 如果对象有一个成员变量是private、protectd的,我希望在在类的外部通过 : $对象名->变量名的方式来赋值和取值,怎么办?



魔术方法之-__isset 和 __unset函数
l 基本介绍
(1) 当对不可访问的属性进行了 isset($对象名->属性), empty($对象名->属性)操作,那么__isset函数就会被系统调用。
(2) 不可访问的属性 仍然和前面说的一样 。
(3) 当对不可访问的属性进行了 unset($对象名->属性), 那么__unset函数就会被系统调用
l 代码说明



//property_exists(对象名, 属性)
//1. 先判断该对象是否有这个属性,如果有则返回真.
//2. 如果该对象没有有这个属性, 则继续判断该对象对应的类是否定义过这个属性,如果定义过仍然返回真,否则才返回假
魔术方法之-__toString 函数
l 基本介绍:
当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法.
l 代码说明

魔术方法之-__clone函数
l 基本介绍 :
当我们需要将一个对象完全的赋值一份, 保证两个对象的属性和属性值一样,但是他们的数据库空间独立,则可以使用对象克隆。
l 案例说明



说明
(1) 当我们 $对象1 = clone $对象2, 会触发 __clone 方法
(2) 如果我们希望在克隆时,修改某个属性,则在__clone方法中去修改即可
(3) 如果我们希望阻止克隆,只需要将 __clone 魔术方法申明为private 即可.
魔术方法之-__call函数
l 基本介绍:
(1) 当我们调了一个不可以访问的成员方法时,__call魔术方法就会被调用.
(2) 不可以访问的成员方法的是指(1. 该成员方法不存在, 2. 成员方法是protected或者 private)
l 需求
我们就是希望,在类的外部直接调用不可访问的成员方法(private , protected).
l 案例说明


魔术方法之-__sleep函数,__wakeup函数
(1) serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
代码说明:
(2) 与之相反, unserialize() 会检查是否存在一个 __wakeup()方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
代码说明:


自动加载类 __autoload()函数
为什么使用自动加载?
看一个需求

说明
(1) 在我们的开发中, 一个类对应一个文件,其命名方式为 类名.class.php
(2) 在需要某个类时,通过 include 或者 require 引入即可.
(3) 问题请思考,如果一个文件使用到多个类,怎么办?
1.以前没有加载时代码如何书写?
include "Mysql.php";//引入MySQL类 include "Upload.php";//引入上传类 include "Form.php";//引入表单验证类
2.当你学完自动加载类时代码如何书写?

3.当需要导入的类不全在同一个目录下该如何自动入呢?

对应的代码

common.php 文件

使用spl_autoload_register 的高级方式(了解)来完成类的自动加载



浙公网安备 33010602011771号