php 中的 9 个魔术方法

php 中的 9 个魔术方法

ID:1206907

大小:124.50 KB

页数:16页

时间:2017-11-08

php 中的 9 个魔术方法_第1页
php 中的 9 个魔术方法_第2页
php 中的 9 个魔术方法_第3页
php 中的 9 个魔术方法_第4页
php 中的 9 个魔术方法_第5页
资源描述:

《php 中的 9 个魔术方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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

2、其他任何方法在类中任何地方都可以声明,构造器也能像其他方法样继承。如果我们想到以前继承例子从介绍到oop,我们能添加构造方法到Animal类中,如:1classAnimal{23publicfunction__construct(){4$this->created=time();5$this->logfile_handle=fopen('/tmp/log.txt','w');6}78}现在我们创建一个类来继承Animal类-Penguin类!不添加任何属性和方法在Penguin类中,我们能申明并定

3、义它继承自Animal类,如:1classPenguinextendsAnimal{23}45$tux=newPenguin;6echo$tux->created;如果我们定义一个构造方法在Penguin类中,然后Penguin对象将会运行当它被实例化后。由于并没有构造方法,PHP会参考父类方法定义信息来使用它因此我们能覆盖父类方法,或者不,在我们的新类中-很便利。__destruct你发现文件句柄也是构造器一部分吗?当我们使用完一个对象时真不想把事情放一边,因此析构方法做着与构造方法相反的事情。

4、当对象被销毁时,析构方法会运行,或者明确的说当我们不再使用它时,php会为我们清理掉。Animal类中,我们的析构方法像这样,如:01classAnimal{0203publicfunction__construct(){04$this->created=time();05$this->logfile_handle=fopen('/tmp/log.txt','w');06}0708publicfunction__destruct(){09fclose($this->logfile_handle);

5、10}11}析构器让我们关闭任何额外的资源比如被使用过的对象。在php中由于我们有这样运行时间短的脚本(留意在更新的php版本中增强的垃圾回收机制),通常讨论内存溢出根本不需要。然而它仍是好的推行方法来清理而且总体上让程序运行起来更高效。__get这个魔术方法是一个非常灵巧的小技巧-它使实际上不存在的属性如同存在一半。让我们举个小企鹅的例子:01classPenguinextendsAnimal{0203publicfunction__construct($id){04$this->getPeng

6、uinFromDb($id);05}0607publicfunctiongetPenguinFromDb($id){08//elegantandrobustdatabasecodegoeshere09}10}现在,如果我们的小企鹅有一个"name"属性,而在此之后加载的属性为"age",那么我们可以这样处理:1$tux=newPenguin(3);2echo$tux->name."is".$tux->age."yearsold";然而,设想一下,后端数据库或数据供应者发生了改变,"name"没

7、有了,变味了"username"。并且设想这是一个非常复杂的应用,而需要修改的调用"name"的地方非常多。我们可以使用__get方法,使得"name"属性如同存在一样:01classPenguinextendsAnimal{0203publicfunction__construct($id){04$this->getPenguinFromDb($id);05}0607publicfunctiongetPenguinFromDb($id){08//elegantandrobustdatabasec

8、odegoeshere09}1011publicfunction__get($field){12if($field=='name'){13return$this->username;14}15}这并不是编写整个系统的好方法,因为它会让调试工作变得更困难,但它是一个非常有价值的工具。它允许如同属性一样使用或者展示需要经过计算的数据,以及无数我都想不到的地方。__set那么,我们将所有对$this->name的调用都更改为返回$this->username的值,那么,如果我们想要设置这

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。