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 相关文章推荐
用函数读出数据表内容放入二维数组
Oct 09 PHP
dedecms模板标签代码官方参考
Mar 17 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
PHP学习之数组的定义和填充
Apr 17 PHP
php缓存技术详细总结
Aug 07 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
Nov 22 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
PHP文件读取功能的应用实例
May 08 PHP
php二维码生成
Oct 19 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
基于swoole实现多人聊天室
Jun 14 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 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的ajax简单实例
2014/02/27 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
python 获取图片分辨率的方法
2019/01/08 Python
python创造虚拟环境方法总结
2019/03/04 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
机械系大学毕业生推荐信
2013/11/27 职场文书
国庆节活动总结
2014/08/26 职场文书
遗失说明具结保证书
2015/02/26 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
大学生党课心得体会
2016/01/07 职场文书
java设计模式--建造者模式详解
2021/07/21 Java/Android
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python