浅谈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数据库连接类~~做成一个分页类!
Nov 25 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
php+mysql分页代码详解
Mar 27 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
Jun 26 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
php封装的图片(缩略图)处理类完整实例
Oct 19 PHP
php实现登陆模块功能示例
Oct 20 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PDO::getAttribute讲解
2019/01/28 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
编写简单的Python程序来判断文本的语种
2015/04/07 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
五好党支部事迹材料
2014/02/06 职场文书
创新比赛获奖感言
2014/02/13 职场文书
迎新晚会主持词
2014/03/24 职场文书
离婚案件上诉状
2015/05/23 职场文书
七年级生物教学反思
2016/02/20 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android