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调用Java对象的方法
Oct 09 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
curl实现站外采集的方法和技巧
Jan 31 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
PHP curl模拟登录带验证码的网站
Nov 30 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 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技巧与注意事项分析
2011/02/03 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
yii添删改查实例
2015/11/16 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
python中几种自动微分库解析
2019/08/29 Python
如何使用python传入不确定个数参数
2020/02/18 Python
python交互模式基础知识点学习
2020/06/18 Python
Python基于template实现字符串替换
2020/11/27 Python
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
学校万圣节活动方案
2014/02/13 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
企业文明单位申报材料
2014/05/16 职场文书
安全宣传标语口号
2014/06/06 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年副班长工作总结
2014/12/10 职场文书
大二学年个人总结
2015/03/03 职场文书