浅谈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 相关文章推荐
phpmyadmin 常用选项设置详解版
Mar 07 PHP
服务器web工具 php环境下
Dec 29 PHP
php 随机排序广告的实现代码
May 09 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
PHP常见数组函数用法小结
Mar 21 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
PHP 文件上传限制问题
Sep 01 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载入页面时编码的方法
2014/07/29 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
javascript操作excel生成报表示例
2014/05/08 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
Python实现把xml或xsl转换为html格式
2015/04/08 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
Python中的 enum 模块源码详析
2019/01/09 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
大学活动邀请函
2014/01/28 职场文书
旅游个人求职信范文
2014/01/30 职场文书
演讲比赛策划方案
2014/06/11 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
深入理解go缓存库freecache的使用
2022/02/15 Golang
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫
spring boot实现文件上传
2022/08/14 Java/Android