ホームページ  >  記事  >  バックエンド開発  >  PHP 基本チュートリアル 12: 抽象化とインターフェイス

PHP 基本チュートリアル 12: 抽象化とインターフェイス

黄舟
黄舟オリジナル
2017-03-01 10:04:091295ブラウズ

このセクションで説明する内容

  • 概要

  • インターフェース

  • finalの使用

  • クラス定数

Pre face

PHP におけるオブジェクト指向 インスタンス化オブジェクトの定義はクラスを定義することで完了し、PHP の抽象クラスとインターフェイス クラスは、これら 2 つのクラスを定義することによって、クラスに強制的に制約を課すことになりますが、本質的にはクラスの制約となります。彼らはまだ違います。

抽象クラス

動物の継承関係を使用して、抽象クラスの概念を説明できます。親クラスの Animal クラスを作成するとき、メソッド sleep() と Eat() が存在しません。具体的に何の動物なのかは分かりますが、メソッドに何が書かれているか判断できません。これは、抽象クラスを使用して実現できます。

<?php
//通过关键字abstract来声明抽象类
abstract class Animal{
    protected $name;
    protected $age;
    //声明该方法是抽象方法
    abstract public function sleep();
    abstract public function eat();
}

親クラスの一部のメソッドが不確実な場合、abstract キーワードを使用してメソッドを変更できます。これを抽象メソッドと呼び、abstract で変更されたクラスを抽象クラスと呼びます。

基本構文:

abstract  class  类名{
    abstract  访问修饰符   函数名(参数列表);
}

開発中、このクラスを継承するすべてのサブクラスでこのクラスのメソッドをオーバーライドしたい場合、抽象メソッドを使用してこれを実現できます。 抽象クラスは、何かの棚、またはテンプレートのようなもので、テンプレートを使用すると、テンプレートに基づいて特定の機能を実装できます。 、テンプレートと特定のものの間のこの関係は、継承されたクラスを通じて渡されます。コンピューターと同じように、コンピューターもテンプレートを使用して作成されます。抽象クラスが定義されており、継承する必要があります。

<?php

abstract class Animal{
    protected $name;
    protected $age;

    abstract public function sleep();
    abstract public function eat();
}
class Dog extends Animal{

}
......结果........
Fatal error: Class Dog contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Animal::sleep, Animal::eat) 
in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\chouxiang.php on line 13

クラスが抽象クラスを継承する場合、親クラスのすべての抽象メソッドをサブクラスに実装する必要があります 上記で報告されたエラーは、親クラスに 2 つの抽象メソッドが含まれており、サブクラスはその抽象メソッドを実装する必要があることを意味します。抽象クラスの特性は次のように要約できます:

  • 抽象クラスをインスタンス化できない場合、抽象クラスを介して新しいオブジェクトを作成できない場合は、「抽象クラスをインスタンス化できません」エラーが報告されます。

  • 抽象クラスに抽象メソッドは必要ありません。抽象クラスのメソッドはすべて通常のメソッドですが、クラス名は abstract で変更されます。

    <?php
    abstract class Animal{
        protected $name;
        protected $age;
        public function sleep(){
    
        }
        public function eat(){
    
        }
    }
  • 抽象クラスは、通常のメンバーメソッド、プロパティなどを持つことができます。

    <?php
    abstract class Animal{
        protected $name;
        protected $age;
    
        abstract public function sleep();
        abstract public function eat();
    
        public function cry(){
    
        }
    }
  • クラスに抽象メソッドがある場合、このクラスは抽象クラスである必要があります。

  • 抽象メソッドにはメソッド本体がありません

    abstract public function eat();

    {} がありません。これは、メソッド本体がないことを意味します。

  • クラスが抽象クラスを継承する場合、サブクラスは抽象クラスのすべての抽象メソッドを実装するか、サブクラス自体を抽象クラスとして宣言する必要があります

インターフェース

インターフェースの本来の目的抽象クラスと同じですが、メソッドでの実装方法がわからない場合は、インターフェースを使用して実装できます。インターフェイスの定義は、いくつかの未実装のメソッドを与え、それらを一緒にカプセル化し、特定のクラスが使用されるときの特定の状況に応じてこれらのメソッドを記述することです。インターフェイスの出現は、高い結合性と低い結合性の特性を反映します。

<?php

interface iTechnical{
    public function fly();
}

基本構文:

interface 接口名{
    //方法, 在接口中,所有的方法都不能有方法体, 即都是抽象方法
}

インターフェイス クラスは抽象クラスとほぼ同じですが、インターフェイスとは正確には何でしょうか?抽象クラスはノートブックのシェルフやテンプレートに似ており、テンプレートに基づいて特定のノートブックが作成されることは上で述べました。ノートブックには複数の USB インターフェイスがあり、インターフェイス クラスはこれらのノートブックのインターフェイスに似ています。拡張実装。動物と同じように、食べること、寝ることなど動物の固有の特性を受け継いでいますが、突然動物は別の場所で書く能力に気づき、この能力はインターフェースを通じて拡張されます。

インターフェイスの名前は通常、クラス名の最初の文字として小文字の i で始まります。 インターフェイス クラスのすべてのメソッドは、デフォルトでは抽象メソッドです。 そのため、宣言するために要約を書く必要はありません。

インターフェイスの実装

もちろん、インターフェイスを定義するときは、それを他のクラスに実装させます。ここで話しているのは実装であり、インターフェイスと他のクラスの関係は実装です。クラスは実装されます。インターフェイスは、implements キーワードを使用して実装されます。

interface iTechnical{
    public function fly();
}

class Dog implements iTechnical{
    public function fly(){
        echo &#39;<br>飞&#39;;
    }
}

もちろん、インターフェイス内のすべてのメソッドはサブクラスに実装する必要があります。

以下はインターフェイスの特徴です:

  • インターフェイス クラスは、抽象クラスと同様にインスタンス化できません。

  • インターフェース内のすべてのメソッドは、すべて抽象メソッドであるため、本体を持つことができません。

  • クラスはカンマで区切って複数のインターフェースを実装できます(継承は1つだけです)

    class Dog implements 接口1,接口2{
    
    }
  • インターフェースは属性を持つことができますが、定数のみにすることができます。デフォルトはpublicですが、明示的に変更することはできません。 public

  • インターフェース内のすべてのメソッドは public である必要があります。インターフェースは継承用であるため、修飾子が記述されていない場合、デフォルトは public になります

  • インターフェースは他のクラスを継承できません。他のクラスを継承します。 インターフェース

抽象化とインターフェース

の違いは、単一継承です。つまり、クラスは最大 1 つの親クラスしか持てません。この単一継承メカニズムにより、クラスの純粋性が保証されます。クラス。ただし、このメカニズムはサブクラスの機能拡張に一定の影響を与えます。

接口的出现可以说是对继承的一种补充,继承是层级的,不太灵活,而接口却没有它比抽象要灵活的多。并且实现接口在不打破继承关系的前提下,对子类的功能进行扩充。
它们两个的关系图可以理解为这样:
PHP 基本チュートリアル 12: 抽象化とインターフェイス

final的使用

在上面的介绍中每个类都是可以被继承的,如果我们有一个类,我们不想让子类去重写里面的某个方法,或者不想让别的类去继承该类,就可以用到关键字final。final中文意思:最后的,最终的,可以用来修饰类或者方法。

final可以修饰方法或者类,如果修饰方法,则表示该方法不可以被继承类去重写,如果final 修饰了一个类,则表示该类不可以被继承。

基本语法:

final  class   类名{
}
class 类名{
    final 访问修饰符 function 函数名(形参){}
}

修饰类和修饰方法。

<?php

    final class A{

    }

    class B extends A{

    }
    .....结果.....
    Class B may not inherit from final class (A)

不能继承用final修饰的类。

<?php

    class A{
        final public function sum($num1,$num2){
            return $num1 + $num2;
        }

    }

    class B extends A{
        public function sum($num1,$num2){
            return $num1 + $num2;
        }
    }
    .....结果.....
    Cannot override final method A::sum()

从结果中可以看出来不能重写用final定义的方法。

在使用final时,只能用来修饰类或者方法,不能修饰属性。当一个类被final修饰后,类中的方法就不需要被final修饰,因为类都不能继承了,方法就不能重写。同时final修饰的类是可以被实例化的。

如果一个方法被final修饰,是可以被继承的,但是不能被重写。

<?php

    class A{
        final public function sum($num1,$num2){
            return $num1 + $num2;
        }

    }

    class B extends A{

    }

    $b = new B();
    echo $b -> sum(1,2);
    .......结果.......
    3

在我们写单例模式时,说过当时的单例模式是不完善的,可以通过继承来得到不同的对象,在这里我们使用final关键字修饰单例类,防止继承,这样就不能通过继承的到别的对象。

类常量

类常量和普通的常量是一个概念,当不希望一个成员变量被修改,希望该变量的值是固定不变的。这时可以用const去修饰该成员变量,这样这个变量就自动成为常量。在类中的常量称为类常量。前面我们讲过定义常量有两种方式define()和关键字const,在类中必须使用const这种方式,使用define()是会报错的。

<?php

    class A{
        const PI = 3.1415926;

        public function getPI(){
            return A::PI;
        }
    }

    $a = new A();
    echo $a -> getPI();
    echo &#39;<br>&#39;;
    echo A::PI;
    ......结果......
    3.1415926
    3.1415926

类常量的命名一般是全部用大写字母,中间用下划线隔开,同时常量前面没有$符号。常量必须在定义的时候就赋值。同时常量的前面不能有修饰符,默认是public。

常量的访问形式

常量的访问形式分为两种,一种是在类的内部进行访问,一种是在类的外部进行访问。

内部访问

通过 类名::常量名进行访问。

class A{
    const PI = 3.1415926;

    public function getPI(){
        return A::PI;//通过类名进行访问
    }
}

通过 self::常量名进行访问

class A{
    const PI = 3.1415926;

    public function getPI(){
        return self::PI;//通过类名进行访问
    }
}

可以通过self进行访问说明常量是属于类的,并不属于对象的。

外部访问

通过类名::常量名访问。

echo A::PI;

通过对象名::常量名访问

$a = new A();
echo $a::PI;

不过推荐使用第一种,通过类名进行访问。

如果一个类中有常量,则在继承的时候常量也是可以被继承的。同时常量的数据类型不能是对象。

总结

PHP中抽象和接口应用让我们的更加清楚的把握需求的骨架,更好的搭建我们的代码体系。同时利用抽象和接口降低代码的耦合度。利于代码的扩展。

 以上就是PHP基础教程十二之抽象、接口的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。