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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
CodeIgniter中实现泛域名解析
Jul 19 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
php表单习惯用的正则表达式
Oct 11 PHP
PHP实现微信提现功能
Sep 30 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
IIS6的PHP最佳配置方法
2007/03/19 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
使用Python开发windows GUI程序入门实例
2014/10/23 Python
python中requests模块的使用方法
2015/04/08 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
Python简单获取自身外网IP的方法
2016/09/18 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
如何通过python检查文件是否被占用
2020/12/18 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
教师自荐书
2013/10/08 职场文书
煤矿班组长的职责
2013/12/25 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
商场中秋节广播稿
2014/01/17 职场文书
个人查摆剖析材料
2014/02/04 职场文书
办公室岗位职责
2014/02/12 职场文书
拓展训练激励口号
2014/06/17 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
商务邀请函
2015/01/30 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers