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下使用无限生命期Session的方法
Mar 16 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
Apr 17 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
基于PHP常用文件函数和目录函数整理
Aug 17 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
php进行md5加密简单实例方法
Sep 19 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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/10/09 PHP
全文搜索和替换
2006/10/09 PHP
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
在python中安装basemap的教程
2018/09/20 Python
Python3中exp()函数用法分析
2019/02/19 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
python实现宿舍管理系统
2019/11/22 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
六道php面试题附答案
2014/06/05 面试题
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
求职自我评价范文100字
2014/09/23 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
教师节祝酒词
2015/08/11 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL