php中有很多以两个下划线开头的方法,称之为,php下划线代码

  php中有很多以两个下划线开头的方法,称之为,php下划线代码

  命名规则

  添加一个为私有。

  添加两个一般都是系统默认,系统预定义,所谓:

  =====================

  魔术方法和魔术常数

  =====================

  带双下划线的PHP常量是“神奇常量”:

  __LINE__文件中的当前行号。

  __FILE__文件的完整路径和文件名。

  __DIR__文件所在的目录。如果在包含文件中使用,则返回包含文件所在的目录。它相当于dirname(__FILE__)。除非是根目录,否则目录中的名称不包括末尾的斜杠。

  注:以上内容来自《PHP中文手册-语言参考-常量-魔法常量》。

  从php5开始,php类可以使用神奇的方法。

  Php规定以两个下划线(_ _)开头的方法保留为魔法方法,所以建议函数名中不要以_ _开头,除非是为了重载现有的魔法方法。

  PHP中神奇的方法有:_ _ construct、_ _ destroy、_ _ call、_ _ call static、_ _ get、_ _ set、_ _ isset、_ _ unset、_ _ sleep、_ _ wake up、_ _ tostring、_ _ set _ state、_ _

  1、__get、__set

  这两个方法是为未在类及其父类中声明的属性设计的。

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

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

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

  2、_ _已设置、_ _未设置

  __isset( $property)当对未定义的属性调用isset()函数时,将调用此方法

  __unset( $property)当对未定义的属性调用unset()函数时,调用此方法

  像__get方法和__set方法一样,这里没有声明,包括调用对象时访问控制受保护的私有属性(即没有访问权限的属性)。

  3、打电话

  __call( $method,$arg_array)调用未定义的方法时,调用此方法。

  此处未定义的方法包括您无权访问的方法;如果该方法不存在,则在父类中查找,如果父类中不存在,则调用该类的__call()方?方法,如果该类中没有__call()方法,则转到父类中的__call()方法。

  4、_ _自动装载

  __autoload函数,当试图使用尚未定义的类时,将自动调用该函数。通过调用这个函数,脚本引擎在PHP失败之前有最后的机会加载所需的类。

  如果要定义一个全局自动加载类,必须使用spl_autoload_register()方法向PHP标准库注册处理类:

  ?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

  类装入器

  静态函数autoload_class($class_name)

  //找到正确的$class_name类,介绍一下。如果没有,抛出一个异常

  *设置对象的自动加载。

  * spl_autoload_register —将给定函数注册为__autoload()实现

  spl _ autoload _ register(array( Loader , autoload _ class ));

  $a=新测试();//不需要实现自动加载就可以实例化测试。许多框架使用这种方法来自动加载类。

  ?

  注意:catch语句块无法捕获__autoload函数中引发的异常并导致致命错误,因此应该在函数本身中捕获该异常。

  5、_ _构造、_ _破坏

  __construct构造方法,在创建对象时调用。与PHP4相比,使用这种方法的好处是可以让构造方法有一个唯一的名字,不管它所在的类的名字是什么。所以在更改类的名称时,不需要更改构造方法的名称。

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

  在函数的命名空间中,当函数返回时会发生这种情况。

  对于全局变量,这发生在脚本的末尾。

  如果要显式销毁一个对象,可以将任何其他值赋给指向该对象的变量。通常,变量被赋值为NULL或调用unset。

  6、克隆

  PHP5中的对象赋值是引用赋值。如果你想复制一个对象,你需要使用克隆方法。当您调用此方法时,对象将自动调用__clone magic方法。如果在复制对象时需要执行一些初始化操作,可以在__clone方法中完成。

  7、托字符串

  __toString方法会在对象转换为字符串时自动调用,例如使用echo打印对象时。

  如果类不实现此方法,则对象不能被echo打印,否则将显示:可捕获的致命错误:类test的对象不能在中转换为字符串。

  此方法必须返回一个字符串。

  在PHP 5.2.0之前,__toString方法只有在echo()或print()结合使用时才有效。在PHP 5.2.0之后,它可以在任何字符串环境中生效(例如,通过printf(),使用%s修饰符),但不能在非字符串环境中使用(例如,使用%d修饰符)。从PHP 5.2.0开始,如果将带有未定义__toString方法的对象转换为字符串,将会报告E_RECOVERABLE_ERROR错误。

  8、_ _睡眠、_ _醒来

  __sleep在序列化时使用。

  反序列化时调用__wakeup。

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

  使用__sleep的目的是关闭对象可能拥有的任何数据库连接,提交等待的数据或执行类似的清理任务。此外,如果有非常大的对象不需要完全存储,这个函数也很有用。

  相反,unserialize()检查具有神奇名称__wakeup的函数是否存在。如果存在,这个函数可以重建对象可能拥有的任何资源。

  使用__wakeup的目的是重建序列化过程中可能丢失的任何数据库连接,并处理其他重新初始化任务。

  9、__set_state

  调用var_export()时,会调用这个静态方法(PHP 5.1.0起生效)。

  此方法的唯一参数是一个数组,它包含以数组格式排列的类属性( property=value,…)。

  10 、_ _调用

  当您试图通过调用函数来调用对象时,会自动调用__invoke方法。

  PHP版本PHP5.3.0以上都可以。

  11、静态调用

  它的工作原理类似于__call()魔法方法。__callStatic()用于处理静态方法调用,

  PHP版本PHP5.3.0以上都可以。

  PHP确实加强了__callStatic()方法的定义;它必须是公共的,并且必须声明为静态的。类似地,__call()魔术方法必须定义为public,所有其他魔术方法也必须如此。

php中有很多以两个下划线开头的方法,称之为,php下划线代码