Maison développement back-end Problème PHP Quelle est la différence entre l'interface et la classe abstraite en php

Quelle est la différence entre l'interface et la classe abstraite en php

Mar 15, 2021 pm 05:29 PM
php 抽象类 接口

La différence est la suivante : 1. L'interface est définie via le mot-clé interface et la classe abstraite est définie via le mot-clé abstract ; 2. L'interface n'a pas de membres de données, mais la classe abstraite a des membres de données, et la classe abstraite peut implémenter l'encapsulation des données ; 3. L'interface n'a pas de constructeur, mais la classe abstraite peut avoir un constructeur.

Quelle est la différence entre l'interface et la classe abstraite en php

L'environnement d'exploitation de ce tutoriel : système windows7, version PHP7.1, ordinateur DELL G3

1. Différences des interfaces

Lorsque vous apprenez le PHP orienté objet, vous serez toujours confus au sujet des classes abstraites et des interfaces. Pourquoi sont-elles si faciles à confondre alors qu'elles ont presque les mêmes fonctions ? débarrassé de l'autre ? Mais en fait, la différence entre les deux est encore très grande. Si vous parvenez à faire bon usage des deux méthodes de PHP, la programmation orientée objet sera plus raisonnable, claire et efficace.

a. L'interface est définie via le mot-clé interface et la classe abstraite est définie via le mot-clé abstract.
b. L'utilisation des interfaces est réalisée via le mot-clé Implements, tandis que le fonctionnement des classes abstraites est implémenté à l'aide du mot-clé extends de l'héritage de classe.
c. Les interfaces n'ont pas de données membres, mais les classes abstraites ont des données membres et les classes abstraites peuvent encapsuler des données.
d. Les interfaces n'ont pas de constructeurs et les classes abstraites peuvent avoir des constructeurs.
e. Les méthodes de l'interface sont toutes de type public, tandis que les méthodes de la classe abstraite peuvent être modifiées avec private, protected ou public.
f.Une classe peut implémenter plusieurs interfaces en même temps, mais ne peut implémenter qu'une seule classe abstraite.

Même point : rien ne peut être écrit dans les corps de fonctions des méthodes abstraites et des interfaces, pas même deux accolades ! ! ! Par exemple : function getName(); Cela fera l'affaire

2. Interface

En utilisant l'interface (interface), vous pouvez spécifier quelles méthodes une certaine classe doit implémenter, mais il n'est pas nécessaire de définir les spécificités de ces méthodes.

Une interface est définie via le mot-clé interface, tout comme la définition d'une classe standard, mais toutes les méthodes qui y sont définies sont vides.

Toutes les méthodes définies dans l'interface doivent être publiques. C'est une caractéristique de l'interface.

Implémentations

Pour implémenter une interface, utilisez l'opérateur Implements. La classe doit implémenter toutes les méthodes définies dans l'interface, sinon une erreur fatale sera signalée. Une classe peut implémenter plusieurs interfaces. Utilisez des virgules pour séparer les noms de plusieurs interfaces.

Remarque :
Lors de l'implémentation de plusieurs interfaces, les méthodes des interfaces ne peuvent pas avoir le même nom.

Remarque :
Les interfaces peuvent également être héritées, en utilisant l'opérateur extends.

Remarque :
Pour implémenter une interface, une classe doit utiliser des méthodes qui sont exactement les mêmes que celles définies dans l'interface. Sinon, une erreur fatale en résultera.

Constantes

Des constantes peuvent également être définies dans l'interface. Les constantes d'interface sont utilisées exactement de la même manière que les constantes de classe, mais ne peuvent pas être remplacées par des sous-classes ou des sous-interfaces.

 <?php

// 声明一个&#39;iTemplate&#39;接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}


// 实现接口
// 下面的写法是正确的
class Template implements iTemplate
{
    private $vars = array();

    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }

    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }

        return $template;
    }
}

// 下面的写法是错误的,会报错,因为没有实现 getHtml():
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
    private $vars = array();

    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
}
?>
Example #2 可扩充的接口

<?php
interface a
{
    public function foo();
}

interface b extends a
{
    public function baz(Baz $baz);
}

// 正确写法
class c implements b
{
    public function foo()
    {
    }

    public function baz(Baz $baz)
    {
    }
}

// 错误写法会导致一个致命错误
class d implements b
{
    public function foo()
    {
    }

    public function baz(Foo $foo)
    {
    }
}
?>
Example #3 继承多个接口

<?php
interface a
{
    public function foo();
}

interface b
{
    public function bar();
}

interface c extends a, b
{
    public function baz();
}

class d implements c
{
    public function foo()
    {
    }

    public function bar()
    {
    }

    public function baz()
    {
    }
}
?>
Example #4 使用接口常量

<?php
interface a
{
    const b = &#39;Interface constant&#39;;
}

// 输出接口常量
echo a::b;

// 错误写法,因为常量不能被覆盖。接口常量的概念和类常量是一样的。
class b implements a
{
    const b = &#39;Class constant&#39;;
}
?>
Copier après la connexion

http://php.net/manual/zh/lingual.oop5.interfaces.php

Classe abstraite

PHP 5. Prend en charge les classes abstraites et les méthodes abstraites. Les classes définies comme abstraites ne peuvent pas être instanciées. Toute classe doit être déclarée abstraite si au moins une méthode qu'elle contient est déclarée abstraite. Une méthode définie comme abstraite déclare uniquement sa méthode appelante (paramètres) et ne peut pas définir son implémentation de fonction spécifique.

Lors de l'héritage d'une classe abstraite, la sous-classe doit définir toutes les méthodes abstraites dans la classe parent ; de plus, le contrôle d'accès de ces méthodes doit être le même (ou plus détendu) que dans la classe parent. Par exemple, si une méthode abstraite est déclarée comme protégée, alors la méthode implémentée dans la sous-classe doit être déclarée comme protégée ou publique et ne peut pas être définie comme privée. De plus, les méthodes d'appel doivent correspondre, c'est-à-dire que le type et le nombre de paramètres requis doivent être cohérents. Par exemple, si une sous-classe définit un paramètre facultatif qui n'est pas inclus dans la déclaration d'une méthode abstraite de la classe parent, il n'y a pas de conflit entre les deux déclarations. Cela s'applique également aux constructeurs depuis PHP 5.4. Les déclarations des constructeurs avant PHP 5.4 pouvaient être différentes.

<?php
abstract class AbstractClass
{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
以上例程会输出:

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
Example #2 抽象类示例

<?php
abstract class AbstractClass
{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{

    // 我们的子类可以定义父类签名中不存在的可选参数
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
以上例程会输出:

Mr. Pacman
Mrs. Pacwoman
老代码中如果没有自定义类或函数被命名为“abstract”,则应该能不加修改地正常运行。
Copier après la connexion

http://php.net/manual/zh/lingual.oop5.abstract.php

Étude recommandée : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

Journalisation CakePHP Journalisation CakePHP Sep 10, 2024 pm 05:26 PM

Se connecter à CakePHP est une tâche très simple. Il vous suffit d'utiliser une seule fonction. Vous pouvez enregistrer les erreurs, les exceptions, les activités des utilisateurs, les actions entreprises par les utilisateurs, pour tout processus en arrière-plan comme cronjob. La journalisation des données dans CakePHP est facile. La fonction log() est fournie

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

Guide rapide CakePHP Guide rapide CakePHP Sep 10, 2024 pm 05:27 PM

CakePHP est un framework MVC open source. Cela facilite grandement le développement, le déploiement et la maintenance des applications. CakePHP dispose d'un certain nombre de bibliothèques pour réduire la surcharge des tâches les plus courantes.

See all articles