浅谈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部分常见问题总结
Mar 27 PHP
php学习之变量的使用
May 29 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
通过php添加xml文档内容的方法
Jan 23 PHP
typecho插件编写教程(一):Hello World
May 28 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
创建无限极分类树型结构的简单方法
Jun 20 PHP
PHP chr()函数讲解
Feb 11 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 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基础学习小结
2011/04/17 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php中spl_autoload详解
2014/10/17 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
angularJS结合canvas画图例子
2015/02/09 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
canvas绘制多边形
2017/02/24 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
详解Python if-elif-else知识点
2018/06/11 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
python Django的web开发实例(入门)
2019/07/31 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
消防安全员岗位职责
2014/03/10 职场文书
地震慰问信
2015/02/14 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server