浅谈PHP中的面向对象OOP中的魔术方法

一、什么是魔术方法:

PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数。
例如:

function __construct(){} 在new一个新对象时自动调用此函数

二、PHP中都有那些魔术方法,以及它们的作用:

1.__construct():构造函数,new对象时自动调用

eg:

class Person{ public $name; public $age; function __construct($name,$age){ $this->name=$name; $this->age=$age; } }

在new新的Person对象时会自动调用__construct()函数,将传入的参数分别赋给$name,$age。

2.__destruct():析构函数,当一个对象被销毁前自动调用

class Person{ public $name; public $age; function __destruct(){ echo "这个对象被销毁了"; } }

同上所述,对象被销毁时执行此魔术方法

3.__get():访问类中私有属性时自动调用,传递读取属性名,返回$this->属性名

class Person{ private $name; public $age; function __get($name){ return $this->$name; } }

如上代码,$name被设为私有属性后不能直接通过$this->name;的方式读取,因此需要设置__get()魔术方法来读取。

4.__set():给类的私有属性赋值时自动调用,传递需设置的属性名,属性值

class Person{ private $name; public $age; function __set($key,$value){ $this->$key=$value; } }

同__get()方法,私有属性不能通过$this->name="aaa";的方式直接设置,需要设置__set()方法,传入的参数分别是属性名和属性值。

5.__isset():使用isset检测对象私有属性时调用,传递检测的属性名,返回isset($this->属性名)

class Person{ private $name; public $age; function __isset($name){ return isset($this->$name); } }

使用isset检测对象私有属性时调用,其他同上。

6.__unset():使用unset()函数删除对象私有属性时调用,传递删除的属性名,方法中执行unset($this->属性名)

class Person{ private $name; public $age; function __unset($name){ unset($this->$name); } }

同上,在用unset()函数删除私有属性时调用。

7.__toString():使用echo打印对象时调用,返回打印对象时想要显示的内容,返回必须是字符串

class Person{ public $name; public $age; function __toString(){ $str = <<<str 您要打印的内容是:<br> \$name=>{$this->name};<br> \$age=>{$this->age};<br> str; return $str; } }

使用echo打印对象时调用,返回打印对象时想要显示的内容。

8.__call():调用一个类中未定义的或未公开的方法时自动调用,传递被调用的函数名及参数列表

class Person{ public $name; public $age; function __call($funcName,$funcParams){ echo "您调用的函数{$funcName},参数列表"; print_r($funcParams); echo "不存在/未公开"; } } $zhangsan=new Person(); $zhangsan->say(1,2,3);

如代码所示,调用不存在的say(1,2,3);时,会打印

您调用的函数way,参数列表Array ( [0] => 123 ) 不存在

9.__clone():当使用clone关键字,克隆一个对象时自动调用,作用是为新克隆的对象初始化赋值

class Person{ public $name; public $age; function __clone(){ $this->name="lisi"; } } $zhangsan=new Person("zhangsan",24); $lisi=clone $zhangsan; echo $lisi->name;

打印出的结果是"lisi",而不是"zhangsan"。

10.__sleep():对象序列化时自动调用,返回一个数组,数组中的值就是可以序列化的属性

class Person{ public $name; public $age; function __sleep(){ return array("name","age"); } }

如上述代码,在用serialize()序列化对象时只有"name","age"属性会被序列化。

11.__wakeup():对象反序列化时自动调用,为反序列化新产生的对象进行初始化赋值

class Person{ public $name; public $age; function __wakeup(){ $this -> name = "lisi"; } }

将对象序列化后再反序列化,同时给对象的name属性赋初值为"lisi"。

12.__autolode():需要在类外部声明函数,当实例化一个未声明的类时自动调用,传递实例化的类名,可以使用类名自动加载对应的类文件。

function __autoload($className){ include "class/".strtolower($className).".class.php"; } $zhangsan=new Person(); $zhangsan->say();

如上述代码,Person类不存在时调用__autolode()方法,载入写在文件外的类,"class/".strtolower($className).".class.php";就是类文件的相对路径,$className就是

不在本文件中的类的类名,因此在创建外部类文件时命名方式必须是小写的类名.class.php。__autolode()方法也是惟一一个不用写在类中的魔术方法。

以上就是PHP中的魔术方法,合理利用这些方法可以轻松实现对象的各种操作。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-26 15:21:51

浅谈PHP中的面向对象OOP中的魔术方法的相关文章

浅谈云计算在大型企业研发信息化中的应用

本文讲的是浅谈云计算在大型企业研发信息化中的应用,[IT168 资讯]虽然IT行业对云计算(Clouding Computing)有不同的看法,但它仍然是近几年最热的IT词汇之一.究竟什么是云计算,它对我们所关注的企业研发信息化有何帮助呢? 比较通俗的说法,云计算就是硬件+软件+服务.这三者并不是简单的相加,对于研发信息化而言,云计算应该定义为,适应研发需求的硬件与软件合理搭配,并为研发提供易用.高效.低成本的信息服务. 对于企业内部来讲,"私有云"是现代企业研发信息化发展的趋势之一.

浅谈使用splice函数对数组中的元素进行删除时的注意事项_javascript技巧

使用splice函数对数组中的元素进行删除时的注意事项 删除值为c的元素: <script> var arr = new Array(); arr[0] = 'a'; arr[1] = 'b'; arr[2] = 'c'; arr[3] = 'c'; arr[4] = 'e'; for(var i=0; i<arr.length; i++){ if(arr[i] == 'c'){ arr.splice(i,1); i=i-1; // 必须对i减去1,否则后面的一个元素会被跳过去 } }

浅谈NT下Ring3无驱进入Ring0的方法

[原创]浅谈NT下Ring3无驱进入Ring0的方法 关键字:NT,Ring0,无驱   (测试环境:Windows 2000 SP4,Windows XP SP2. Windows 2003 未测试)   在NT下无驱进入Ring0是一个老生常谈的方法了,网上也有一些C代码的例子,我之所以用汇编重写是因为上次在 [原创/探讨]Windows 核心编程研究系列之一(改变进程 PTE) 的帖子中自己没有实验成功(其实已经成功了,只是自己太马虎,竟然还不知道 -_-b),顺面聊聊PM(保护模式)中的

浅谈php处理后端&amp;接口访问超时的解决方法_php技巧

[HTTP访问] 一般我们访问HTTP方式很多,主要是:curl, socket, file_get_contents() 等方法. 如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题. [ CURL 访问HTTP] CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等. CURL: curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括: *(重要) CU

浅谈html转义及防止javascript注入攻击的方法_javascript技巧

有的时候页面中会有一个输入框,用户输入内容后会显示在页面中,类似于网页聊天应用.如果用户输入了一段js脚本,比例:<script>alert('test');</script>,页面会弹出一个对话框,或者输入的脚本中有改变页面js变量的代码则会时程序异常或者达到跳过某种验证的目的.那如何防止这种恶意的js脚本攻击呢?通过html转义能解决这个问题. 一:什么是html转义? html转义是将特殊字符或html标签转换为与之对应的字符.如:< 会转义为 <> 或转义

浅谈HTTP使用BASIC认证的原理及实现方法_java

一.BASIC认证概述 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法.客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为anjuta,密码为:123456时,客户端将用

浅谈Symphony Spreadsheet在报表测试中的应用

报表测试中常见数据对比 在 ERP 和 BI 项目测试过程中,对报表数据进行校验是非常有必要的,常见的数据对比场 景如下:从系统导出的 Excel 格式的报表数据,然后再给一份业务数据的源数据,要求校验报表数据是否正确.报表的数据量 通常都非常庞大,这些数据通常都是通过聚合汇总以及其它逻辑运算得出的结果,源数据量也很大,源数据和报表数据的条数也 不一定相等,而且源数据通常会有很多张表,仅仅是通过肉眼观察源数据和报表数据是否一致,会导致测试工作量巨大,效率低 下,风险不易控制. 那么接下来就一起探

浅谈Linux环境下并发编程中C语言fork()函数的使用_C 语言

由fork创建的新进程被称为子进程(child process).fork函数被调用一次,但返回两次.子进程的返回值是0,而父进程的返回值则是新进程的进程ID.将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID.fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getpid以获得其父进程的进程ID. 使fork失败的两个主要原因是:系统中已经有了太多的进程,或者该实际用户ID的进程总数超过

浅谈如何在C#Winform程序中正确使用登录窗体

看到很多朋友在CSDN中发帖放分求"如何实现登录验证正确后弹出主窗体"的问题.关于这个问题的实现方法,一般很多人都是使用在登录窗体点击"登录"按钮后,通过后台数据验证正确后,把登录窗体隐藏,然后载入主窗体.还有一种做法是以上提问的这些人的一个不太对的一个实现办法(其实是无法实现的),他们的做法是点击"登录"按钮后,调用this.close()方法去把登录窗体关闭,然后实例化主窗体           frmMain dlg=new frmMain