热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

探秘PHP中的魔术方法_PHP教程-php教程

探秘PHP中的魔术方法。在面向对象的编程中,PHP为我们提供很多魔术方法,灵活的使用这些魔术方法,可以简化我们在面向对象开发过程中的很多操作。在PHP中,
在面向对象的编程中,PHP为我们提供很多魔术方法,灵活的使用这些魔术方法,可以简化我们在面向对象开发过程中的很多操作。在PHP中,魔术方法通常都是以两个下划线(__)开头的。与PHP中的普通方法(方法也称函数)不同的是,魔术方法通常是在特定情况下由程序自动调用的,而普通方法通常是由我们手动调用的。魔术方法为我们提供了非常有用的功能,PHP中的魔术方法有很多,具体有哪些,大家可以参考下PHP的手册,在这里即可查看。在本篇文章中,我仅仅为大家简单介绍下一些常用的魔术方法。
一、准备工作
为了充分理解魔术方法的概念,我们就需要在代码中使用下这些魔术方法,只有概念性的东西,估计看过一遍也就忘了。所以这里我们需要先定义两个简单的类。
通常,我们习惯将每个类都定义在一个单独的文件中,类文件以”类名.class.php”的形式命名。这里我们定义两个简单的类一个是Device类,一个是Battery类。定义的两个类如下所示:
文件:Device.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Device{
public $name;
public $battery;
public $data=array();
public $connection;

protected function connect(){
$this->cOnnection='resource';
echo $this->name.'connected'.PHP_EOL;
}

protected function disconnect(){
$this->cOnnection=null;
echo $this->name.'disconnected'.PHP_EOL;
}
}
?>
文件:Battery.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Battery{
private $charge=0;

public function setCharge($charge){
$charge=(int)$charge;
if($charge<0){
$charge=0;
}else{
$charge=100;
}
$this->charge=$charge;
}

}
?>
在Device类中,定义了四个成员属性,分别是:name用来表示设备的名称,battery用来保存一个Battery对象,data被定义为数组,connection用来保存外外部资源的句柄。在该类中,同样定义了两个成员方法connect()和disconnect()分别用来建立和断开连接。
在Battery类中,仅仅定义了一个私有属性charge和一个成员方法setCharge()用来设置charge的值。
这里定义的两个类,并没有什么实际的用途,仅仅是为了使大家能够更好的理解PHP中的魔术方法。
二、构造函数和析构函数
构造函数和析构函数是在对象被创建和销毁时,由系统自动调用的。
1.构造函数:__construct()
__construct函数是目前为止被使用最多的魔术函数。当对象被创建的时候,我们可以在构造函数中进行任何的初始化操作,特别是对成员变量进行初始化操 作。可以为构造函数定义任意数量的参数。无论构造函数出于何种原因不能被正确执行,那么对象的创建就会失败。下面是在Device类中使用构造函数的例子。
1
2
3
4
5
6
public function __construct($name,Battery $battery){
//battery的值只能是由Battery类实例化的一个对象
$this->battery=$battery;
$this->name=$name;
$this->connect();
}
在这个构造函数中,我们为构造函数指定了两个形参,分别为成员属性name和battery赋值,同时在构造函数中还调用了该类的connect()函数。
注意:将构造函数声明为私有方法可以阻止程序在类外部直接创建该类的一个实例对象,这在实现设计模式的单例模式时很常用。
有了构造函数,我们可以像下面的代码一样实例化一个Device类的对象。
1 $device=new Device(&#39;iPhone&#39;,$battery);
2.析构函数:__destruct()
与构造函数相反,析构函数是在对象被销毁时由系统自动调用的。在类中定义构造函数的方式如下:
1
2
3
public function __destruct(){
$this->disconnect();
}
在这个析构函数中,在对象被销毁之前,析构器先调用了类中的disconnect()函数。
三、属性重载
根据PHP手册中的说明,PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。我们是通过魔术方法(magic methods)来实现的。
当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用,换句话说,当访问一个类中可访问的方法或属性时,重载方法不会被调用。所有的重载方法都必须被声明为 public。
1.__get()
当读取不可访问属性的值时,__get() 会被调用。
2.__set()
在给不可访问属性赋值时,__set() 会被调用。
3.__isset()
当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
4.__unset()
当对不可访问属性调用 unset() 时,__unset() 会被调用。
四、将对象转换为字符串:__toString()
在我们试图将对象当做一个普通字符串来对待时,__toString方法会被调用。比如,当我们打印一个对象时,就会自动调用该函数,如:echo $对象名,如果没有定义__toString方法,那么PHP将返回一个错误。
五、克隆对象:__clone()
当我们克隆一个对象时,魔术方法__clone()会被自动调用
六、对象序列化
序列化是将任何数据转化为字符串格式的一个过程。通过序列化,我们可以将一个完整的对象保存在一个文件或者保存在数据库中。有关序列化的一个问题是,并不是所有的数据都可以被序列化,例如一个数据库连接。
1.__sleep()
当我们对一个对象使用serialize()函数时,__sleep()函数会被调用。
2.__wakeup()
当我们对一个对象使用unserialize()函数时,__wakeup()函数会被调用。
七、方法重载
1.__call()
在对象中调用一个不可访问方法时,__call() 会被调用。
2.__callStatic() (PHP 5.3)
用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。
八、将对象当作函数使用
1.__invoke
当我们试图将对象当做函数来使用时,该方法会被调用。
九、自动加载类
1.__autoload()
该方法是我们在实例化一个类时,允许程序自动寻找类文件,并将类文件加载到当前脚本,可以简化很多我们对require的使用。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/621604.htmlTechArticle在面向对象的编程中,PHP为我们提供很多魔术方法,灵活的使用这些魔术方法,可以简化我们在面向对象开发过程中的很多操作。在PHP中,...


推荐阅读
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • HTML 表格与列表标签详解
    本文详细介绍了HTML中的表格标签和列表标签的使用方法,包括如何创建表格的不同部分(如标题、头部、主体和脚部),以及如何利用这些标签进行数据展示和布局设计。 ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 本文探讨了当通过Nginx访问网站时出现504 Gateway Timeout错误的解决方案,特别是当请求处理时间超过30秒时的情况。文章提供了调整PHP-FPM配置的具体步骤,以延长请求超时时间。 ... [详细]
  • 本文介绍了一个来自AIZU ONLINE JUDGE平台的问题,即清洁机器人2.0。该问题来源于某次编程竞赛,涉及复杂的算法逻辑与实现技巧。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 本文探讨了线性表中元素的删除方法,包括顺序表和链表的不同实现策略,以及这些策略在实际应用中的性能分析。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
author-avatar
KingDragon龙帝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有