本文目录一览:
- 1、为啥PHP的多态是假多态?
- 2、php 多态 有什么用
- 3、PHP多态代码实例
- 4、PHP中多态如何实现
为啥PHP的多态是假多态?
1.多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。
2.PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。
3.php其语法特点,不支持固定变量类型,它是根据上下文来确定当前的类型是什么,即,最后一次赋值是什么类型,现在它就是什么类型。也就不存在将子类
变量赋给基类变量的说法。但php函数的参数,是可以规定类型的,如下面的show函数。如果传递一个不是此类型的参数,将会在运行时报错。
代码如下:
?php
/**
* 虚基类
*/
abstract class T{
abstract function show();
}
/**
* 子类
*/
class T1 extends T {
public function show(){
echo "T1 from abstract class!br/";
}
public function show1(){
echo "T1 not from abstract class!br/";
}
}
/**
* 子类
*/
class T2 extends T {
public function show(){
echo "T2 from abstract class!br/";
}
public function show1(){
echo "T2 not from abstract class!br/";
}
}
class T3 {
public function show(){
echo "in T3!br/";
}
public function show1(){
echo "in T3!br/";
}
}
$t1 = new T1();
$t2 = new T2();
$t3 = new T3();
show($t1);
show($t2);
//报错,$t3不是T,所以被show函数调用的时候,会报类型不对的错误
//show($t3);
function show( T $t ){//注意参数的类型
$t-show();
$t-show1();
}
?
php 多态 有什么用
多态性,其来自于dictionary.com的定义是"以不同形式,阶段或者类型出现在独立的组织中或者同种组织中,而不存在根本区别。"由该定义, 我们可以认为,多态性是一种通过多种状态或阶段来描述相同对象的编程方式。其实,它的真正意义在于:实际开发中,我们只需要关注一个接口或基类的编程,而 不必担心一个对象所属于的具体类(class)。
如果你熟悉设计模式,即使只是有个初步了解,那么你也会了解这个概念。事实上,多态 性可能是基于模式设计编程中的最伟大的工具。它允许我们以一种逻辑的方式来组织相类似的对象从而实现在具体编码时不必担心对象的具体类型;而且,我们只需 要对一个所期望的接口或基类编程即可。一个应用程序越抽象,则它就显得越灵活--而多态性是对行为加以抽象的最好的方式之一。
例如, 让我们考虑一个叫Person的类。我们可以用称为David,Charles和Alejandro的类来子类化Person。Person有一个抽象方 法AcceptFeedback(),所有的子类都要实现这个方法。这意味着,任何使用基类Person的子类的代码都能调用方法 AcceptFeedback()。你不必检查该对象是一个David还是一个Alejandro,仅知道它是一个Person就够了。结果是,你的代码 只需关注"最小公分母"-Person类即可。
在这个示例中的Person类也可以被创建为一个接口。当然,与上面相比存在一些区 别,主要在于:一个接口并没有给出任何行为,而仅确定了一组规则。一个Person接口要求的是"你必须支持AddFeedback()方法",而一个 Person类可以提供一些AddFeedback()方法的缺省代码-你对之的理解可以是"如果你不选择支持AddFeedback(),那么你应该提 供一种缺省实现。"至于如何选择接口或基类则并非本文的主题;但是,一般说来,你需要通过基类来实现一个缺省的方法。如果你能够简单地勾勒出你的类所要实 现的一组期望的功能,那么你也可以使用一个接口。
PHP多态代码实例
这篇文章主要介绍了PHP多态代码实例,本文用2个代码实例来演示PHP中的多态,需要的朋友可以参考下
多态定义:只关心一个接口或者基类,而不关心一个对象的具体类。(同一类型,不同结果)
这里两个例子:
第一个,我们发现,基类定义了标准,子类进行了自我规则的实现。这是多态的一个要求。同时,这是满足重写;实际上这是不同类的不同表现;没有严格满足一个接口,或者基类编程。因为你调用的时候不是
stu-showGrade()
而是各自自己的方法;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class
stu{
public
function
showGrade(){
echo
base
class;
}
}
class
xiaomin
extends
stu{
public
function
showGrade(){
echo
is
son
show
80;
}
}
class
xiaoli
extends
stu{
public
function
showGrade(){
echo
is
son
show
60;
}
}
function
doit($obj){
if(get_class($obj)
!=
stu){
$obj-showGrade();
}
}
doit(new
xiaoli());
doit(new
xiaomin());
第二个例子:dovoice
参数规定了$obj
为animal,意识就是用接口
接受了
实现类对象。了向上转型。这就符合同一类型,不同结果了,这就是多态;
实际上在Java中
会是
animal
a
=
new
dog();这样子的;因为PHP
是若类型语言。没有对象转型机制。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
interface
animal{
public
function
voice();
}
class
cat
implements
animal{
public
function
voice(){
echo
miao~~~br;
}
}
class
dog
implements
animal{
public
function
voice(){
echo
wang
~~~br;
}
}
function
dovoice(animal
$obj){
$obj-voice();
}
dovoice(new
dog());
dovoice(new
cat());
PHP中多态如何实现
用trait,定义类,在被继承的类中,use,定义的trait类。
ps:use,可以多个,就是php中简单的多态的实现