PHP 13: 类
原文:PHP 13: 类
Notice: This article is working on progress!
本章将介绍PHP类.
现在,基本上每种语言都支持面向对象,当然PHP也不列外。
PHP在以前的版本不支持面向对象,但自从PHP4,包括PHP4之后开始支持了。本系列将以PHP5为例来描述面向对象的知识。在后面也将提及PHP4的知识。
PHP对面向对象的支持的能力,以我个人观点,没有C++,C#,Java等语言那么深入,即使如此,也算得上是比较全面的。
你问问现在的每一个人面向对象的特点是什么?他们肯定回答封装,多态,继承,没错,就是这些。
类
好了,我们从类开始说起吧。类的概念不说了,世人都知道。
PHP中的类可以这样写:
class Page
{
}
?>
它定义了一个简单的类Page,什么都没有。
你也可以定义属性和方法,如下:
class Page
{
//2 attributes
var $attribute1;
var $attribute2;
//2 functions
function Operation1()
{
}
function Operation2($param1,$param2)
{
}
}
?>
PHP的类有构造和析构函数吗?答案是肯定的,有!那么是不是和C++的一样呢?不是,它有专门的函数。
构造用__construct();析构用__destruct();(注意:前面是2个下划线)
代码如下:
PHP支持重载吗?是的,PHP支持重载,这样就可以有多种方式进行构造了。
类的实例化
构建了类,我们就需要应用它,如何使用?实例化,这个和其他语言一样,所以只给出代码:
输出结果是:
设置或得到属性
这个问题很有意思。
拿上面的例子来说, $attribute1就是一个属性,我们可以利用 $this->attribute1来获取或设置其值。
但是为了更好的体现类的封装性,还是采用PHP提供的get或set方法,这个和C#里的功能这样。但是在PHP中,提供2个方法:__get($name),__set($name,$value)函数来设置属性。
这样做的另外一个好处就是根据实际需要,加入自己的逻辑,如果直接赋值的话就不能办到。比如说属性一定要是1-100之间的数,怎么办?还是采用__set吧。看看代码吧:


?>
类成员和方法的可视性
还是public,private以及protected。和C#的作用一样。但是需要注意的是,PHP默认的是public,而不是大多数语言默认的private。基于此,上述的例子才可以使用。还需要注意的一点是,如果使用了这3个关键字,var就省略了。看个例子吧。


?>
类的继承
类的继承和C#,Java语言一样,不支持多重继承。PHP实用extends来继承一个类,和Java有些类似。
在Java里有final这个词,PHP里也有,并且作用相似,就是为了阻止继承或重载,重写方法。
提到继承,那么PHP支持接口吗?支持。例如:
PHP新的高级功能
1. Per-class常量
它是在PHP5引入的。这个常理不需要再初始化。例如:


?>
其实和C++里的静态变量一样。
2. 静态函数
既然说到了静态变量,当然也要说静态函数了。它和上面的思想一样,实现时需要加static关键字,好多语言都是这样的。C#,Java等。
代码可以如下:


?>
3. PHP 的类的类型检查
你要想判断一个类是不是某个类的类型。非常简单,就是instanceof,如果你使用过java,那么你非常熟悉了,因为和Java一样。如果你是用C#的,类似于C# 里的is。
4. 克隆对象
PHP提供一个关键字,clone,就是这个功能。我看PHP是我见到语言中克隆对象比较简单的语言之一。代码如下:
如果你想改变$c的某一特性,怎么办?这个时候你需要重写__clone方法。
5. 抽象类
PHP也支持抽象类,并且和C#等语言非常类似。给个例子吧。


?>
输出的结果如下:
注意抽象函数的写法,abstract关键字。以及在子类里,没有override关键字,而是直接重写。这是和C#不同的。
6. 使用__call重载
这是我认为PHP提供的一个非常cool的功能,非常的佩服。这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。
举个例子吧。代码如下:


?>
显示的结果如下:
$foo->test1这个方法在foo类里不存在的,但是定义了__call之后,就可以了。
7. 使用__autoload()方法。
这个功能仍然很cool。很多开发者写面向象的应用程序时对对每个类的定义建立一个 PHP 源文件。一个很大的痛苦是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件列表。在 PHP 5 中,我们再也不需要这样了。 __autoload 函数就能轻松搞定,当代码视图使用未定义的类时,此方法自动调用。通过调用此函数,脚本引擎在出错失败之前就有了最后一个补救的机会来加载所需的类。但是需要注意的是 __autoload 函数抛出的异常不能被 catch 语句块捕获并导致致命错误。
一个例子:
8,实现迭代期或迭代。
它将迭代类的所有可见的属性以及值等
9 . 将类型转化为字符串(__toString()).
这是一个魔术函数的应用,__toString().它有点像C#里的ToString()函数一样,但是对于类本身来说还是有区别的。如果你在PHP的类里实现了该函数,它们载打印这个类时就会调用此函数,例如:
它将输出:
10. 反射。
没想到PHP也支持反射的。如果你对C#的反射熟悉的话,它们我就不用说了。如果不是,请继续往下看。
反射是通过类或对象查找它包含的内容的信息的能力。当此类的文档信息不详或没有提供时,可以通过反射得到类的一些属性,方法等信息。
反射继承了Zend的一些类。具体实用请参看PHP反射的类的文档。
PHP 13: 类的更多相关文章
- Kotlin入门(13)类成员的众生相
上一篇文章介绍了类的简单定义及其构造方式,当时为了方便观察演示结果,在示例代码的构造函数中直接调用toast提示方法,但实际开发是不能这么干的.合理的做法是外部访问类的成员属性或者成员方法,从而获得处 ...
- Java编程的逻辑 (13) - 类
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- scala学习手记13 - 类继承
在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中 ...
- Python 学习笔记13 类 - 创建和简单使用
介绍: 面向对象编程是一种非常有效的软件编写方法之一,在面向对象编程中,我们会编写表示现实世界中的事物或者情景的类,并基于类来创建对象. 在编写类的的时候,这些类对象一般都有通用的行为或者属性.基于类 ...
- python学习13类2之封装
'''''''''面向对象三大特性:封装,继承,多态1.封装: 类中以_或者__的属性,都是私有属性,禁止外部调用.'''class Student(object): def __init__(sel ...
- C++学习13 类class和结构体struct的区别
C++保留了C语言的 struct,并且加以扩充.在C语言中,struct 只能包含数据成员,不能包含成员函数.而在C++中,struct 类似于 class,既可以包含数据成员,又可以包含成员函数. ...
- 13类100个常用Linux基础命令
玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.然而每个人玩Linux的目的 ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- Java编程的逻辑 (14) - 类的组合
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
随机推荐
- 遗传算法解决旅行商问题(TSP)
这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...
- hdu1381 Crazy Search(hash map)
题目意思: 给出一个字符串和字串的长度,求出该字符串的全部给定长度的字串的个数(不同样). 题目分析: 此题为简单的字符串哈hash map问题,能够直接调用STL里的map类. map<str ...
- Programming from the ground up(0)
这本书的英文版是开源.我读了一些.但是,支持的英语水平不走太,然后还有那些谁译的书,但感觉不是太干脆翻译,在一些地方难以清除作者的思路,所以,我要揍很难理解他自己翻译一下原来的地方,这将更好地了解一点 ...
- Gradle sourceCompatibility has no effect to subprojects(转)
I have Java 6 and 7 installed on my machine. Gradle uses 1.7 (checked using gradle -v). But I need t ...
- JavaScript-2.2 document.write 输出到页面的内容
<html> <head> <meta http-equiv="content-type" content="text/html;chars ...
- cuda vector addition
http://webgpu.hwu.crhc.illinois.edu/ // MP 1 #include <wb.h> __global__ void vecAdd(float * in ...
- log4j的配置信息(转)
首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Append ...
- js地址下拉列表中全职工作
/******************************************************************* *输出全国各省辖市下拉列表项writeCitys() *输出企 ...
- 数学思想方法-sasMEMO(17)
SAS日期及时间格式 data _null_;input mydate YYMMDD10.;put mydate YYMMDDB10.;put mydate YYMMDDC10.;put mydat ...
- Hadoop之——CentOS构造ssh否password登录注意事项
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46388809 前提配置:使用root登录改动配置文件:/etc/ssh/sshd_ ...