多态

class demo
{
   
}

即是普通的类, 而抽象类是一种特殊的类, 接口又是一种特殊的抽象类。 (抽象类本身是一种特殊的类, 接口是特殊的抽象类。)

抽象类:

1. 包含一个方法为抽象方法, 方法和类本身用abstract修饰的类即为抽象类,它不能实例化对象, 要通过子类继承使用,最低权限为protected。

2. 抽象方法不包含方法体, 直接用使用分号结束。

3. 除了方法可以是抽象方法外, 可以包含任意类型的成员属性和成员方法。

为什么要通过子类继承去实现抽象类方法的原因是因为抽象类不能实例化对象, 而对象中的方法和属性(除静态方法外)又要通过对象访问,所以要通过子类去继承父类。

4. 本质是定义规范, 然后子类去依照规范实现功能, 抽象类中定义的抽象方法子类必须全部实现。

<?php

abstract class demo
{
    abstract function run1();
    abstract function run2();
}
class demo2 extends demo
{
    function run1()
    {
        echo "im run1.....";
    }
    function run2()
    {
        echo "im run2.....";
    }
}

$m = new demo2;
$m->run1();
$m->run2();

接口:

接口是一种特殊的抽象类, 它特殊(不同)在哪里?

1. 声明方式不同,抽象类通过abstract修饰,接口通过interface修饰。

2. 权限不同, 抽象类权限最低为protected, 接口权限只能为public。

3. 接口中的成员属性必须是常量属性, 抽象类中的属性可以为普通属性。

4. 接口中的成员方法必须全部为抽象方法, 可以省略abstract关键字, 抽象类中可以有普通方法, 对抽象方法必须使用abstract修饰。

5. 实现方式不同, 抽象类的实现方式是通过子类继承, 接口的实现方式是(implements)实现。

声明一个接口:

<?php

interface demo
{
    function a();
    function b();
}
class demo2 implements demo
{
    function a()
    {
        echo "im a.....";
    }
    function b()
    {
        echo "im b.....";
    }
}
$m = new demo2;
$m->a();
$m->b();

接口的本质和抽象类相同, 都是通过子类去实现父类, 父类定义规范, 在php中主要是为了弥补单继承(一个类只能拥有一个父类)问题的,如果一个类, 既想继承一个类的同时又想实现规范,就要用到接口,接口可以继承接口,接口继承接口使用extends, 类实现接口使用implements。

<?php

interface demo
{
    function a();
    function b();
}
interface demo2 extends demo
{
    function c();
    function d();
}
class www
{
    function say()
    {
        echo "just a test";
    }
}
class demo3 extends www implements demo2
{
    function a()
    {
        echo "im a"."<br>";
    }
    function b()
    {
        echo "im b"."<br>";
    }
    function c()
    {
        echo "im c"."<br>";
    }
    function d()
    {
        echo "im d"."<br>";
    }
}
$m = new demo3;
$m->a();
$m->b();
$m->c();
$m->d();
$m->say();

多态:

多态是面向对象三大特性之一, 主要是为了体现维护时让代码更具延展性,开发时让代码更具利用效率的。多态的直接定义是让具有继承关系的不同类对象, 可以对相同的成员方法名调用,产生不同的反应。

<?php

interface demo
{
    function a();
    function b();
}
class one implements demo
{
    function a()
    {
        echo "aaaaaaa";
    }
    function b()
    {
        echo "bbbbbb";
    }
}
class two implements demo
{
    function a()
    {
        echo "aaaaaaa";
    }
    function b()
    {
        echo "bbbbbb";
    }
}

$m = new one;
$m->a();
$m->b();

class one implements demo ,class two implements demo, 具有继承关系的不同类对象, $->a(); b(); 对相同的方法名调用产生不同的反应。一次可以实现多个接口, 实现多接口时可以使用实现继承接口的接口,也可以直接写在关键字后面用,隔开。 有次序分别, 要先继承再实现, class demo extends abc implements one,two,theer,four…