浅谈PHP面向对象编程(六、自动加载及魔术方法)
6.0 自动加载及魔术方法
6.1 自动加载
在PHP开发过程中,如果希望从外部引入一个class.通常会使用incluae和requre方法把定义这个class的文件包含进来。但是,在大型的开发项目中,这么做会产生大量的require或者include方法的使用。这样不仅会降低效率,并且使代码难以维护。
如果不小心忘记引入某个类的定又文件,PHP就会报告一个致命错误,导致整个应用程序崩溃。
为了解决上述问题,PHP提供了类的自动加载机制,即定义一个_ autoload()函数,它会在试图使用尚未被定义的类时自动调用。
这样,PHP在报告错误之前会有最后一个机会加载所需的类。为了方便理解自动加载机制,接下来通过一个案例来说明_autoload()是 如何实现自动加载的。
首先在当前目录下,定义类文件MyClass1.cass.php.示例代码如下:
<?php
class MyClass1{ }
?>
定义类文件MyClass2.cass.php.示例代码如下:
<?php
class MyClass2{ }
?>
需要注意的是,对于类定义文件,通常使用 类名 .class.php 这种形式的文件名,这样便于程序的编写。
__autoload()方法的使用如例6-16所示
例6-16
<?php
function __autoload($classname){
require_once $classname . ".class.php";
}
$obj1 = new MyClass1();
$obj2 = new MyClass2();
var_dump($obj1);
var_dump($obj2);
?>
运行结果
从上图中可以看出试览器并没有访问过这两个类定义文件,在代码中也没有使用include (或requre)将其包含,但是却获得了这两个类的对象。由此说明,__autolad() 函数可以实现自动加载功能。
需要注意的是,自动加载是指当需要类定义文件而没有找到时,会自动的调用_autolad函数,它不只限于实例化对象,还包括继承、序列化等操作。
而且, 自动加载并不能自己完成加载类的功能,它只提供了一个时机。具体的加载代码还需要我们自己编写代码实现。
除了__autoload()函数之外,spl_autoload_regiser()提供了一种更加灵活的方式来实现类的自动加载。
例6-17
<?php
function loader($classname){
require $classname . ".class.php";
}
spl_autoload_register('loader');
$obj1 = new MyClass1();
$obj2 = new MyClass2();
var_dump($obj1);
var_dump($obj2);
?>
运行结果
由此证明 spl_autoload_register() 也可以实现类的自动加载
6.2 魔术方法
PHP中有很多以两个下划线开头的方法.如前面介绍的_ _construct() __autolad() _get() 和_ set(). 这些方法被称为魔术方法。
魔术方法有一个特点就是不需要手动调用,在某一时刻会自动执行。为程序的开发带来了极大的便利。
在PHP中提供了多个魔术方法、接下来列举这些常用的度术方法。如下表 所示
方法声明 | 功能描述 |
__sleep() | 对象序列化之前被调用,使程序延缓一段时间执行。 |
__wakeup() | 对象序列化之前被调用,还原被序列化的对象。 |
__toString() | 输出一个对象时被调用,将对象转化为字符串。 |
__call() | 在对象中调用一个不可访问方法时会被调用。 |
__callStatic() | 用静态方式中调用一个不可访问方法时会被调用。 |
__clone() | 克隆对象时被调用。 |
__invoke() | 当尝试以调用函数的方式调用一个对象时被调用 |
上表中列举了PHP中的常用的魔术方法,这些方法在实际开发中会经常的使用,接下来以__toString() 为例 演示一下。
例6-18
<?php
class Person{
private $name = "张三";
private $age = 21;
public function __toString(){
return "$this->name ($this->age)";
}
}
$p1 = new Person();
echo $p1;
?>
运行结果
张三 (21)
浅谈PHP面向对象编程(六、自动加载及魔术方法)的更多相关文章
- 浅谈PHP面向对象编程(三、构造方法和析构方法)
3.0 构造方法和析构方法 从我之前的博客可以发现,实例化一个类的对象后,如果要为这个对象的属性赋值,需要直接访问该对象的属性.如果想要在实例化对象的同时就为这个对象的属性进行赋值,则可以通过构造方法 ...
- PHP面向对象之类的自动加载
类的自动加载 含义: 当某行代码需要一个类的时候,php的内部机制可以做到“自动加载该类文件”,以满足该行需要一个类的这种需求. 什么时候需要一个类? 1,new一个对象的时候: 2,使用一个类的静态 ...
- PHP面向对象----- 类的自动加载
1.类的自动加载 spl_autoload_register函数 test.php <?php spl_autoload_register('autoload'); // require_onc ...
- 浅谈PHP面向对象编程(二、基础知识)
和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...
- 浅谈python面向对象编程和面向过程编程的区别
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个个的依次调用即可. 优点:性能高 缺点:相较于面向对象而言,不易维护,不易复用,不易扩展 适合于小型的项目面向对象 ...
- 浅谈PHP面向对象编程(九、设计模式)
9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...
- 浅谈Entity Framework中的数据加载方式
如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...
- 浅谈网络爬虫爬js动态加载网页(三)
上一篇讨论了web driver对动态网页的抓取与分析,可以很清楚的看出这是一种集中式处理方式,简单说,就是利用服务器,打开一个真正的brower,然后将需要解析的地址交给浏览器,浏览器去解析,然后将 ...
- 浅谈网络爬虫爬js动态加载网页(二)
没错,最后我还是使用了Selenium,去实现上一篇我所说的问题,别的没有试,只试了一下firefox的引擎,总体效果对我来说还是可以接受的. 继续昨天的话题,既然要实现上篇所说的问题,那么就需要一个 ...
随机推荐
- .net 获取客户端Ip地址
Request.ServerVariables["REMOTE_ADDR"]来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正 ...
- Lua的清屏快捷方式
1. Lua (Command Line) 这里清屏的方式是: os.execute("cls") 就是执行了DOS中的清屏命令! 2.SciTE中的清屏方式: -----(1)第 ...
- gradle Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.crea
gradle Could not create service of type CrossBuildFileHashCache using BuildSessionScopeServices.crea ...
- 【商业源码】生日大放送-Newlife商业源码分享 -转
http://www.cnblogs.com/asxinyu/p/3225179.html 今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和 ...
- [CSAPP笔记]Binary , Unsigned , Signed 之间的相互装换
LaTex+MarkDown+Pandoc组合套件写博客的处女作,试试效果.各自的分工为:Latex下编辑公式,在Sublime Text 2下使用Markdown排版,最后用Pandoc导出. 摘要 ...
- 使用vue与element组件
1.安装element npm i element-ui -S 2.引入 在main.js写入一下内容 import Vue from 'vue'; import ElementUI from 'el ...
- JavaScript库基本格式写法
/********************************************************************* * JavaScript库基本格式写法 * 说明: * 由 ...
- VirtualBox 挂载共享目录
/********************************************************************** * VirtualBox 挂载共享目录 * 说明: * ...
- (转载)从MVC到前后端分离
摘要:MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强.MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Stru ...
- 使用python处理selenium中的css_selector定位元素的模糊匹配问题
# 匹配id,先指定一个html标签,然后加上“#”符号,再加上id的属性值 self.driver.find_element_by_css_selector('div#ID').click() # ...