浅谈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 DOS攻击实现代码(附如何防范)
May 29 PHP
PHP实现微信公众平台音乐点播
Mar 20 PHP
destoon复制新模块的方法
Jun 21 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
PHP7新功能总结
Apr 14 PHP
在laravel中实现事务回滚的方法
Oct 10 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生成zip压缩文件的方法详解
2013/06/09 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
php的4种常见运行方式
2015/03/20 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
javascript脚本调试方法小结
2008/11/24 Javascript
关于js类的定义
2011/06/28 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
python通过索引遍历列表的方法
2015/05/04 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
Python 实现一个简单的web服务器
2021/01/03 Python
交通专业个人自荐信格式
2013/09/23 职场文书
工程力学硕士生的自我评价范文
2013/11/16 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
MySQL表的增删改查(基础)
2021/04/05 MySQL
sql注入教程之类型以及提交注入
2021/08/02 MySQL
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android