PHP: exemple de POO du monde réel

J'essaie d'apprendre la POO. Les exemples dits "du monde réel" dans les livres que je lis n'aident pas.

Tous les exemples comme Pet, Car, Human ne pas m'aider plus. J'ai besoin d'exemples réels qui aiment l'enregistrement, les pages de profil d'utilisateur, etc.

Un exemple:

$user->userName = $_POST['userName'];//save username
$user->password = $_POST['password'];//save password
$user->saveUser();//insert in database

, j'ai aussi vu:

$user->user = (array) $_POST;

Où :

private $user = array();

Contient toutes les informations dans un tableau.

Et dans cette même classe se trouve

$user->getUser($uid);
// which sets the $this->user array equal to mysqli_fetch_assoc() using 
//the user id.

Y a-t-il du monde réel exemples d'implémentation de la POO dans les nombreuses applications php différentes (enregistrement, connexion, compte utilisateur, etc)?

43
demandé sur Eric Leschinski 2009-08-28 00:37:18

7 réponses

La POO ne concerne pas seulement l'apparence et le fonctionnement d'une seule classe. Il s'agit également de la façon dont les instances d'une ou plusieurs classes fonctionnent ensemble.

C'est pourquoi vous voyez tant d'exemples basés sur des "voitures" et des "gens" parce qu'ils font vraiment du bon travail pour illustrer ce principe.

À mon avis, les leçons les plus importantes de la POO sont encapsulation et polymorphisme.

Encapsulation: données de couplage et la logique qui agit sur ces données ensemble d'une manière concise et logique polymorphisme: {[14] } la capacité d'un objet à ressembler et/ou à se comporter comme un autre.

Un bon exemple réel de ceci serait quelque chose comme un itérateur de répertoire. Où est ce répertoire? Peut-être que c'est un dossier local, peut-être que c'est distant comme un serveur FTP. Qui sait!

Voici une arborescence de classe de base qui démontre l'encapsulation:

<?php

interface DirectoryIteratorInterface
{
    /**
     * @return \Traversable|array
     */
    public function listDirs();
}

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface
{
    protected $root;

    public function __construct($root)
    {
        $this->root = $root;
    }
}

class LocalDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

class FtpDirectoryIterator extends AbstractDirectoryIterator
{
    public function listDirs()
    {
        // logic to get the current directory nodes and return them
    }
}

Chaque classe/objet est responsable de sa propre méthode de récupération d'un répertoire liste. Les données (variables) sont couplées à la logique (fonctions de classe, c'est-à-dire méthodes) qui utilise les données.

Mais l'histoire n'est pas terminée - rappelez-vous comment j'ai dit OOP est sur la façon dont les instances de classes fonctionnent ensemble, et pas une seule classe ou un objet?

Ok, alors faisons quelque chose avec ces données-imprimons-les à l'écran? Assurer. Mais comment? Le HTML? Texte brut? RSS? Nous allons remédier à cela.

<?php

interface DirectoryRendererInterface
{
    public function render();
}

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface
{
    protected $iterator;

    public function __construct(DirectoryIteratorInterface $iterator)
    {
        $this->iterator = $iterator;
    }

    public function render()
    {
        $dirs = $this->iterator->listDirs();
        foreach ($dirs as $dir) {
            $this->renderDirectory($dir);
        }
    }

    abstract protected function renderDirectory($directory);
}

class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "\n";
    }
}

class HtmlDirectoryRenderer extends AbstractDirectoryRenderer
{
    protected function renderDirectory($directory)
    {
        echo $directory, "<br>";
    }
}

Ok, nous avons maintenant quelques arborescences de classes pour parcourir et rendre les listes de répertoires. Comment utilisons-nous?

// Print a remote directory as HTML
$data = new HtmlDirectoryRenderer(
  new FtpDirectoryIterator('ftp://example.com/path')
);
$data->render();

// Print a local directory a plain text
$data = new PlainTextDirectoryRenderer(
  new LocalDirectoryIterator('/home/pbailey')
);
$data->render();

Maintenant, je sais ce que tu penses, " mais Peter, Je n'ai pas besoin de ces grands arbres de classe pour faire ça!"mais si vous pensez que vous manquez le point, tout comme je soupçonne que vous avez été avec les exemples" voiture "et" personnes". Ne vous concentrez pas sur les minuties de l'exemple - essayez plutôt de comprendre ce qui se passe ici.

Nous avons créé deux arborescences de classes où l'une (*DirectoryRenderer) utilise l'autre (*DirectoryIterator) d'une manière attendue - ceci est souvent appelé un contrat. Une instance de *DirectoryRenderer ne se soucie pas du type d'instance de *DirectoryIterator qu'elle reçoit, ni des instances de *DirectoryIterator ne se soucient de la façon dont elles sont rendues.

Pourquoi? Parce que nous les avons conçus de cette façon. Ils se branchent les uns aux autres et travaillent. C'est la POO en action .

77
répondu Peter Bailey 2017-03-31 13:49:13

Achetez un livre comme "PHP et Mysql applications quotidiennes pour les Nuls".

C'est vieux que je connais [2005] mais il montre des concepts de connexions utilisateur, de Forum, de caddies, etc. à la fois procéduraux et orientés objet avec Mysqli.

Cela m'a aidé à apprendre le PHP orienté objet, je l'ai beaucoup étudié. Bien la peine de l'argent.

La POO est un peu comme le regroupement des bits de votre programme en morceaux réutilisables. Ce n'est pas si difficile d'être honnête avec vous, l'idée de l'emballage de vos fonctions dans des classes.

Mini exemple du monde réel de choses POO ci-dessous:

BASE DE DONNÉES DE CLASSE
SESSIONS DE CLASSE
CLASSE WEBFORMS
CLASSE EMAIL

Comptes de classe (exemples de fonctions ci-dessous)
FONCTION SELECTACCOUNT
FONCTION CHECKPASSWORD
FONCTION CHECKUSERNAME
FONCTION CREATEACCOUNT

J'espère que vous continuez, PHP 6 sera re-conçu pour supporter la POO plus que jamais.

Bonne Chance!

7
répondu RockyBalboa 2011-02-03 12:24:41

Comme astropanic l'a dit, Vous pouvez jeter un oeil au code source d'un bon framework ou bibliothèque PHP. Je recommande Zend Framework , Il est très modulaire et a un excellent design professionnel. Je dirais que c'est un très bon morceau de code PHP orienté objet.

Pourtant, je pense que ce n'est pas si facile d'apprendre d'un énorme morceau de code de production, car il n'a pas vraiment été fait pour vous apprendre quoi que ce soit. Mais si vous voulez du code PHP orienté objet réel, le Framework Zend (ou Symfony, ou peut-être que CakePHP) est probablement le chemin à parcourir.

1
répondu mooware 2009-08-27 20:46:26

Je vous conseille de rester à l'écart de tout cadre en ce moment, si vous ne connaissez pas la POO, creuser dans zend ou tout autre cadre serait trop.

PHP OOP est quitter Drôle... comme ha ha drôle, parce que c'est supporté, mais PHP n'est pas un langage POO comme java ou c#.

Petit exemple juste pour souligner ma déclaration:

// define class
class User {
// define properties and methods
public $name = "";
}
// instantiate class
$user = new User; // or new User() or new user, it's all the same
echo $user->name;

Mais si vous voulez faire la POO "à la volée", vous pouvez faire ce qui suit:

$user = (object) array('name' => 'Peter');

, puis

$user->name;

Mais vous pouvez utiliser la POO comme vous serait en java ou c# mais pas dans la même mesure - et ont à l'esprit, les systèmes populaires comme wordpress et drupal ne sont pas purs POO! mais vous pouvez également faire de L'héritage et d'autres choses de la POO en PHP.

1
répondu kristian nissen 2009-08-27 21:01:52

Je ne suis pas allé loin en PHP OOP, mais plus j'y entre, plus il devient facile. Les exemples d'objets sont juste là pour vous permettre de comprendre comment fonctionne la POO. Je comprends et j'ai déjà vécu cela, la POO est à peu près les propriétés et les méthodes (variables et fonctions normales). J'ai moi-même programmé en POO réel en appliquant les exemples de mes tutoriels et je ne devais pas nécessairement être dans le monde réel. C'est juste comme été nourri à la cuillère et vous ne comprendriez jamais POO et serait facile à oublier. Mon conseil apprendre à comprendre. Si vous comprenez, vous pouvez faire n'importe quoi et réaliseriez la puissance de la POO. J'ai téléchargé ce livre et je pense que vous devriez aussi. Mais c'est comme quelqu'un qui construit vos applications pour vous...

Voici {[4] } un lien vers le livre PHP et Mysql applications quotidiennes pour les Nuls

1
répondu blakroku 2013-11-24 12:17:38

Bien que je sache que cette question a déjà été répondue, j'ai l'impression de pouvoir ajouter de la valeur ici.

Je ne crois pas que vous devriez utiliser PHP comme langage de programmation pour apprendre la POO. Si vous souhaitez apprendre la POO pour les applications web, vous devriez vraiment regarder C# ou Java. Une fois que vous avez appris la POO, vous pouvez appliquer cette connaissance à PHP. Un exemple d'un livre que j'ai utilisé pour apprendre la POO était Big Java by Cay S. Horstmann

Pourquoi je dis ça??? Parce qu'il y a littéralement des millions d'exemples sur PHP de la façon de faire des trucs, mais pas beaucoup sont des exemples de la façon de programmer correctement. En outre, PHP vous permet de prendre de nombreux raccourcis, ce qui ne serait pas acceptable avec les goûts de Java. En tant que tel, si vous programmez PHP avec une tête Java, alors je crois que vous serez un programmeur plus fort. La POO n'est pas spécifique au langage, c'est un paradigme de programmation.

Si vous devez apprendre la POO en utilisant PHP, alors je vous recommande de jeter un oeil à un vrai code source dans les dépôts publics de github. Vous pouvez les rechercher dans packagist.org. S'ils sont un référentiel public décent, ils contiendront un readme.md fichier qui vous montrerait comment utiliser les paquets composer. par exemple https://github.com/moltin/laravel-cart est un exemple de paquet de panier que vous pourriez utiliser dans votre application. Remarquez que vous n'avez pas besoin de regarder le code source du paquet pour comprendre ce que font les paquets. Le paquet a été écrit, et vous ne vous souciez pas de la façon dont ils fonctionnent, mais vous les utilisez si vous avez seulement besoin de savoir comment les utiliser. C'est exactement ce que la POO est d'environ.

Je me fiche de la façon dont la classe panier ajoute un article au panier, je veux juste créer un nouveau panier et y ajouter quelque chose.

Ce que vous faites cependant est de plonger dans le code source comme un outil pour comprendre comment fonctionne la POO.

Suite à cela, et probablement plus important encore, pour le développement d'applications web, je rechercherais le modèle de conception MVC.

La conception MVC Motif signifie Modèle, Vue, Contrôleur. Lorsque, dans le cas d'une application web, Le Modèle est responsable de la modélisation de la base de données, la vue est responsable de l'affichage d'un contenu à l'utilisateur. Le contrôleur est responsable de l'interaction avec le modèle et de la gestion des entrées de l'utilisateur.

Je pense alors que vous devriez essayer d'installer le Laravel Framework ou un autre "framework moderne décent" sur votre machine locale. Pourquoi est-ce que je dis moderne, parce que les frameworks modernes nécessitent un PHP minumum version de 5.3 + qui signifie que le PHP sur votre machine supporterait la POO réelle similaire à celle que vous obtiendriez des goûts de Java.

Il existe de nombreux tutoriels qui vous montreront comment créer des applications web dans laravel. Immédiatement, vous verrez que lorsque vous créez un contrôleur, vous étendez une BaseController. Lorsque vous créez un Modèle, vous étendez Éloquent. Cela signifie que vous utiliserez déjà le polymorphisme dans votre code. Vous verrez qu'en utilisant des classes, ils sont encapsulé, et vous verrez que chaque classe a un rôle spécifique.

Lorsque vous souhaitez interagir avec la base de données, vous créez initialement un objet new Model dans les méthodes du contrôleur. Au fur et à mesure que vous commencerez à en savoir plus, vous commencerez à apprendre à injecter des dépendances dans le contrôleur, puis à vider vos modèles et à créer des référentiels et des programmes vers des interfaces à la place.

Un livre décent sur l'apprentissage Laravel pour les débutants serait https://leanpub.com/codebright par Dale Rees. J'ai rencontré Dale lors D'un meetup Laravel il y a environ 2 semaines.

En outre, à mesure que vous développez des applications web, vous commencerez à apprendre à appliquer les principes suivants à votre programmation:

  • Principe De Responsabilité Unique
  • Principe Ouvert Fermé
  • Principe De Substitution De Liskov
  • Interface Segragation Principe
  • Inversion De Dépendance Principe
1
répondu Gravy 2013-12-11 08:25:56

Je suggère aussi de voir mon wrapper Arrayzy. C'est une bibliothèque de manipulation facile des tableaux PHP natifs de manière POO.

Donc, si vous travaillez avec des fonctions de tableau PHP natives-vous pouvez faire les mêmes choses dans la POO et Arrayzy vous aide avec, par exemple:

// Functional programming:
$array = ['a', 'b', 'c'];
$resultArray = array_merge($array, ['c', 'd']);

Et

// Object-oriented programming:
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']);
$obj->mergeWith(['c', 'd']);
$resultArray = $obj->toArray();

Dans les deux cas, le tableau sera:

Array(
    0 => 'a'
    1 => 'b'
    2 => 'c'
    3 => 'c'
    4 => 'd'
)

Vérifiez comment cette méthode mergeWith (ou autre) fonctionne-t-elle sous le capot.

Je pense que c'est un bel exemple qui montre que presque tout fonctionnelle code vous pouvez le remplacer par POO le code comme dans cette bibliothèque. Mais avec la POO, vous obtenez beaucoup plus et vous pouvez également vérifier la programmation fonctionnelle vs la POO question pour en savoir plus sur les inconvénients et les accessoires.

0
répondu Victor Bocharsky 2017-05-23 12:02:10