浅谈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 相关文章推荐
Zend 输出产生XML解析错误
Mar 03 PHP
php网上商城购物车设计代码分享
Feb 15 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
解析php中的escape函数
Jun 29 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
Jul 05 PHP
PHP数据过滤的方法
Oct 30 PHP
YII Framework框架教程之缓存用法详解
Mar 14 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 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
第三节--定义一个类
2006/11/16 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
js实现导航栏中英文切换效果
2017/01/16 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
Python实现截屏的函数
2015/07/25 Python
python+Django+apache的配置方法详解
2016/06/01 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python模块导入的细节详解
2018/12/10 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
Ajax的工作原理
2015/12/04 面试题
办公室内勤工作职责
2013/12/11 职场文书
出租房屋协议书
2014/09/14 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书