一步一步学习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利用COM对象访问SQLServer、Access
Oct 09 PHP
文件系统基本操作类
Nov 23 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
PHP入门之常量简介和系统常量
May 12 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
Sep 22 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
php实现图片上传时添加文字和图片水印技巧
Apr 18 PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 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 zip文件解压类代码
2009/12/02 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
为原生js Array增加each方法
2012/04/07 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python三引号输出方法
2019/02/27 Python
python代码编写计算器小程序
2020/03/30 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
求职自荐信格式
2013/12/04 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
大学生社会实践方案
2014/05/11 职场文书
慰问信模板
2015/02/14 职场文书
小学家长意见怎么写
2015/06/03 职场文书
基层工作经历证明
2015/06/19 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
MySQL基础(二)
2021/04/05 MySQL
解读Vue组件注册方式
2021/05/15 Vue.js
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技