一步一步学习PHP(6) 面向对象


Posted in PHP onFebruary 16, 2010

但是我们知道,面向对象有三大特征:继承,多态和封装。

1. 继承

我们继续上一节中的例子,在PHP中,继承和Java是一样的,都使用extends关键字。

class People 
{ 
private $name; 
public function GetName() 
{ 
return $this->name; 
} 
public function SetName($name) 
{ 
$this->name=$name; 
} 
} 
class Student extends People 
{ 
private $grade; 
public function SayHello() 
{ 
echo("Good Morning,".parent::GetName()); 
} 
}

在这里,我们需要主要的还有我们访问父类在C# 中用base,在Java中用super,但是在PHP中,我们用parent关键字。

如果我们要访问自身的方法,那么可以用this,也可以用self。

class Student extends People 
{ 
public function GetName() 
{ 
return "kym"; 
} 
private $grade; 
public function SayHello() 
{ 
echo("Good Morning,".self::GetName()); 
//echo("Good Morning,".$this->GetName()); 
} 
}

2. 抽象类

提到继承,就不得不说抽象类。

<?php 
abstract class People 
{ 
private $name; 
public function GetName() 
{ 
return $this->name; 
} 
public function SetName($name) 
{ 
$this->name=$name; 
} 
abstract function SayHello(); 
} 
class Student extends People 
{ 
public function SayHello() 
{ 
echo("Good Morning,".parent::GetName()); 
} 
} 
$s=new Student(); 
$s->SetName("kym"); 
$s->SayHello(); 
?>

3. 接口

接下来就是接口:

<?php 
abstract class People 
{ 
private $name; 
public function GetName() 
{ 
return $this->name; 
} 
public function SetName($name) 
{ 
$this->name=$name; 
} 
abstract function SayHello(); 
} 
interface IRun 
{ 
function Run(); 
} 
class Student extends People implements IRun 
{ 
public function SayHello() 
{ 
echo("Good Morning,".parent::GetName()); 
} 
public function Run() 
{ 
echo("两条腿跑"); 
} 
} 
$s=new Student(); 
$s->SetName("kym"); 
$s->SayHello(); 
$s->Run(); 
?>

都没什么好说的,跟Java一模一样。

4. 构造方法

一直忘了说构造方法,其实也就是一段同样的代码:

<?php 
class Person 
{ 
private $name; 
private $age; 
public function Person($name,$age) 
{ 
$this->name=$name; 
$this->age=$age; 
} 
public function SayHello() 
{ 
echo("Hello,My name is ".$this->name.".I'm ".$this->age); 
} 
} 
$p=new Person("kym",22); 
$p->SayHello(); 
?>

我们在面试中也许经常会遇到一种变态的题型,就是若干个类之间的关系,然后构造函数呀什么的调来调去。但是,在PHP中就不会遇到这样的情况了,因为在PHP中并不支持构造函数链,也就是说,在你初始化子类的时候,他不会自动去调用父类的构造方法。
<?php 
class Person 
{ 
private $name; 
private $age; 
public function Person($name,$age) 
{ 
$this->name=$name; 
$this->age=$age; 
} 
public function SayHello() 
{ 
echo("Hello,My name is ".$this->name.".I'm ".$this->age); 
} 
} 
class Student extends Person 
{ 
private $score; 
public function Student($name,$age,$score) 
{ 
$this->Person($name,$age); 
$this->score=$score; 
} 
public function Introduce() 
{ 
parent::SayHello(); 
echo(".In this exam,I got ".$this->score); 
} 
} $s=new Student("kym",22,120); 
$s->Introduce(); 
?>

5. 析构函数

析构函数和C#和C++中不同,在PHP中,析构函数的名称是__destructor()。

class Student extends Person 
{ 
private $score; 
public function Student($name,$age,$score) 
{ 
$this->Person($name,$age); 
$this->score=$score; 
} 
public function Introduce() 
{ 
parent::SayHello(); 
echo(".In this exam,I got ".$this->score); 
} 
function __destruct() 
{ 
echo("我要被卸载了"); 
} 
}

6. 多态

由于默认参数的存在,以及PHP的弱类型,使得编译时多态(也就是由于参数个数以及类型不同而造成的多态)无法实现,但是运行时多态在上文中已有提及。不再赘述。

PHP 相关文章推荐
通过对php一些服务器端特性的配置加强php的安全
Oct 09 PHP
用PHP发电子邮件
Oct 09 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
PHP获取url的函数代码
Aug 02 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
PHP小教程之实现双向链表
Jun 12 PHP
PHP调用wsdl文件类型的接口代码分享
Nov 19 PHP
php保存信息到当前Session的方法
Mar 16 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
php中的explode()函数实例介绍
Jan 18 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 PHP
一步一步学习PHP(5) 类和对象
Feb 16 #PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 #PHP
IP138 IP地址查询小偷实现代码
Feb 15 #PHP
PHP采集相关教程之一 CURL函数库
Feb 15 #PHP
php 数组的合并、拆分、区别取值函数集
Feb 15 #PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 #PHP
一步一步学习PHP(4) php 函数 补充2
Feb 15 #PHP
You might like
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
php基于Redis消息队列实现的消息推送的方法
2018/11/28 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
JavaScript中的其他对象
2008/01/16 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
Python常用的日期时间处理方法示例
2015/02/08 Python
详解Python核心对象类型字符串
2018/02/11 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
面料业务员岗位职责
2013/12/26 职场文书
教师求职信怎么写
2015/03/20 职场文书