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,所有其他魔术方法也必须如此。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。