一步一步学习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核心代码分析require和include的区别
Jan 02 PHP
php小型企业库存管理系统的设计与实现代码
May 16 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
PHP之密码加密的几种方式
Jul 29 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
PHP设置images目录不充许http访问的方法
Nov 01 PHP
laravel执行php artisan migrate报错的解决方法
Oct 09 PHP
yii2.0框架场景的简单使用示例
Jan 25 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
php获取目标函数执行时间示例
2014/03/04 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
python查看模块,对象的函数方法
2018/10/16 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
.net C#面试题
2012/08/28 面试题
人事主管岗位职责范本
2013/12/04 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
环卫工作汇报材料
2014/10/28 职场文书