PHPV5.3 revigore la programmation orientée objet avec une liaison statique retardée

Source : Internet
Auteur : utilisateur
Avec sa fonction de liaison statique différée (LSB), PHPV5.3 résout certains problèmes avec la programmation orientée objet (OOP). Découvrez comment LSB corrige les problèmes de programmation OOP de PHP et comment mettre en œuvre certains des modèles de conception bien connus orientés vers les objets qui nécessitent l'ORL. La programmation orientée objet (OOP) permet aux développeurs d'utiliser l'abstraction de données, l'encapsulation, la modularité, les polymorphismes, et «http://www."linkhref"/http://www."linkhref.com/

PHP V5.3 règle certains des problèmes liés à la programmation orientée objet (OOP) avec sa fonction de liaison statique différée (LSB). Découvrez comment LSB corrige les problèmes de programmation OOP de PHP et comment mettre en œuvre certains des modèles de conception bien connus orientés vers les objets qui nécessitent l'ORL.
La programmation orientée objet (OOP) permet aux développeurs de réduire et de simplifier le code en utilisant l'abstraction des données, l'encapsulation, la modularité, le polymorphisme et l'héritage, avec une compréhension approfondie de l'OOP. Comprendre les caractéristiques de l'OOP permet également aux encodeurs PHP de tirer parti des modèles de conception, certains des algorithmes connus pour résoudre des problèmes communs. PHP a fourni la fonctionnalité OOP depuis V3.0, mais les bizarreries dans la mise en œuvre OOP de PHP empêchera l'utilisation de certains modèles de conception communs jusqu'à ce que V5.3 arrive. Avec l'avènement de la fonction de liaison statique tardive (LSB) de PHP V5.3, ces bizarreries ont complètement disparu.

Cet article vous présente quelques-uns des modèles de conception qui existaient avant PHP V5.3, expliquant pourquoi ils ne fonctionnent pas. Les caractéristiques LSB de PHP V5.3 sont ensuite affichées, et les modèles de conception pour l'enregistrement d'un seul cas et de l'activité sont donnés.

Revisiter OOP

Si vous avez été exposé à PHP OOP dans le passé, vous êtes susceptible de décider de ne pas l'utiliser pour les raisons suivantes:

Lisez l'un des nombreux billets de blog affirmant PHP OOP est problématique.

Des tentatives ont été faites pour mettre en œuvre un modèle de conception simple, mais sans succès.

Pour PHP V5.3, les billets de blog sur OOP sont positifs, et le problème avec PHP OOP a été largement résolu. Il est temps de revenir à PHP OOP. Grâce à cet article, vous verrez quelques modèles de conception qui étaient problématiques avant V5.3: singleton, générateur, méthode d'usine, et l'enregistrement d'activité.

Singleton, générateur, et les modèles de conception de méthode d'usine sont considérés pour être créés modèles parce qu'ils aident à la construction des objets. Le mode Singleton est probablement l'un des modèles de conception OOP les plus couramment utilisés; Les pools de connexions de base de données, par exemple, sont un exemple d'un modèle de conception à un seul cas : nous ne voulons généralement pas que les applications aient de multiples instances à forte intensité de ressources de classes de pool de connexion.

Lorsque vous devez séparer la construction et la représentation d'objets complexes, vous devez utiliser le modèle de conception du générateur, que vous pouvez utiliser pour créer plusieurs objets en utilisant le même processus de construction. La mise en œuvre du modèle du générateur peut être complexe, mais une fois que le générateur est disponible, il peut simplifier la construction et l'utilisation des objets que le générateur crée. Un convertisseur avec la capacité de sortie HTML, XML, ou PDF est un exemple de la nécessité d'utiliser un générateur.

Le modèle de méthode d'usine, comme son nom l'indique, définit la mise en œuvre d'une méthode utilisée pour produire un grand nombre d'objets. Vous pouvez utiliser le modèle de méthode d'usine lorsqu'une application doit créer des objets dont les types dépendent de l'implémentation de sous-classes.

Le modèle d'enregistrement actif peut être utilisé pour envelopper les méthodes de persistance de la base de données relationnelles dans une classe de domaine. Chaque instance d'un enregistrement actif se rapporte à une ligne spécifique dans la base de données. Cette classe contient des méthodes pour insérer, supprimer et mettre à jour une ou plusieurs lignes dans une base de données. Le modèle de conception d'enregistrement d'activité a été défini par Martin Fowler dans Patterns of Enterprise Application Architecture et est de plus en plus populaire pour une utilisation dans Ruby on Rails.

Problème de mise en œuvre du modèle de conception créé par pré-LSB

Les quatre modèles de conception mentionnés ci-dessus utilisent des propriétés et des méthodes statiques. Par exemple, jetez un oeil à ce singleton pool de connexion, comme indiqué dans la liste 1.

Liste 1. Un cas simple et unique

classe ConnPool
$onlyOne privés privés;
$count statiques privés s 0;
fonction privée s.construct()
monde réel db conn stuff ici ...
}

fonction publique statique getInstance()
if (!'is-object(self::$onlyOne))
$klass classe s..
auto:: $onlyOne'$onlyOne nouvelle $klass ();
auto:: $count
}
retour auto:: $onlyOne;
}
fonction publique statique getInstanceCount() sreturn self::$count;
}

$db s ConnPool:getInstance();
affirmer (1 s $db-gt;getInstanceCount());
$db2 s ConnPool:: getInstance ();
affirmer (1 s $db2-gt; getInstanceCount());
??
Notez cette variable $onlyOne statique. La variable est conçue pour contenir une instance de l'objet de pool de connexion. $onlyOne avant que le modificateur statique ne relie cette variable à la classe elle-même. $onlyOne variable est une propriété de classe parce que sa portée est la classe. La propriété $onlyOne n'a qu'une seule instance. Lorsqu'une propriété n'a pas de modificateur statique, on l'appelle propriété objet parce qu'elle est unique à chaque instance de la classe.

Notez que la méthode du constructeur De ConnPool (appelée?construct?) est vide. Dans une implémentation de production, vous pouvez utiliser cette méthode pour créer des intervalles pour les pools de connexion de base de données.

La méthode getInstance statique contient un code de modèle à un seul cas. Il crée une instance de $onlyOne seulement lorsque la variable $onlyOne statique est vide. Remarquez comment il utilise le sCLASS?variable pour obtenir le type de la classe et ensuite créer une instance de la classe.

Le getInstanceMethod est utilisé uniquement pour prouver qu'une seule instance du pool de connexion a été créée. Les quatre lignes de code au bas de la liste 1 prouvent qu'il retourne le même objet, peu importe combien de fois une instance de la classe de pool ConnPool est demandée.

Donc, jusqu'à présent, ce singleton est très bien - jusqu'à ce que vous décidez que vous voulez sous-classer le pool de connexion sous la forme d'un arbre d'héritage orienté objet pour prendre en charge plusieurs bases de données. La liste 2 montre cet arbre d'héritage (les compteurs d'instance et les codes constructeurs ont été supprimés pour plus de clarté).

Liste 2. Une tentative ratée d'un single sans LSB

classe ConnPool
$onlyOne privés privés;
la $klass de la statique de la classe s--- s..

fonction publique statique getInstance()
if (!'is-object(self::$onlyOne))
auto::$onlyOne'auto nouvelle::$klass ();
}
retour auto:: $onlyOne;
}
}

Classe ConnPoolAS400 prolonge ConnPool
la $klass de la statique de la classe s--- s..
}
$db s ConnPoolAS400:: getInstance ();
affirmer ('ConnPoolAS400's get-class ($db); Échoue
??
Pour prendre en charge plusieurs types de classes de singleton, la classe ConnPool ajoute une $klass variable statique et suppose qu'elle sera écrasée dans la sous-classe. La sous-classe ConnPoolAS400 étend la classe ConnPool et fournit sa propre version de la propriété $klass. Nous nous attendons à ce que lorsqu'une instance de la classe ConnPoolAS400 est créée, la propriété $klass sauvera le ConnPoolAS400. Mais lorsque vous exécutez le code, il ne fonctionne pas comme prévu. Lorsque la fonction d'utilité PHP get-class retourne ToConnPool au lieu de ConnPoolAS400, la déclaration au bas du code échoue. Le problème est que la méthode getInstance de la classe ConnPool utilise sa propre version de propriété $klass au lieu de la version de la pari de ConnPoolAS400.

Nous contacter

Le contenu de cette page provient d'Internet et ne reflète pas l'opinion d'Alibaba Cloud ; les produits et services mentionnés sur cette page n'ont aucune relation avec Alibaba Cloud. Si le contenu de la page vous semble problématique, veuillez nous écrire un courriel, nous traiterons le problème dans les 5 jours suivant la réception de votre message.

Si vous constatez des cas de plagiat de la part de la communauté, veuillez envoyer un courriel à : info-contact@alibabacloud.com et fournir des preuves pertinentes. Un membre de notre équipe vous contactera dans les 5 jours ouvrables.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.