PHP类中的魔术方法(Magic Method)简明总结


Posted in PHP onJuly 08, 2014

1. __construct()和__destruct()

在实例被 创建/销毁 的时候被调用,都可以传递0个或多个参数。

class A
 {
  function A()
  {
   echo "build A";
  }

  function __destruct()
  {
   echo "destroy A";
  }
 }

 $obj = new A();
 //unset($obj);

Note:The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence.

关于构造函数,PHP5.3.3开始,一个定义在某个特定的命名空间里的class中以类名命名的方法将不再被认为是构造函数。在无命名空间的类中与原来一样依旧是构造函数。如:

namespace Foo;
class Bar {
  public function Bar() {
    // treated as constructor in PHP 5.3.0-5.3.2
    // treated as regular method as of PHP 5.3.3
  }
}

如果没有namespace Foo; 那么Bar()还将被当作构造函数。另外,如果存在下面的情况:

function __construct()
  {
   echo "construct A";
  }

  function A()
  {
   echo "build A";
  }

  function __destruct()
  {
   echo "destroy A";
  }
 }

即既包含__construct()又包含与类名同名的函数,那么将只调用__construct()。

2. __call()和__callStatic()

当尝试调用一个不存在的方法时调用该方法。两个参数,一个是方法名,一个是被调用方法的参数数组。

class MethodTest
{
  public function __call($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling object method '$name' "
       . implode(' ', $arguments). "<br>";
  }

  public static function __callStatic($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling static method '$name' "
       . implode(' ', $arguments). "<br>";
  }
}

$obj = new MethodTest;
$obj->runTest('in','object','context');
MethodTest::runTest('in','static','context');

其中,$arguments作为一个array传入。运行结果:

Calling object method 'runTest' in object context
Calling static method 'runTest' in static context

还要注意函数的作用域protected和private:

class TestMagicCallMethod {
  public function foo()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }

  public function __call($method, $args)
  {
    echo __METHOD__.PHP_EOL."<br>";
    if(method_exists($this, $method))
    {
      $this->$method();
    }
  }
  
  protected function bar()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }

  private function baz()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
}

$test  =  new TestMagicCallMethod();
$test->foo();
/**
 * Outputs:
 * TestMagicCallMethod::foo
 */

$test->bar();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::bar
 */

$test->baz();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::baz
 */

3.__get()和__set()

当试图读取一个对象并不存在的属性的时候被调用。

Note:我们可以用这个函数实现类似java中反射的各种操作。

class Test
{
  public function __get($key)
  {
   echo $key . " not exists";
  }
  public function __set($key,$value)
  {
   echo $key . " = ".$value;
  }
}

$t = new Test();
echo $t->name."<br>";
$t->name = "abc";

输出:
name not exists
name = abc

4. __toString()

 这个方法类似于java的toString()方法,当我们直接打印对象的时候回调用这个函数,函数必须返回一个string。

class Test
{
  private $name = "abc";
  private $age = 12;

  public function __toString()
  {
    return "name : $this->name, age : $this->age";
  }
}

$t = new Test();
echo $t;

输出:

name : abc, age : 12

PHP 相关文章推荐
十天学会php之第四天
Oct 09 PHP
PHP+MYSQL的文章管理系统(一)
Oct 09 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
Jun 17 PHP
php session劫持和防范的方法
Nov 12 PHP
php获取一个变量的名字的方法
Sep 05 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
Mar 15 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
PHP实现添加购物车功能
Mar 06 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 PHP
PHP的魔术常量__METHOD__简介
Jul 08 #PHP
PHP中的插件机制原理和实例
Jul 08 #PHP
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 #PHP
php去掉URL网址中带有PHPSESSID的配置方法
Jul 08 #PHP
PHP大批量插入数据库的3种方法和速度对比
Jul 08 #PHP
php发送get、post请求的6种方法简明总结
Jul 08 #PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 #PHP
You might like
上传多个文件的PHP脚本
2006/11/26 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
多广告投放代码 推荐
2006/11/13 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
python抓取网页图片示例(python爬虫)
2014/04/27 Python
python获取目录下所有文件的方法
2015/06/01 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
python cookie反爬处理的实现
2020/11/01 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
简历里的自我评价范文
2014/02/24 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
小学见习报告
2015/06/23 职场文书