php中Magic methods的用法总结

  • 时间:
  • 2627人关注

有些东西如果不是经常使用,很容易忘记,比如魔术方法和魔术常量,这篇文章主要介绍了php魔术方法(Magic methods)的使用方法,感兴趣的小伙伴们可以参考一下,另外这篇文章主要知识点是关于php、魔术方法、Magic、methods、php的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

教程详情电子资料
  • 教程类别:php
  • 编辑整理:江胜花
  • 教程字数:3784字节
  • 阅读时间:大概6分钟
  • 下载本教程(DOC版)
  • PHP编程从入门到实践
  • Magic Enhancer
  • Magic Actions for YouTube™
  • php与java所需jar包
  • PHP7实践指南:O2O网站与App后台开发
  • PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:

    • __construct(),类的构造函数
    • __destruct(),类的析构函数
    • __call(),在对象中调用一个不可访问方法时调用
    • __callStatic(),用静态方式中调用一个不可访问方法时调用
    • __get(),获得一个类的成员变量时调用
    • __set(),设置一个类的成员变量时调用
    • __isset(),当对不可访问属性调用isset()或empty()时调用
    • __unset(),当对不可访问属性调用unset()时被调用。
    • __sleep(),执行serialize()时,先会调用这个函数
    • __wakeup(),执行unserialize()时,先会调用这个函数
    • __toString(),类被当成字符串时的回应方法
    • __invoke(),调用函数的方式调用一个对象时的回应方法
    • __set_state(),调用var_export()导出类时,此静态方法会被调用。
    • __clone(),当对象复制完成时调用

    __construct()和__destruct()

    构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭

    <?php 
    class FileRead
    {
     protected $handle = NULL;
    
     function __construct(){
      $this->handle = fopen(...);
     }
    
     function __destruct(){
      fclose($this->handle);
     }
    }
    ?>
    
    

    这两个方法在继承时可以扩展,例如:

    <?php 
    class TmpFileRead extends FileRead
    {
     function __construct(){
      parent::__construct();
     }
    
     function __destruct(){
      parent::__destruct();
     }
    }
    ?>
    
    

    __call()和__callStatic()

    在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variable functions)调用中可能会用到。

    <?php
    class MethodTest 
    {
     public function __call ($name, $arguments) {
      echo "Calling object method '$name' ". implode(', ', $arguments). "\n";
     }
    
     public static function __callStatic ($name, $arguments) {
      echo "Calling static method '$name' ". implode(', ', $arguments). "\n";
     }
    }
    
    $obj = new MethodTest;
    $obj->runTest('in object context');
    MethodTest::runTest('in static context');
    ?>
    
    

    __get(),__set(),__isset()和__unset()

    当get/set一个类的成员变量时调用这两个函数。例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量

    <?php 
    class MethodTest
    {
     private $data = array();
    
     public function __set($name, $value){
      $this->data[$name] = $value;
     }
    
     public function __get($name){
      if(array_key_exists($name, $this->data))
       return $this->data[$name];
      return NULL;
     }
    
     public function __isset($name){
      return isset($this->data[$name])
     }
    
     public function unset($name){
      unset($this->data[$name]);
     }
    }
    ?>
    
    

    __sleep()和__wakeup()

    当我们在执行serialize()和unserialize()时,会先调用这两个函数。例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:

    <?php
    class Connection 
    {
     protected $link;
     private $server, $username, $password, $db;
    
     public function __construct($server, $username, $password, $db)
     {
      $this->server = $server;
      $this->username = $username;
      $this->password = $password;
      $this->db = $db;
      $this->connect();
     }
    
     private function connect()
     {
      $this->link = mysql_connect($this->server, $this->username, $this->password);
      mysql_select_db($this->db, $this->link);
     }
    
     public function __sleep()
     {
      return array('server', 'username', 'password', 'db');
     }
    
     public function __wakeup()
     {
      $this->connect();
     }
    }
    ?>
    
    

    __toString()

    对象当成字符串时的回应方法。例如使用echo $obj;来输出一个对象

    <?php
    // Declare a simple class
    class TestClass
    {
     public function __toString() {
      return 'this is a object';
     }
    }
    
    $class = new TestClass();
    echo $class;
    ?>
    
    

    这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

    __invoke()

    调用函数的方式调用一个对象时的回应方法。如下

    <?php
    class CallableClass 
    {
     function __invoke() {
      echo 'this is a object';
     }
    }
    $obj = new CallableClass;
    var_dump(is_callable($obj));
    ?>
    

    __set_state()

    调用var_export()导出类时,此静态方法会被调用。

    <?php
    class A
    {
     public $var1;
     public $var2;
    
     public static function __set_state ($an_array) {
      $obj = new A;
      $obj->var1 = $an_array['var1'];
      $obj->var2 = $an_array['var2'];
      return $obj;
     }
    }
    
    $a = new A;
    $a->var1 = 5;
    $a->var2 = 'foo';
    var_dump(var_export($a));
    ?>
    
    

    __clone()

    当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。

    <?php 
    public class Singleton {
     private static $_instance = NULL;
    
     // 私有构造方法 
     private function __construct() {}
    
     public static function getInstance() {
      if (is_null(self::$_instance)) {
       self::$_instance = new Singleton();
      }
      return self::$_instance;
     }
    
     // 防止克隆实例
     public function __clone(){
      die('Clone is not allowed.' . E_USER_ERROR);
     }
    }
    ?>
    
    

    魔术常量(Magic constants)

    PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。

    • __LINE__,文件中的当前行号
    • __FILE__,文件的完整路径和文件名
    • __DIR__,文件所在的目录
    • __FUNCTION__,函数名称
    • __CLASS__,类的名称
    • __TRAIT__,Trait的名字
    • __METHOD__,类的方法名
    • __NAMESPACE__,当前命名空间的名称

    这些魔术常量常常被用于获得当前环境信息或者记录日志。

    以上就是本文的全部内容,希望对大家的学习有所帮助。


    上一篇:Yii2实现ajax上传图片的实例内容

    下一篇:PHP面试关于算法问题整理

    相关内容

    • 学了java可以自学PHP吗

      会不会JAVA都可以自学PHP,PHP完全可以零基础入门,会JAVA(其实任何一门语言)对学习PHP是有帮助的。只要你意志力够,自学入门还是不成问题的,想深入还是需要项目经验和公司的历练。 1、不管是PHP还是Java都是不错的选择,目前来说这两种语言都还处在势头上,但是从长远出发还是Java好,毕竟从性能、处理数据各方面来看还是Java有优势一些,当然最终选择还是在你自己的手里。PHP入门相对JAVA简单。深入的话其实也不浅。入门比JAVA好入门一些,语法

      12-08学了java能自学PHP吗

      阅读更多
    • php与java关系大吗

      php与java可以说是没有什么关系,关系就是同样都是编程语言。目前来说java的钱还有前景都是很好的~但是相对于php来说这是条艰难险阻的路,java会比php的结构复杂还有涉及方面都比较广,要学得好的话需要狠下苦工,php相对而言入门的门槛比较低,即使没有语言基础还是有可能学得不错,php来讲主要都是做网站就是B/C端~也可以拿来做系统开发~如果你对生活质量要求高想要专研技术一味干下去的就选java没错~如果你觉得只要快点可以过上好点的生活还有

      12-03php与java有什么关系

      阅读更多
    • php接口和java接口的区别

      java和php接口的区别是:1、php接口中的抽象方法只能是public的,默认也是public权限;2、java中私有方法使用private修饰,供接口中的默认方法或者静态方法调用。

      11-30php接口和java接口区别是什么

      阅读更多
    • 学了Java会PHP吗

      学了java不等于会php,这是两种不同的语言,编程的事情没有投机取巧,目前要用哪个就专注哪种语言,不同的语言语法、函数上总归会有不同,但一旦你对某一种语言深入了(很难说达到精通),你在转换的时候会上手很快。专注网站开发的话,建议PHP,容易上手点。PHP相对于来说要简单点,学起要快一点,小公司开发多用PHP开发,如果你是转行,可以从PHP开始。 1、PHP是函数式语言,Java是面向对象语言,PHP和Java的差异还是相当大的。比如变量声明,

      11-26学了Java就会PHP吗

      阅读更多
    • 懂java还需要学php吗

      懂java不需要特意再去学php,因为java和php是两种语言是不同方面的应用。java更注重于企业及的开发。php主要是做网站的。当你学完java之后在想学php会感到会场简单的,特别是面向对象这块。多学点没坏处,但要是为了学java去学php,就有点画蛇添足了。PHP是一种解释执行的脚本语言,语法和C语言类似,易学易用,不懂电脑的非专业人员稍经学习也能使用PHP.而Java要先编译成Class文件,然后在Java虚拟机上执行,Java开发需要熟悉Java语法以及一些核心的架构,

      11-25会java还需要学php吗

      阅读更多
    • PHP编程入门与应用

      PHP编程入门与应用

      在近几年中,PHP已经发展成为世界上最为流行的Web平台,它运行在全球超过1/3的Web服务器上。PHP的发展不仅是数量上的,也是质量上的。越来越多的公司,包括全球500强榜上的公司都依靠PHP来

      大小:500 MBPHP编程

      点击下载
    • PHP5权威编程

      PHP5权威编程

      《PHP5权威编程》一书为大家全面介绍了PHP 5中的新功能、面向对象编程方法及设计模式,还分析阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制。希望能够帮助读者系统了解、熟练掌握PHP,大程度地挖掘PHP的潜力,以更低的成本搭建更加稳健、高效的PHP应用。

      大小:25.3 MBPHP5

      点击下载
    • PHP 7 编程实战

      PHP 7 编程实战

      PHP7挟很多的、强劲的新作用和小工具强劲而成,应用这种作用和小工具能够 提升编码,编写出比老PHP版本号程序流程速度相当快的程序流程。这书主要详细介绍了PHP7有关的高级PHP编程技术。

      大小:11.2 MBPHP7

      点击下载
    • PHP+MySQL动态网站开发从入门到精通

      PHP+MySQL动态网站开发从入门到精通

      《PHP+MySQL动态网站开发从入门到精通》本书循序渐进地介绍了PHP 7 MySQL 5.7开发动态网站的主要知识和技能,提供案例、课件、命令速查手册,让你看得懂、学得会、做得出,教你快速成为网站应用开发高手。

      大小:36.2 MB网站开发

      点击下载
    • 深入理解php:高级技巧、面向对象与核心技术(第3版)

      深入理解php:高级技巧、面向对象与核心技术(第3版)

      本书是一本帮助中初级PHP程序员修炼成为高级PHP程序员的书,也是一本让PHP程序员能更快、更好地进行应用开发的书,是PHP领域经典,PHPer修炼必读书,包含大量实用案例,极具可操作性,欢迎下载阅读

      大小:76 MBphp

      点击下载
    • Modern PHP

      Modern PHP

      本书让你会学到关于应用架构、规划、数据库、安全、测试、调试和部署方面的很好实践。如果你具有PHP基础知识,想提高自己的技能,不要错过这本书

      大小:28 MBPHP

      点击下载
    • PHP经典实例(第3版)

      PHP经典实例(第3版)

      PHP经典实例(第3版)介绍了专门为PHP 5.4和5.5修订的350个经典技巧,并提供了丰富的示例代码。可以免费使用,另外还讨论了如何解决问题以及这些解决方案为什么可行,希望会对大家有帮助

      大小:55.9 MBPHP

      点击下载
    • PHP从入门到精通(第4版)

      PHP从入门到精通(第4版)

      《php从入门到精通(第4版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用PHP进行网络开发应该掌握的各方面技术。《php从入门到精通(第4版)》共分4篇25章,

      大小:38.6 MBPHP入门

      点击下载
    • PHP项目开发全程实录(第4版)

      PHP项目开发全程实录(第4版)

      大小:70471 MB MPHP开发

      点击下载
    • Learning PHP设计模式

      Learning PHP设计模式

      本书是PHP设计模式的经典教程,让读者掌握更精巧的编程风格。本书利用大量浅显易懂的例子告诉你如何应用多种面向对象模式,并展示了这些模式在一些成熟的实际项目中的具体应用,欢迎免费下载

      大小:39.4 MBPHP编程

      点击下载

    学习笔记

    29小时42分钟前回答

    python中使用PythonMagick将图片转换成ico格式的方法总结

    使用python将图片格式转换为ico格式的示例 因为python打包的时候需要用到ico图片格式,网上看好的图片又没有ico,于是自己寻找了一下python转换图片格式的方法,彻底解决这个问题,以后就可以自己轻松实现转化了。 代码如下: Author:RobinQINotes:将图片转换为ico格式 # PythonMargick包可以到Unofficial Windows Binaries for Python Extension Packages下载import PythonMagick img = PythonMagick.Image(robin.jpg)# 这里要设置一下尺寸,不然会报ico尺寸异常错误img.sample(128x128)img.write(robin.ico) python使用PythonMagick将jpg图片转换成ico图片的方法 本文实例讲述了python使用PythonMagick将jpg图片转换成ico图片的方法。分享给大家供大家参考。具体分析如下……

    15小时15分钟前回答

    springboot+webmagic实现java爬虫jdbc及mysql实例代码

    前段时间需要爬取网页上的信息,自己对于爬虫没有任何了解,就了解了一下webmagic,写了个简单的爬虫。 一、首先介绍一下webmagic: webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),支持多线程抓取,分布式抓取,并支持自动重试、自定义UA/cookie等功能。 实现理念: Maven依赖: dependency groupIdus.codecraft/groupId artifactIdwebmagic-core/artifactId version0.7.3/version /dependency dependency groupIdus.codecraft/groupId artifactIdwebmagic-extension/artifactId version0.7.3/version /dependency dependency groupIdus.codecraft/groupId artifactIdwebmagic-extension/artifactId version0.7.3/version exclusions exclusion groupIdorg.slf4j……