>  기사  >  백엔드 개발  >  PHP 객체지향 추상 클래스에 대한 자세한 설명(코드 예제)

PHP 객체지향 추상 클래스에 대한 자세한 설명(코드 예제)

易达
易达원래의
2020-05-27 15:54:192263검색

이 기사의 목표:

1. PHP에서 추상 클래스의 정의를 이해합니다.

2. PHP에서 추상 클래스의 역할을 이해합니다.

3. PHP에서 추상 클래스의 사용 시나리오를 이해합니다.

4. PHP에서 추상 클래스 구현

앞선 일관된 생각을 계속 이어가면서 3W1H 방식으로 학습할 테니 먼저 이해해 봅시다

(1) PHP에서 추상 클래스의 정의를 이해합니다(What)

추상 클래스 은 자주 사용됩니다. 문제 영역의 분석 및 설계를 나타내는 abstract개념은 다르게 보이지만 본질적으로 동일한 일련의 특정 개념에 대한 abstract입니다. 일반적으로 프로그래밍 문에서 추상으로 수정되는 클래스는 추상 클래스입니다.

과 인터페이스의 차이점은 인터페이스의 메서드는 구현되지 않고 단순히 정의되지만 추상 클래스의 메서드는 구현할 수 있다는 것입니다.

(2) PHP에서 추상 클래스의 역할을 이해합니다(이유)

PHP의 클래스 중 많은 클래스가 지속적으로 재작성됩니다. 이때 추상 클래스를 어떻게 사용할 수 있나요? 즉, 먼저 공개 클래스를 작성한 다음 이를 인스턴스화한 후 반복적으로 호출할 수 있습니다. 이렇게 하면 코드의 재사용성이 향상될 수 있습니다.

(3) PHP에서 추상 클래스의 사용 시나리오 이해(Where)

1 코드의 많은 클래스가 유사하거나 공통된 메서드를 사용하는 경우 동일한 것을 사용할 수 있습니다. 또는 일반적인 메소드가 추출되어 추상 클래스로 캡슐화됩니다.

추상 클래스는 인터페이스와 다소 유사합니다. 모든 인터페이스에 추상 메서드가 있다는 점을 제외하면 인터페이스는 특별한 추상 클래스라고 할 수 있지만(소위 추상이라는 것은 특정 구현이 없음을 의미함) 일부 메서드는 추상입니다. 클래스는 구현 기능을 가질 수 있습니다.

(4), PHP에서 추상 클래스의 구체적인 구현을 마스터합니다(방법)

요약:

1 추상 클래스의 정의는 추상 클래스와 같이 정의됩니다. 클래스 이름 {}

2. 추상 클래스 메서드의 정의도 추상 공용 함수 메서드 이름()과 같이 정의됩니다.{}

3. 추상 클래스는 인스턴스화할 수 없습니다.

4. , Extensions

키워드를 사용하세요. 5. 추상 클래스의 하위 클래스는 추상 클래스에 구현되지 않은 모든 메서드를 구현해야 합니다. 즉, 추상 클래스의 모든 추상 메서드를 다시 작성해야 합니다. 추상 클래스는 추상 클래스에 구현된 메소드를 구현하지 않으며, 이러한 메소드도 호출할 수 있습니다. 실제로 상속을 결합하면 이를 매우 잘 이해할 수 있습니다.

이제 모든 요약은 연습을 통해 얻어집니다. 연습을 통해 요약을 시연하면 이해를 촉진하고 모든 사람이 요약을 통해 더 명확하고 직관적으로 이해할 수 있습니다. (5), 특정 코드

사례 1,


연습 목표:

1 . 추상 클래스의 정의는 추상 클래스 클래스 이름과 같이 추상으로 정의됩니다. {}

2. 추상 클래스 메서드의 정의도 추상 공용 함수 메서드 이름()과 같이 추상으로 정의됩니다. 코드는 다음과 같습니다:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
?>

Case 2,

실습 목표: 1. 추상 클래스는 다음과 같습니다. 인스턴스화할 수 없는

의 구체적인 코드는 다음과 같습니다.

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
$animal = new Animal();
?>

실행 결과는 다음과 같습니다.

Fatal error: Uncaught Error: Cannot instantiate abstract class Animal in D:\E-class\class-code\classing\index.php:10 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 10

案例四、

实践目标:

1、要继承一个抽象类,通过关键字extends

2、抽象类的子类必须要实现抽象类中未实现的所有方法,也就是说要重写抽象类中所有abstract的方法

具体代码如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
//定义猴子
class Monkey extends Animal{
    
}
?>

如果Monkey类继承了抽象类,但不实现里面的abstract方法,那么运行结果为:

Fatal error: Class Monkey contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Animal::eat) in D:\E-class\class-code\classing\index.php on line 13

接下来我们来实现abstract方法

具体代码如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
//定义猴子
class Monkey extends Animal{
    //实现抽象类中的抽象方法
    public function eat(){
        echo "我是猴子类中的eat方法<br/>";
    }
}
$monkey = new Monkey();
$monkey->eat();

?>

运行结果如下:

我是猴子类中的eat方法

案例五、

实践目标:

1、抽象类的子类虽然没有实现抽象类中的已经实现的方法,一样可以调用这些方法,其实结合继承我们可以很好理解这点

具体代码如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "抽象类中的呼吸方法<br/>";
    }
}
//定义猴子
class Monkey extends Animal{
    //实现抽象类中的抽象方法
    public function eat(){
        echo "我是猴子类中的eat<br/>";
    }
}
$monkey = new Monkey();
$monkey->eat();
$monkey->breath();
?>

运行结果如下:

我是猴子类中的eat
抽象类中的呼吸方法

(六)、学以致用

问题:将以下真实场景,用抽象类还原出来

小芳放学回到家中,一进家门,只见心爱的小狗“小爱”马上就对主人摇起了尾巴,小芳笑了笑,走过去,抱起了小狗,最后,小芳和小狗亲了一口

思路分析:

1、对象分析:学生,小狗

2、对象属性分析:结合(现实世界+具体场景)

    学生:名称

    狗:名称

3、对象方法分析:结合(现实世界+具体场景)

    学生:

        (1)、放学 

        (2)、回到家中

        (3)、走路

        (4)、看

        (5)、笑

        (6)、抱东西

        (7)、亲嘴

       狗:

        (1)、看

        (2)、摇尾巴

        (3)、亲嘴

4、我们发现这2个对象都有相似的方法,看,亲嘴,所以我们可以把它们封装到抽象类中,并且这2个方法不需要子类去重写,因为都是一样的

具体代码如下:

<?php
abstract class Animal{
    //看
    public function look($obj){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "看见了".$obj->name."<br/>";
    }
    //亲嘴
    public function kiss($fromobj,$toobj){
        echo $fromobj->name."亲了".$toobj->name."一口<br/>";
    }
    
}
//学生
class Student extends Animal{
   public $name = "";
   public function __construct( $name ){
       $this->name = $name;
   }
    // 1、放学
   public function offschool(){
       echo $this->name."放学了<br/>";
   }
   //回家
   public function goHome(){
    echo $this->name."回到家中<br/>";
   }
    // 2、走路
    public function walk(){
        echo $this->name."走了过去<br/>";
    }
    // 3、看

    // 4、笑
    public function smile(){
        echo $this->name."微笑了<br/>";
    }
    // 5、抱东西
    public function hug($obj){
        echo $this->name."抱起了".$obj->name."<br/>";
    }
    // 6、亲嘴
   
}
//狗
class Dog extends Animal{
   public $name = "";
   public function __construct( $name ){
       $this->name = $name;
   }
    //1、看

    //2、摇尾巴
    public function wagTail(){
        echo $this->name."摇了尾巴<br/>";
    }

    //3、亲嘴
}
//创建对象
$xf = new Student("小芳");
$dog = new Dog("小爱");
//小芳放学了
$xf->offschool();
//小芳放学回到家中,一进家门,只见心爱的小狗“小爱”马上就对主人摇起了尾巴,小芳笑了笑,走过去,
//抱起了小狗,最后,小芳和小狗亲了一口
//小芳回答家中
$xf->goHome();
//小芳看见小狗
$xf->look($dog);
//小狗摇尾巴
$dog->wagTail();
//小芳笑了笑
$xf->smile();
//小芳走过去
$xf->walk();
//抱起小狗
$xf->hug($dog);
//小芳亲了小狗
$xf->kiss($xf,$dog);
//小狗也亲了小芳
$dog->kiss($dog,$xf);
?>

运行结果为:

샤오팡은 학교를 떠났습니다
샤오팡이 집에 돌아와
샤오아이를 보고
샤오아이가 꼬리를 흔들고
샤오팡이 웃는다
샤오팡이 걸어온다
샤오팡이 샤오아이를 주웠어요
샤오아이 Fang이 Xiao Ai에게 키스했습니다
Xiao Ai가 Xiao Fang에게 키스했습니다

(7) 요약

1. 이 기사에서는 주로 PHP의 추상 클래스 정의와 기능 및 구체적인 구현에 대해 설명합니다

이 기사가 도움이 되기를 바랍니다. 도움이 좀 됐어요, 고마워요! ! !

위 내용은 PHP 객체지향 추상 클래스에 대한 자세한 설명(코드 예제)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.