浅谈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下HTTP Response中的Chunked编码实现方法
Nov 19 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
解读PHP中上传文件的处理问题
May 29 PHP
php代码检查代理ip的有效性
Aug 19 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 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/02/24 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
js实现上传图片及时预览
2016/05/07 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
微信小程序 五星评分的实现实例
2017/08/04 Javascript
vue组件学习教程
2017/09/09 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
Vue实现简易计算器
2020/02/25 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
Python FTP操作类代码分享
2014/05/13 Python
python多进程操作实例
2014/11/21 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python对excel文档的操作方法详解
2018/12/10 Python
django 读取图片到页面实例
2020/03/27 Python
竞争上岗演讲稿范文
2014/05/12 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL