浅谈PHP中的面向对象OOP中的魔术方法


Posted in PHP onJune 12, 2017

一、什么是魔术方法:

PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数。
例如:

function __construct(){} 在new一个新对象时自动调用此函数

二、PHP中都有那些魔术方法,以及它们的作用:

1.__construct():构造函数,new对象时自动调用

eg:

class Person{
    public $name;
    public $age;
    
    function __construct($name,$age){
      $this->name=$name;
      $this->age=$age;
    }
}

 在new新的Person对象时会自动调用__construct()函数,将传入的参数分别赋给$name,$age。

2.__destruct():析构函数,当一个对象被销毁前自动调用

class Person{
    public $name;
    public $age;
    
    function __destruct(){
    echo "这个对象被销毁了";
  }
}

同上所述,对象被销毁时执行此魔术方法

3.__get():访问类中私有属性时自动调用,传递读取属性名,返回$this->属性名

class Person{
    private $name;
    public $age;
    
    function __get($name){
     return $this->$name;
    }
}

如上代码,$name被设为私有属性后不能直接通过$this->name;的方式读取,因此需要设置__get()魔术方法来读取。

4.__set():给类的私有属性赋值时自动调用,传递需设置的属性名,属性值

class Person{
    private $name;
    public $age;
    
    function __set($key,$value){
      $this->$key=$value;
    }
}

同__get()方法,私有属性不能通过$this->name="aaa";的方式直接设置,需要设置__set()方法,传入的参数分别是属性名和属性值。

5.__isset():使用isset检测对象私有属性时调用,传递检测的属性名,返回isset($this->属性名)

class Person{
    private $name;
    public $age;
    
    function __isset($name){
    return isset($this->$name);
  }
}

使用isset检测对象私有属性时调用,其他同上。

6.__unset():使用unset()函数删除对象私有属性时调用,传递删除的属性名,方法中执行unset($this->属性名)

class Person{
    private $name;
    public $age;
    
    function __unset($name){
      unset($this->$name);
    }
}

同上,在用unset()函数删除私有属性时调用。

7.__toString():使用echo打印对象时调用,返回打印对象时想要显示的内容,返回必须是字符串

class Person{
    public $name;
    public $age;
    
    function __toString(){
      $str = <<<str
      您要打印的内容是:<br>
      \$name=>{$this->name};<br>
      \$age=>{$this->age};<br>
str;
      return $str;
    }
}

使用echo打印对象时调用,返回打印对象时想要显示的内容。

8.__call():调用一个类中未定义的或未公开的方法时自动调用,传递被调用的函数名及参数列表

class Person{
    public $name;
    public $age;
    
    function __call($funcName,$funcParams){
      echo "您调用的函数{$funcName},参数列表";
      print_r($funcParams);
      echo "不存在/未公开";
    }
}
$zhangsan=new Person();
$zhangsan->say(1,2,3);

如代码所示,调用不存在的say(1,2,3);时,会打印

您调用的函数way,参数列表Array ( [0] => 123 ) 不存在

9.__clone():当使用clone关键字,克隆一个对象时自动调用,作用是为新克隆的对象初始化赋值

class Person{
    public $name;
    public $age;
    
    function __clone(){
    $this->name="lisi";
    }
}  
$zhangsan=new Person("zhangsan",24);
$lisi=clone $zhangsan;
echo $lisi->name;

打印出的结果是"lisi",而不是"zhangsan"。

10.__sleep():对象序列化时自动调用,返回一个数组,数组中的值就是可以序列化的属性

class Person{
    public $name;
    public $age;
    
   function __sleep(){
    return array("name","age");
  }
}

如上述代码,在用serialize()序列化对象时只有"name","age"属性会被序列化。

11.__wakeup():对象反序列化时自动调用,为反序列化新产生的对象进行初始化赋值

class Person{
    public $name;
    public $age;
    
   function __wakeup(){
    $this -> name = "lisi";
  }
}

将对象序列化后再反序列化,同时给对象的name属性赋初值为"lisi"。

12.__autolode():需要在类外部声明函数,当实例化一个未声明的类时自动调用,传递实例化的类名,可以使用类名自动加载对应的类文件。

function __autoload($className){
  include "class/".strtolower($className).".class.php";
}
  
$zhangsan=new Person();
$zhangsan->say();

如上述代码,Person类不存在时调用__autolode()方法,载入写在文件外的类,"class/".strtolower($className).".class.php";就是类文件的相对路径,$className就是

不在本文件中的类的类名,因此在创建外部类文件时命名方式必须是小写的类名.class.php。__autolode()方法也是惟一一个不用写在类中的魔术方法。

以上就是PHP中的魔术方法,合理利用这些方法可以轻松实现对象的各种操作。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP脚本的10个技巧(1)
Oct 09 PHP
第八节--访问方式
Nov 16 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
php内存缓存实现方法
Jan 24 PHP
PHP实用函数分享之去除多余的0
Feb 06 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
浅谈php中curl、fsockopen的应用
Dec 10 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
PHP中PDO事务处理操作示例
May 02 PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 #PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 #PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
Jun 11 #PHP
PHP中error_reporting函数用法详细介绍
Jun 11 #PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 #PHP
PHP获取文件扩展名的方法实例总结
Jun 10 #PHP
PHP获取数组中单列值的方法
Jun 10 #PHP
You might like
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
php简单生成随机数的方法
2015/07/30 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
Python json模块使用实例
2015/04/11 Python
jupyter安装小结
2016/03/13 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
关于Python数据结构中字典的心得
2017/12/04 Python
python中int与str互转方法
2018/07/02 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
django框架创建应用操作示例
2019/09/26 Python
pytorch forward两个参数实例
2020/01/17 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
园林毕业生自我鉴定范文
2013/12/29 职场文书
治安消防安全责任书
2014/07/23 职场文书
农村门前三包责任书
2014/07/25 职场文书
法定代表人授权委托书
2014/09/19 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
CSS3常见动画的实现方式
2021/04/14 HTML / CSS