一步一步学习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 相关文章推荐
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
PHP读取大文件的多种方法介绍
Apr 04 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
PDO::rollBack讲解
Jan 29 PHP
PHP 文件上传限制问题
Sep 01 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 PHP
PHP设计模式(观察者模式)
Jul 07 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 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
php实现微信公众号无限群发
2015/10/11 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
解析python的局部变量和全局变量
2019/08/15 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
幼儿园运动会口号
2014/06/07 职场文书
争做文明公民倡议书
2014/08/29 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
地球一小时活动总结
2015/02/27 职场文书
财务部岗位职责范本
2015/04/14 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers