一步一步学习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框架Phpbean说明
Jan 10 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 PHP
openPNE常用方法分享
Nov 29 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
PHP中phar包的使用教程
Jun 14 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php调整服务器时间的方法
2015/04/03 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
jquery的颜色选择插件实例代码
2008/10/02 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
奇怪的鱼:Weird Fish
2018/03/18 全球购物
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
工艺工程师工作职责
2013/11/23 职场文书
电子商务个人自荐信
2013/12/12 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
公司出纳岗位职责
2015/03/31 职场文书
人民检察院起诉书
2015/05/20 职场文书
干部培训工作总结2015
2015/05/25 职场文书
车间班组长竞聘书
2015/09/15 职场文书