PHP中的9个魔术方法_第1页
PHP中的9个魔术方法_第2页
PHP中的9个魔术方法_第3页
PHP中的9个魔术方法_第4页
PHP中的9个魔术方法_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、php 中的 9 个魔术方法这个标题有点牵强因为php有不只9种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始。它可能魔幻,但是并不需要魔杖。 这些魔术方法拥有者特殊的名字,以两个下划线开始,表示这些方法在php特定事件下将会被触发。这可能听起来有点自动魔法但是它真的很酷的,我们已经看过一个简单的例子在 ,即我们使用一个构造器-使用这个作为我们第一个例子_construct 构造器是一个魔术方法,当对象被实例化时它会被调用。在一个类声明时它常常是第一件做的事但是没得必要他也像其他任何方法在类中任何地方都可以声明,构造器也能像其他方法样继承。如果我们想到以前继承例子从介绍到oop,

2、我们能添加构造方法到animal 类中,如:1class animal2 3 public function _construct() 4 $this-created = time();5 $this-logfile_handle = fopen(/tmp/log.txt, w);6 7 8现在我们创建一个类来继承animal类 - penguin类!不添加任何属性和方法在penguin类中,我们能申明并定义它继承自animal类,如: 1class penguin extends animal 2 34 5$tux = new penguin;6echo $tux-created;如果我们定

3、义一个构造方法在penguin类中,然后penguin对象将会运行当它被实例化后。由于并没有构造方法,php 会参考父类方法定义 信息来使用它因此我们能覆盖父类方法,或者不,在我们的新类中-很便利。_destruct你发现文件句柄也是构造器一部分吗?当我们使用完一个对象时真不想把事情放一边,因此析构方法做着与构造方法相反的事情。当对象被销毁时,析构方法会运行,或者明确的说当我们不再使用它时,php会为我们清理掉。animal类中,我们的析构方法像这样,如:01class animal02 03 public function _construct() 04 $this-created = ti

4、me();05 $this-logfile_handle = fopen(/tmp/log.txt, w);06 07 08 public function _destruct() 09 fclose($this-logfile_handle);10 11析构器让我们关闭任何额外的资源比如被使用过的对象。在php中由于我们有这样运行时间短的脚本(留意在更新的php版本中增强的垃圾回收机制),通常讨论内存溢出根本不需要。然而它仍是好的推行方法来清理而且总体上让程序运行起来更高效。 _get这个魔术方法是一个非常灵巧的小技巧 - 它使实际上不存在的属性如同存在一半。让我们举个小企鹅的例子:01cl

5、ass penguin extends animal 02 03 public function _construct($id) 04 $this-getpenguinfromdb($id);05 06 07 public function getpenguinfromdb($id) 08 / elegant and robust database code goes here09 10现在,如果我们的小企鹅有一个 name 属性,而在此之后加载的属性为 age,那么我们可以这样处理:1$tux = new penguin(3);2echo $tux-name . is . $tux-age

6、. years oldn;然而,设想一下,后端数据库或数据供应者发生了改变,name没有了,变味了username。并且设想这是一个非常复杂的应用,而需要修改的调用name的地方非常多。我们可以使用 _get 方法,使得name属性如同存在一样:01class penguin extends animal 02 03 public function _construct($id) 04 $this-getpenguinfromdb($id);05 06 07 public function getpenguinfromdb($id) 08 / elegant and robust databa

7、se code goes here09 10 11 public function _get($field) 12 if($field = name) 13 return $this-username;14 15这并不是编写整个系统的好方法,因为它会让调试工作变得更困难,但它是一个非常有价值的工具。它允许如同属性一样使用或者展示需要经过计算的数据,以及无数我都想不到的地方。_set那么,我们将所有对 $this-name 的调用都更改为返回 $this-username的值,那么,如果我们想要设置这个值呢?也许我们有一个账户界面允许用户修改他们的名字。这时我们就需要 _set 方法的帮助了,举

8、例说明:01class penguin extends animal 02 03 public function _construct($id) 04 $this-getpenguinfromdb($id);05 06 07 public function getpenguinfromdb($id) 08 / elegant and robust database code goes here09 10 11 public function _get($field) 12 if($field = name) 13 return $this-username;14 15 16 17 public

9、 function _set($field, $value) 18 if($field = name) 19 $this-username = $value;20 21 22这样,我们就针对大量的调用伪造对象的属性,正如我说的,这并不是一个正统的方法,但却是一个很有用的技巧,值得记住。_call这里有两种近似的方法,我并没有单独列出来,而是一起说明。一个是 _call 方法,如果定义,它将在调用未定义过的方法时被调用;另一个是 _callstatic 方法,工作方式与第一个相同,但却是在调用未定义的静态方法时生效(php 5.3 加入).通常我使用 _call 进行友善的错误处理,这在需要别人

10、整合调用你的方法的库代码中非常有用。例如,如果一段脚本拥有一个企鹅对象,名为 $penguin ,它包含一个 $penguin-speak() 方法.假设 speak() 方法没有定义,那么正常情况下我们会看到:php fatal error: call to undefined method penguin:speak() in .通过定义 _call 方法,我们可以使用一些更友善的提示信息来代替 php 的错误提示:01class animal 0203class penguin extends animal 04 05 public function _construct($id) 06

11、 $this-getpenguinfromdb($id);07 08 09 public function getpenguinfromdb($id) 10 / elegant and robust database code goes here11 12 13 public function _get($field) 14 if($field = name) 15 return $this-username;16 17 18 19 public function _set($field, $value) 20 if($field = name) 21 $this-username = $va

12、lue;22 23 24 25 public function _call($method, $args) 26 echo unknown method . $method;27 return false;28 29这将捕获的错误并回应。在实际应用中,更合适的方法是依据你的需要纪录消息日志,将用户重定向,或者抛出一个异常,但概念是相同的。在这里你可以处理任何你需要处理的不当调用,你可以检测方法的名称,并一一处理例如,你可以同上面我们重命名属性一些样重命名方法。_sleep_sleep()方法会被调用当对象被序列化后,并允许你处理序列化。这有各种各样的程序,一个很好的例子如果一个对象包含某种类型

13、的指针,例如文件句柄或引用另一个对象。当对象被序列化然后解序列化,这些引用类型是无用的,因为这些类型的引用的目标可能不再存在或有效。因此,最好是来取消这些信息在存储它们之前。_wakeup_wakeup()是与_sleep()方法相反的,允许您更改对象解序列化的行为。和_sleep()一起使用,可以用来恢复被删除的句柄和对象当对象被序列化时。一个很好的例子程序是数据库句柄被取消设置当该项被序列化,然后恢复到当前配置中设置项目时,解序列化一个数据库句柄。_clone我们看过一个使用clone关键字的例子,在我的介绍从入门到oop的第二部分,创建对象的副本,而不是有两个变量指向同一个实际的数据。在

14、一个类中重写此方法,我们可以观察发生了什么当在对象上使用clone关键字时,。虽然这是不是我们每一天能遇到的,一个漂亮的用例是创建一个真正的单例模式通过添加private访问修饰符给这个方法。_tostring无疑把最好的始终留到最后,_tostring方法是一个非常方便的附加方法对于我们的工具包。该方法可以声明覆盖对象的行为,当作为一个字符串输出时,例如,当它被输出时。如果你想能输出对象到模板中,你可以使用此方法来控制输出结果。让我们再来看看在penguin类中: 01class penguin 02 03 public function _construct($name) 04 $this-species = penguin;05 $this-name = $name;06 07 08 public function _tostri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论