>  기사  >  백엔드 개발  >  PHP 기본 튜토리얼 12: 추상화 및 인터페이스

PHP 기본 튜토리얼 12: 추상화 및 인터페이스

黄舟
黄舟원래의
2017-03-01 10:04:091295검색

이 섹션에 설명된 내용

  • 추상

  • 인터페이스

  • final 사용

  • 클래스 상수

머리말

PHP의 객체지향은 클래스를 정의하여 객체를 인스턴스화하는 것이며, PHP의 추상 클래스와 인터페이스 클래스는 이 두 클래스를 정의하여 클래스를 정의한다고 할 수 있습니다. 클래스에 대한 제약 조건은 본질적으로 다릅니다.

추상 클래스

동물의 상속 관계를 사용하여 추상 클래스의 개념을 설명할 수 있습니다. (), 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;;
    }
}

물론, 인터페이스의 모든 메소드는 서브클래스에서 구현되어야 합니다.

인터페이스의 특징은 다음과 같습니다.

  • 인터페이스 클래스는 추상 클래스와 마찬가지로 인스턴스화할 수 없습니다.

  • 인터페이스의 모든 메소드는 모두 추상 메소드이므로 본문을 가질 수 없습니다.

  • 클래스는 쉼표로 구분된 여러 인터페이스를 구현할 수 있습니다(상속은 하나만 가능)

    class Dog implements 接口1,接口2{
    
    }
  • 인터페이스는 속성을 가질 수 있지만 상수만 가능하고 기본값은 public이지만 public으로 명시적으로 수정할 수는 없습니다.

  • 인터페이스의 모든 메소드는 상속용이므로 public을 사용하세요. . Write 수정자가 아닌 경우 기본값은 public

  • 인터페이스는 다른 클래스를 상속할 수 없지만 다른 인터페이스는 상속할 수 있습니다.

추상 및 인터페이스의 차이점

PHP의 상속은 단일 상속입니다. 즉, 클래스는 최대 하나의 상위 클래스만 가질 수 있습니다. 이 단일 상속 메커니즘은 클래스의 순수성을 보장할 수 있습니다. 그러나 이 메커니즘은 하위 클래스의 기능 확장에 일정한 영향을 미칩니다.

接口的出现可以说是对继承的一种补充,继承是层级的,不太灵活,而接口却没有它比抽象要灵活的多。并且实现接口在不打破继承关系的前提下,对子类的功能进行扩充。
它们两个的关系图可以理解为这样:
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으로 문의하세요.