PHP 5.3的新增魔术方法

   


  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()魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。

时间: 2024-08-24 06:53:52

PHP 5.3的新增魔术方法的相关文章

PHP 5.3新增魔术方法__invoke概述_php技巧

PHP自从5.3版以来就新增了一个叫做__invoke的魔术方法,使用该方法就可以在创建实例后,直接调用对象.如下示例所示: class testClass { public function __invoke { print "hello world"; } } $n = new testClass; $n(); 执行结果为: hello world. php官方示例如下: class CallableClass { public function __invoke($x) { va

php魔术方法与魔术变量、内置方法与内置变量的深入分析_php技巧

php内置变量了:DIRECTORY_SEPARATORDIRECTORY_SEPARATOR是一个返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回/,而在linux或者类unix上反悔/,就是这么个区别,通常在定义包含文件路径或者上传保存目录的时候会用到.PHP 把所有以 __ (两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以   __ 为前缀. 1 . __construct()当实例化一个对象的时候,这个对象的构造方法将首先被调用:我们知道 p

PHP中关键字与魔术方法介绍

PHP中常用的关键字 final   1.final只能修饰类和方法,不能修饰成员属性   作用:使用修饰的类不能被继承,修饰的方法不能被覆盖 PHP 5 新增了一个 final 关键字.如果父类中的方法被声明为final,则子类无法覆盖该方法: 如果一个类被声明为 final,则不能被继承. Example #1 Final 方法示例  代码如下 复制代码 <?php class BaseClass {    public function test() {        echo "B

PHP的魔术方法

1.__get/__set:对对象属性的接管 2.__call/__callStatic:控制php对象方法的使用 3.__toString:将php对象转换成字符串 4.__invoke:将一个php对象当成函数来执行时来回调这个方法 class Object { protected $array = array(); function __set($key,$value) { var_dump(__METHOD__); $this->array[$key] = $value; } funct

MongoDB实战(2)工具集与特殊魔术方法

一.MongoDB启动方式 MongoDB除了支持命令行的启动方式还支持配置文件启动通过读取启动配置文件的方式来启动数据库比方说配置文件如下 则可以使用如下命令 ./mongod -f /etc/mongodb.conf MongoDB参数说明 dbpath: 数据文件存放路径每个数据库会在其中创建一个子目录用于防止同一个实例多次运行的mongod.lock也保存在此目录中. logpath 错误日志文件 logappend 错误日志采用追加模式默认是覆写模式 bind_ip 对外服务的绑定ip

PHP中的常见魔术方法功能作用及用法实例

  这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)__get()和.__set().__isset()等等魔术方法,需要的朋友可以参考下 概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发.这篇文章简单总结了PHP中提

PHP魔术方法的使用示例

  这篇文章主要介绍了PHP魔术方法的使用示例,本文分别讲解了__get.__set.__call.__callStatic.__toString. __invoke等魔术方法的使用,需要的朋友可以参考下 ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php 代码如下: define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_re

PHP中的魔术方法总结和使用实例

  这篇文章主要介绍了PHP中的魔术方法总结和使用实例,魔术方法是PHP面向对象中特有的特性,它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,需要的朋友可以参考下 魔术方法是PHP面向对象中特有的特性.它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法).魔术方法很多还是成对出现的,以下列出目前PHP中所有的模式方法. 1.__construct,__destruc

PHP中魔术方法的用法

  PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */ // __toString.__set.__get__isset().__unset() /* The __toString method allows a class to decide how it will react when it is converted to a string. __set() is run when writing