`
guoyiqi
  • 浏览: 1009826 次
社区版块
存档分类
最新评论

PHP 5.3的新增魔术方法 __invoke

 
阅读更多

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象。

  class testClass

  {

  public function __invoke

  {

  print “hello world”;

  }

  }

  $n = new testClass;

  $n();

  执行结果为:

  hello world。

  官方示例

  

  class CallableClass

  {

  public function __invoke($x)

  {

  var_dump($x);

  }

  }

  $obj = new CallableClass;

  $obj(5);

  var_dump(is_callable($obj));

  ?>

  附:PHP其他魔术方法详解

  php中的类就可以使用魔术方法了。其规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。

  The function names __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state and__clone are magical in PHP classes. You cannot have functions with these names in any of your classes unless you want the magic functionality associated with them.

  这两个方法是为在类和他们的父类中没有声明的属性而设计的。

  ◆__get($property)当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名。

  ◆__set($property,$value)给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。

  这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。

  与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。

  这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方?法,如果本类中不存在__call()方法就去找父类中的__call()方法。

  __autoload函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在php出错失败前有了最后一个机会加载所需的类。

  注意:在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误,所以应该在函数本身做捕获。

  ◆__construct构造方法,当一个对象创建时调用此方法,相对于php4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称。

  ◆__destruct析构方法,php将在对象被销毁前(即从内存中清除前)调用这个方法。默认情况下,php仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存。当php决定你的脚本不再与对象相关时,析构函数将被调用。

  在一个函数的命名空间内,这会发生在函数return的时候。对于全局变量,这发生于脚本结束的时候。如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为null或者调用unset。

  php5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。

  __tostring方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时。

  在php5.2.0之前,__tostring方法只有结合使用echo()或print()时才能生效。php5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但不能用于非字符串环境(如使用%d修饰符)。从php5.2.0,如果将一个未定义__tostring方法的对象转换为字符串,会报出一个e_recoverable_error错误。

  ◆__wakeup反串行化的时候调用

  serialize()检查类中是否有魔术名称__sleep的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。

  使用__sleep的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

  PHP相反地,unserialize()检查具有魔术名称__wakeup的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用__wakeup的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

  当尝试以调用函数的方式调用一个对象时,__invoke方法会被自动调用。

  它的工作方式类似于__call()魔术方法,__callstatic()是为了处理静态方法调用。

  php确实加强了对__callstatic()方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call()魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

分享到:
评论

相关推荐

    PHP 5.3新增魔术方法__invoke概述

    从PHP 5.3版本开始,新增了一个名为__invoke的魔术方法,这是本文讲解的重点。 __invoke魔术方法主要用途是使对象能够以函数的方式调用。在PHP 5.3之前的版本中,对象本身不能像函数那样直接被调用。但在PHP 5.3及...

    PHP5.3最新版本

    5. **__callStatic() 方法**:此魔术方法允许类静态地调用未定义的方法,增加了代码的灵活性。 6. **菲尼克斯函数(__invoke())**:对象可以被当作函数调用,只要该对象定义了`__invoke()`方法,这对于创建可调用...

    Test_invoke_interface.rar_INVOKE.INVOKE_interface

    在这个场景中,"Test_invoke_interface.rar_INVOKE.INVOKE_interface" 的标题暗示我们正在处理一个关于测试调用接口的项目,它可能是一个单元测试用例,用于验证Linux环境下的某个接口功能。 描述中提到 "Test ...

    T_invoke_interface_1.rar_interface_invoke

    在Android的Dalvik虚拟机(或者现代的ART运行时)中,`invoke-interface`指令用于调用接口方法。这个操作码在Java字节码中扮演着重要的角色,特别是在多态性和面向接口编程的场景下。`T_invoke_interface_1.rar_...

    Invoke-and-BeginInvoke.rar_The Difference_invoke

    在Windows Forms或WPF等UI环境中,由于UI元素(如控件)只能在其创建的线程(即UI线程)中进行修改,因此,当需要在后台线程更新UI时,`Invoke`和`BeginInvoke`就显得尤为重要。这两个方法都是`Control`类的成员,...

    Invoke_test.rar_invoke_media player_player

    标题 "Invoke_test.rar_invoke_media player_player" 暗示了这是一个关于在编程环境中调用Windows Media Player进行测试的示例。这个压缩包可能包含了用于演示如何通过编程接口(API)或者脚本来启动和控制Windows ...

    Test_invoke_super_range.rar_Superclass

    这个主题在标题"Test_invoke_super_range.rar_Superclass"中得到了体现,它可能是一个测试示例,专注于演示如何使用"super"来调用超类的方法。描述中的"invoke method of superclass"进一步确认了这一点,它指的是...

    Invoke_objects_by_string.zip_invoke_objects

    在IT行业中,"Invoke objects by string"是一种编程技术,它涉及到动态调用对象的方法或属性。这种方法在某些情况下非常有用,比如在元编程、插件系统或者需要在运行时解析和执行代码的场景中。本篇文章将深入探讨这...

    Test_invoke_interface_range.rar_dx_interface

    在分析“Test_invoke_interface_range.java”时,我们将能看到如何实例化接口,如何调用其方法,以及如何使用测试框架的断言来验证结果。这将帮助我们了解接口的使用方式,以及它在“Dx”系统中的作用。 总结起来,...

    Test_invoke_super.rar_Superclass

    当我们谈论`Test_invoke_super.rar_Superclass`时,这可能是一个关于如何在Linux环境下通过源代码调用超类方法的示例。 `Test_invoke_super.c`这个文件名暗示了我们正在处理一个C语言编写的程序,虽然C语言本身并不...

    PSCI基本原理及应用场景介绍

    在PSCI的应用场景中,CPU的boot操作是通过PSCI call实现的,例如在Linux内核中,通过invoke_psci_fn_smc或者invoke_psci_fn_hvc调用PSCI函数,实现CPU的boot操作。在suspend操作中,PSCI也扮演着重要的角色,例如在...

    wap调用支付宝支付接口

    通常使用POST方法,请求体为JSON格式。 5. **接收响应**:支付宝服务器处理请求后,会返回一个包含二维码链接(二维码图片URL)的响应。这个链接可以直接在WAP页面上展示,用户扫描即可进行支付。 6. **处理回调与...

    PHP5.3 参考手册

    同时,对魔术方法(Magic Methods)进行了更新和补充,如`__invoke()`的实现,使得对象可以直接作为函数调用。 总而言之,《PHP5.3参考手册》是一份全面而详细的参考资料,无论你是初学者还是经验丰富的开发者,都...

    tag_invoke:我的C ++ 20实现tag_invoke,在WG21论文P1895R0中进行了描述

    在C++编程语言中,`tag_invoke`是一个重要的新特性,它被引入以提供一个更加灵活和可扩展的函数调用机制,特别是在元编程和模板元编程领域。这个概念最初在WG21(C++标准委员会)的工作论文P1895R0中提出,并在C++20...

    PHP面向对象程序设计__tostring()和__invoke()用法分析

    在PHP的面向对象程序设计中,__tostring()和__invoke()是两个重要的魔术方法。这两个方法在特定的操作下会被PHP引擎自动调用,它们提供了一种机制,允许对象像普通数据类型一样被处理。下面将详细介绍这两个魔术方法...

    AWS_Invoke-0.0.2-py3-none-any.whl.zip

    标题 "AWS_Invoke-0.0.2-py3-none-any.whl.zip" 暗示了这是一个与Amazon Web Services(AWS)相关的软件包,具体来说是用于调用AWS服务的一个Python库。描述中的内容同样重复了标题,进一步确认了这个压缩包包含了一...

Global site tag (gtag.js) - Google Analytics