浅谈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 MySQL 之间的关系
Jul 17 PHP
写php分页时出现的Fatal error的解决方法
Apr 18 PHP
深入分析php之面向对象
May 15 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php面象对象数据库操作类实例
Dec 02 PHP
微信公众平台开发实现2048游戏的方法
Apr 15 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
Laravel validate error处理,ajax,json示例
Oct 25 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
PHP实现多条件查询实例代码
2010/07/17 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
php实现的简单日志写入函数
2015/03/31 PHP
分享php分页的功能模块
2015/06/16 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
半角全角相互转换的js函数
2009/10/16 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
Python中tell()方法的使用详解
2015/05/24 Python
理解python中生成器用法
2017/12/20 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
什么是python类属性
2020/06/10 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
标记环介质访问控制协议
2016/03/27 面试题
物业保安主管岗位职责
2013/12/25 职场文书
平面设计求职信
2014/03/10 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
银行授权委托书样本
2014/10/13 职场文书
机械生产实习心得体会
2016/01/22 职场文书
Python基础 括号()[]{}的详解
2021/11/07 Python