浅谈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学习之PHP运算符
Oct 09 PHP
PHP4实际应用经验篇(7)
Oct 09 PHP
php 远程关机操作的代码
Dec 05 PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
Apr 29 PHP
php对称加密算法示例
May 07 PHP
PHP生成不重复随机数的方法汇总
Nov 19 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
6个超实用的PHP代码片段
Aug 10 PHP
PHP生成加减算法方式的验证码实例
Mar 12 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/10/09 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
php fread读取文件注意事项
2016/09/24 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
浅析node.js中close事件
2014/11/26 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
python更新列表的方法
2015/07/28 Python
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
创业计划书撰写原则
2014/01/25 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
最新离婚协议书范本
2014/08/19 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
2022漫威和DC电影上映作品
2022/04/05 欧美动漫