一步一步学习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中的extract的作用分析
Apr 09 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
php实现的SESSION类
Dec 02 PHP
浅析iis7.5安装配置php环境
May 10 PHP
php生成高清缩略图实例详解
Dec 07 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
Oct 08 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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
实用函数2
2007/11/08 PHP
php rsa加密解密使用详解
2015/01/14 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
javascript的几种写法总结
2016/09/30 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
2018/05/15 NodeJs
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python实现LRU算法的2种方法
2015/06/24 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
安装Python的教程-Windows
2017/07/22 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
房地产广告词大全
2014/03/19 职场文书
学校消防安全责任书
2014/07/23 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
学校捐书活动总结
2015/05/08 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
Java 定时任务技术趋势简介
2022/05/04 Java/Android