Linfinity

Never say never.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

php魔术方法与类自动加载

Posted on 2018-12-29 22:49  Linfinity  阅读(577)  评论(0)    收藏  举报

什么是魔术方法?

概述:在面向对象编程中,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 函数

基本介绍

当我们希望将一个对象当做字符串来输出时,就会触发__toString魔术方法. 

 

l 代码说明

 

 

魔术方法之-__clone函数

基本介绍

当我们需要将一个对象完全的赋值一份, 保证两个对象的属性和属性值一样,但是他们的数据库空间独立,则可以使用对象克隆。 

 

l 案例说明

 

说明

(1) 当我们 $对象1 = clone $对象2, 会触发 __clone 方法

 

(2) 如果我们希望在克隆时,修改某个属性,则在__clone方法中去修改即可

 

(3) 如果我们希望阻止克隆,只需要将 __clone 魔术方法申明为private 即可.

 

 

 

魔术方法之-__call函数

基本介绍:

(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  高级方式(了解)来完成类的自动加载