PHP面向对象学习笔记三
上一篇文章我记录了一些关于PHP继承的知识,这篇文章记录一些关于PHP多态的知识。其实不管是何种面向对象的语言,继承都是多态的一个前提。
四、PHP的多态
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性。
单纯的看定义的话,感觉有些抽象,没关系,稍后我会举例子,供大家理解什么是多态以及在PHP中如何使用多态。前面说过PHP的重载,那么这就是实现PHP的关键所在,这也类似于在C#中用覆盖来实现多态。还有一个实现PHP多态的方法,就是继承抽象方法,并给其赋予实际的行为含义。下面我给大家举得例子使用继承抽象方法来实现多态。
在现实中我们有各种各样的形状,如:正方形、圆形、三角形等。这些形状如果看成一个个类的话,那么他们都会有一个draw方法,这个方法可以画出这个形状。讲过分析,可以抽象出一个形状的类,这个类则是所有形状的积累,这个类中有个抽象方法:draw。值得注意的是,在PHP中包含至少一个抽象方法的类必须为抽象类,而集成这个抽象类的子类,必须要实现抽象类中的抽象方法,具体的代码如下:
<?php
abstract class Shape{
abstract public function draw();
}
class Circle extends Shape{
public function draw(){
echo '我画出了一个圆形<br/>';
}
}
class Square extends Shape{
public function draw(){
echo '我画出了一个正方形<br/>';
}
}
class Triangle extends Shape{
public function draw(){
echo '我画出了一个三角形<br/>';
}
}
function show($obj){
if($obj instanceof Shape){
$obj->draw();
}
else{
echo '出错啦<br/>';
}
}
$shape = null;
$shape = new Circle();
show($shape);
$shape = new Square();
show($shape);
$shape = new Triangle();
show($shape);
?>
以下是结果:
我画出了一个圆形 我画出了一个正方形 我画出了一个三角形
五、补充知识
1、常量
<?php
class Math{
const pi = 3.14159;
}
echo Math::pi;
?>
调用方法,类名::常量
2、静态方法
调用方式和调用常量差不多,不过需要在方法前使用static关键字
<?php
class Math{
public static function squared($v){
return $v*$v;
}
}
echo Math::squared(2);
?>
3、克隆对象
使用clone关键字
<?php
$clon = clone $old;
?>
这将创建一个与对象$old具有相同类的副本,切记:不是创建引用。如果,你想改变一些克隆的行为,你在类中写__clone()这个函数,这样在使用clone时,它会被自动调用,执行你想要的行为。
4、__call魔术方法
当你调用一个类中不存在的方法时,它会被自动触发
<?php
class Myclass{
public function __call($method,$arguarray){
echo '调用了这个方法:'.$method;
}
}
$obj = new Myclass();
$obj->myfunc();
?>
会输出:
调用了这个方法:myfunc
这个方法最重要的用途就是实现方法的重载,让其根据参数的不同,产生不同的行为。代码示例:
<?php
class Shape{
public function __call($method,$arguarray){
if($method == 'display'){
if($arguarray[0] == 'circle'){
$this->diplayCirlce();
}
else if($arguarray[0] == 'square'){
$this->diplaySquare();
}
else{
$this->displayShape();
}
}
}
private function diplayCirlce(){
echo '我是圆形<br/>';
}
private function diplaySquare(){
echo '我是正方形<br/>';
}
private function displayShape(){
echo '没有具体的形状描述<br/>';
}
}
$obj = new Shape();
$obj->display('circle');
$obj->display('square');
$obj->display();
?>
输出结果:
我是圆形 我是正方形 没有具体的形状描述
5、__toString魔术方法
当使用echo打印时,将调用这个函数。