`

php 魔术方法汇总

    博客分类:
  • PHP
阅读更多

从php5以后的版本,php的类就可以使用魔术方法了。

php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。
PHP中的魔术方法有 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone, __autoload
1、__get、__set
这两个方法是为在类和他们的父类中没有声明的属性而设计的
__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值
这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
2、__isset、__unset
__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)
3、__call
__call( $method, $arg_array ) 当调用一个未定义的方法是调用此方法
这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方​法,如果本类中不存在__call()方法就去找父类中的__call()方法

4、__autoload
__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
如果要定义一个全局的自动加载类,则必须用spl_autoload_register()方法将处理类注册到PHP标准库:

 

  1. <?php  
  2. class Loader  
  3. {  
  4. static function autoload_class($class_name)  
  5. {  
  6. //寻找正确的$class_name类,并引入,没有则抛出异常  
  7. }  
  8. }  
  9.   
  10. /**
  11. *   设置对象的自动载入
  12. *   spl_autoload_register — Register given function as __autoload() implementation
  13. */  
  14. spl_autoload_register(array('Loader', 'autoload_class'));  
  15.   
  16. $a = new Test();//Test没用require就实例化,实现自动加载,很多框架就用这种方法自动加载类  
  17.   
  18. ?>  
注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误,所以应该在函数本身做捕获。
5、__construct、__destruct
__construct 构造方法,当一个对象创建时调用此方法,相对于PHP4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存。当PHP决定你的脚本不再与对象相关时,析构函数将被调用。
在一个函数的命名空间内,这会发生在函数return的时候。
对于全局变量,这发生于脚本结束的时候。
如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
6、__clone
PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。
7、__toString
__toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时。
如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in
此方法必须返回一个字符串。
在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
__sleep 串行化的时候用
__wakeup 反串行化的时候调用
serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
9、__set_state
当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
10、__invoke
当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
PHP5.3.0以上版本有效
11、__callStatic
它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,
PHP5.3.0以上版本有效
PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此
====================================================================

PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。

 

1__construct()

当实例化一个对象的时候,这个对象的构造方法将首先被调用;

我们知道php5对象模型和类名相同的函数是类的构造函数,那么如果同时定义构造函数和__construc()方法的话,php5会默认调用__contruct()而不会调用同类名函数,所以__contruct()作为类的默认构造函数;

 

2__destruct()

析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

 

3__get(string $name)

当试图读取一个并不存在的属性时被调用;如果试图读取一个对象并不存在的属性的时候,php就会给出错误的信息。如果在类里添加__get方法,并且我们可以用这个函数实现类似java中的反射的各种操作。

 

4__set(string $name, mixed $value)

给未定义的变量赋值时将被调用

 

5__call(string $name, array $arguments)

当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。

__callStatic(string $name, array $arguments)

当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。

 

6__toString()

当打印一个对象的时候被调用,这个方法类似于javatoString方法,当我们直接打印对象的时候回调这个函数。

 

7__clone()

当对象被克隆时调用。

 

8__sleep()

serialize()函数会检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,导致 一个E_NOTICE错误。__sleep方法常用于提交未提交的数据,或类似的操作。同时,如果你有一些很大的对象,不需要保存,这个功能就很好用。

 

9__wakeup()

__sleep() 相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,预先准备对象数据。 __wakeup经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。


10__isset()

当对未定义的变量调用isset() empty()时,__isset() 会被调用。

 

11__unset()

unset一个对象的属性时被调用。如:unset($c->name)

 

12__set_state()

调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

 

13__autoload()

实例化一个对象时,如果对应的类不存在,则该方法被调用。简单的说就是类的自动加载;当你尝试使用一个PHP没有组织到的类, 它会寻找一个__autoload的全局函数. 如果存在这个函数,PHP会用一个参数来调用它,参数即类的名称。

 

14__invoke()

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

 

魔术常量:

__LINE__ 文件中的当前行号。 

__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。 

__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) = 

__FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 

__CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 

__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。 

__NAMESPACE__ 当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增) 

分享到:
评论

相关推荐

    php中的常用魔术方法汇总

    在PHP编程语言中,魔术方法是一组特殊命名的函数,它们在特定的上下文中自动调用,用于增强类的行为和属性处理。以下是PHP中的一些重要魔术方法及其详细解释: 1. **__construct()**: 构造函数在创建新对象时自动...

    PHP魔术方法使用方法汇总

    PHP魔术方法是面向对象编程中的特殊方法,它们在特定的时机被PHP自动调用。这些方法对PHP开发者来说非常有用,尤其是在需要对对象的行为进行额外控制时。下面是PHP魔术方法的详细解释和使用示例。 1. __construct和...

    最全的PHP面试题总汇

    3. PHP中的魔术方法(__construct、__destruct等)作用是什么? 4. 魔术方法__call和__callStatic的用途是什么? 八、PHP与数据库交互 1. mysqli和PDO是PHP的两种数据库连接方式,它们的区别在哪里? 2. SQL注入是...

    php设计模式案例汇总.zip

    在PHP中,可以使用`__clone`魔术方法实现对象的克隆。 7. 简单工厂模式:一个静态方法负责创建对象,客户只需要知道对象的类型,而无需知道如何创建。在PHP中,常用于创建简单的对象,如创建数据库连接对象。 8. ...

    PHP的十个高级技巧(TXT)

    2. **魔术方法**: PHP中的魔术方法如`__construct`, `__destruct`, `__call`, `__callStatic`等,可以在特定场景下自动执行,比如对象创建、方法调用等,为代码提供了更多的元编程能力。 3. **类型声明**: 自PHP 7...

    php中高级常用面试题,php中高级常用知识点面试题

    #### 七、PHP魔术方法与魔术变量 1. **魔术方法**:PHP中提供了一些特殊的方法,它们的名称以两个下划线(`__`)开头,这些方法可以在特定的情况下自动调用。 - **`__construct()`**:构造函数,在对象创建时自动...

    PHP面向对象 基础知识点汇总(代码+知识点+xmind思维导图)

    11. **魔术方法(Magic Methods)** - PHP提供了一系列以`__`开头的特殊方法,如`__construct`, `__destruct`, `__get`, `__set`等,它们在特定情况下自动调用。 12. **命名空间(Namespace)** - 命名空间用于...

    php常用函数总汇.pdf 高清

    ### PHP常用函数总汇 #### 变量处理 在PHP中,变量的处理非常重要,能够直接影响到程序的逻辑和性能。 - **`isset()`**:用于判断变量是否存在且不为`null`。如果变量存在且非`null`,则返回`true`;否则返回`...

    Php面试宝典100题汇总.doc

    ### PHP面试宝典100题汇总知识点解析 #### 1. Http与Https的区别 - **安全性**: HTTP采用明文传输,数据容易被截获;HTTPS则是基于SSL/TLS的安全协议,提供加密传输,保障了数据的安全性。 - **连接方式与端口**: ...

    PHP获取当前文件的父目录方法汇总

    本文将详细介绍两种方法来获取当前文件的父目录,并列出一些常用的PHP函数,帮助开发者更有效地处理路径和目录。 ### 方法一 首先,我们可以使用`dirname()`函数配合`__FILE__`魔术常量来获取当前文件的父目录。`__...

    PHP面试题,程序员面试参考资料

    - PHP魔术方法:如__construct, __destruct, __get, __set等。 6. **PHP与数据库交互** - PDO和MySQLi:对比这两种不同的数据库连接方式,理解预处理语句。 - SQL查询:掌握基本的SELECT, INSERT, UPDATE, ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    书名:《PHP开发实战1200例(第I卷)》(清华大学出版社.潘凯华.刘中华) PDF格式扫描版,全书分为5篇15章,共899页。2011年1月出版。 全书压缩打包成2部分,这是第1部分。 注:本系列图书的第I、II卷再版时均相应改名...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    书名:《PHP开发实战1200例(第I卷)》(清华大学出版社.潘凯华.刘中华) PDF格式扫描版,全书分为5篇15章,共899页。2011年1月出版。 全书压缩打包成2部分,这是第2部分。 注:本系列图书的第I、II卷再版时均相应改名...

    PHP面试-中国最佳实践::orange_book:PHP面试知识点汇总

    8. **PHP魔术方法**:如__construct、__destruct、__get、__set、__call等,它们在特定条件下自动调用,能帮助提升代码的灵活性和可维护性。 9. **命名空间**:用于组织代码,避免全局命名冲突,了解如何导入和使用...

    PHp面试荟萃

    标题中提到的“PHP面试荟萃”指的是对PHP程序员在面试中可能遇到的各类问题的汇总。描述中强调了这本合集包含了详细的答案和清晰的知识点,对面试准备很有帮助。标签“PHp面试荟萃”直接体现了这一主题。以下将结合...

    PHP5.3与5.5废弃与过期函数整理汇总

    5. `set_magic_quotes_runtime()` 和 `magic_quotes_runtime()`:魔术引号功能在PHP 5.3中被废弃,建议使用预处理语句或手动转义输入数据。 6. `session_register()`,`session_unregister()` 和 `session_is_...

Global site tag (gtag.js) - Google Analytics