Maison développement back-end tutoriel php PHP OPP 和模式 (1)_PHP教程

PHP OPP 和模式 (1)_PHP教程

Jul 13, 2016 am 10:28 AM
abstract implements instanceof interface php

PHP高级程序设计 学习笔记 2014.06.09

本文将介绍抽象类、接口和一种称为契约式编程的技术。使用这些OPP机制,所编写的代码就不限于只能计算或者输出内容了。这些机制能够在概念层次上定义类之间交互作用的规则,也为应用程序的扩展和定制提供了基础。

1.抽象类

抽象类机制中总是要定义一个公共的基类,而将特定的细节留给继承者来实现。通过抽象概念,可以在开发项目中创建扩展性很好的架构。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。在类的声明中使用 abstract 修饰符就可以将某个类声明为抽象的。

1.1方法原型(prototype)

是指方法的定义中剔除了方法体之后的签名。它包括存取级别、函数关键字、函数名称和参数。他不包含({})或者括号内部的任何代码。例如下面的代码就是一个方法原型:

<span>public</span> <span>function</span> prototypeName(<span>$protoParam</span>)
Copier après la connexion

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。

1.2关于抽象类

1.3使用抽象类

<?<span>php
</span><span>abstract</span> <span>class</span><span> Car
{    
    </span><span>abstract</span> <span>function</span><span> getMaxSpeend();
}

</span><span>class</span><span> Roadster extends Car
{
    </span><span>public</span> <span>$Speend</span><span>;

    </span><span>public</span> <span>function</span> SetSpeend(<span>$speend</span> = 0<span>)
    {
        </span><span>$this</span>->Speend = <span>$speend</span><span>;
    }
    </span><span>public</span> <span>function</span><span> getMaxSpeend()
    {
        </span><span>return</span> <span>$this</span>-><span>Speend;
    }
}

</span><span>class</span><span> Street
{
    </span><span>public</span> <span>$Cars</span><span> ;
    </span><span>public</span> <span>$SpeendLimit</span><span> ;

    </span><span>function</span> __construct( <span>$speendLimit</span> = 200<span>)
    {
        </span><span>$this</span> -> SpeendLimit = <span>$speendLimit</span><span>;
        </span><span>$this</span> -> Cars = <span>array</span><span>();
    }
    
    </span><span>protected</span> <span>function</span> IsStreetLegal(<span>$car</span><span>)
    {
        </span><span>if</span> (<span>$car</span>->getMaxSpeend() < <span>$this</span> -><span> SpeendLimit)
        {
            </span><span>return</span> <span>true</span><span>;
        }
        </span><span>else</span><span>
        {
            </span><span>return</span> <span>false</span><span>;
        }
    }

    </span><span>public</span> <span>function</span> AddCar(<span>$car</span><span>)
    {
        </span><span>if</span>(<span>$this</span>->IsStreetLegal(<span>$car</span><span>))
        {
            </span><span>echo</span> 'The Car was allowed on the road.'<span>;
            </span><span>$this</span>->Cars[] = <span>$car</span><span>;
        }
        </span><span>else</span><span>
        {
            </span><span>echo</span> 'The Car is too fast and was not allowed on the road.'<span>;
        }
    }
}

</span><span>$Porsche911</span> = <span>new</span><span> Roadster();
</span><span>$Porsche911</span>->SetSpeend(340<span>);

</span><span>$FuWaiStreet</span> = <span>new</span> Street(80<span>);
</span><span>$FuWaiStreet</span>->AddCar(<span>$Porsche911</span><span>);

</span><span>/*</span><span>*
 *
 * @result
 * 
 * The Car is too fast and was not allowed on the road.[Finished in 0.1s]
 *
 </span><span>*/</span>
?>
Copier après la connexion

2.对象接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

接口是一种类似于类的结构,可用于声明实现类所必须声明的方法。例如,接口通常用来声明API,而不用定义如何实现这个API。

大多数开发人员选择在接口名称前加上大写字母I作为前缀,以便在代码和生成的文档中将其与类区别开来。

2.1使用接口

和集成抽象类需要使用 extends 关键字不同的是,实现接口使用的是 implements 关键字。一个类可以实现多个接口,这时,我们需要用逗号将他们隔开。如果将某个类标记为实现了某个接口,但却没有实现这个借口的所有方法,将会抛出错误。

2.2使用接口的案例

<?<span>php
</span><span>abstract</span> <span>class</span><span> Car
{    
    </span><span>abstract</span> <span>function</span> SetSpeend(<span>$speend</span> = 0<span>);
}

</span><span>interface</span><span> ISpeendInfo
{
    </span><span>function</span><span> GetMaxSpeend();
}

</span><span>class</span> Roadster <span>extends</span> Car <span>implements</span><span> ISpeendInfo
{

    </span><span>public</span> <span>$Speend</span><span>;

    </span><span>public</span> <span>function</span> SetSpeend(<span>$speend</span> = 0<span>)
    {
        </span><span>$this</span>->Speend = <span>$speend</span><span>;
    }

    </span><span>public</span> <span>function</span><span> getMaxSpeend()
    {
        </span><span>return</span> <span>$this</span>-><span>Speend;
    }
}

</span><span>class</span><span> Street
{

    </span><span>public</span> <span>$Cars</span><span> ;
    </span><span>public</span> <span>$SpeendLimit</span><span> ;

    </span><span>function</span> __construct( <span>$speendLimit</span> = 200<span>)
    {
        </span><span>$this</span> -> SpeendLimit = <span>$speendLimit</span><span>;
        </span><span>$this</span> -> Cars = <span>array</span><span>();
    }

    </span><span>protected</span> <span>function</span> IsStreetLegal(<span>$car</span><span>)
    {
        </span><span>if</span> (<span>$car</span>->getMaxSpeend() < <span>$this</span> -><span> SpeendLimit)
        {
            </span><span>return</span> <span>true</span><span>;
        }
        </span><span>else</span><span>
        {
            </span><span>return</span> <span>false</span><span>;
        }
    }

    </span><span>public</span> <span>function</span> AddCar(<span>$car</span><span>)
    {
        </span><span>if</span>(<span>$this</span>->IsStreetLegal(<span>$car</span><span>))
        {
            </span><span>echo</span> 'The Car was allowed on the road.'<span>;
            </span><span>$this</span>->Cars[] = <span>$car</span><span>;
        }
        </span><span>else</span><span>
        {
            </span><span>echo</span> 'The Car is too fast and was not allowed on the road.'<span>;
        }
    }
}


</span><span>$Porsche911</span> = <span>new</span><span> Roadster();
</span><span>$Porsche911</span>->SetSpeend(340<span>);

</span><span>$FuWaiStreet</span> = <span>new</span> Street(80<span>);
</span><span>$FuWaiStreet</span>->AddCar(<span>$Porsche911</span><span>);

</span><span>/*</span><span>*
 *
 * @result
 * 
 * The Car is too fast and was not allowed on the road.[Finished in 0.1s]
 *
 </span><span>*/</span>
?>
Copier après la connexion

3.instanceof 操作符

instanceof 操作符是PHP5中的一个比较操作符。他接受左右两边的参数,并返回一个boolean值。这个操作符是用来确定对象的某个实例是否为特定的类型,或者是否从某个类型继承,又或者实现类某个特定的接口。

<span>echo</span> <span>$Porsche911</span><span> instanceof Car;
</span><span>//</span><span>result:1</span>

<span>echo</span> <span>$Porsche911</span><span> instanceof ISpeendInfo;
</span><span>//</span><span>result:1</span>
Copier après la connexion

4.契约式编程

契约式编程是指在编写类之前实现声明接口的一种编程实践。这种方法在保证类的封装性方面非常有用。使用契约式编程技术,我们可以在创建应用程序之前定义出视图实现的功能,这和建筑师在修建大楼之前先画好蓝图的做法非常相似。

5.总结

抽象类是使用 abstract 关键字声明的类。通过将某个类标记为抽象类,我们可以推迟实现所声明的方法。要将某个方法声明为抽象方法,只要去掉包含所有大括号的方法实体,将方法声明的代码行用分号结束即可。

抽象类不能直接实例化,他们必须被继承。

如果某个类从抽象类继承,当它没有实现基类中所声明的所有抽象方法时,它就必须也被声明为抽象的。

在接口中,我们可以声明没有方法体的方法原型,这点与抽象类很相似。他们之间的区别在于,接口不能声明任何具有方法体的方法;并且他们使用的语法也不一样。为了将揭开规则强制加到某个类上,我们需要使用implements关键字,而不是extends关键字。

有些情况下我们需要确定某个类是否是特定类的类型,或者是否实现了特定的接口。 instanceof 分成适合完成这个任务。instanceof 检查三件事情:实例是否是某个特定的类型,实例是否从某个特定的类型继承,实例或者他的任何祖先类是否实现类特定的接口。

某些语言具有从多个类继承的能力,这称为多重继承。PHP不支持多重继承。想法,他提供了为一个类声明多个接口的功能。

接口在声明类必须遵循的规则时非常有用。契约式编程技术使用这一功能来增强封装性,优化工作流。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/780762.htmlTechArticlePHP高级程序设计 学习笔记 2014.06.09 本文将介绍抽象类、接口和一种称为契约式编程的技术。使用这些OPP机制,所编写的代码就不限于只能计...
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)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois 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.

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

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

See all articles