web-dev-qa-db-fra.com

PHP: le monde réel OOP Exemple

J'essaie d'apprendre la POO. Les soi-disant exemples du «monde réel» dans les livres que je lis ne m'aident pas. 

Tous les exemples tels que Pet, Car, Human ne m'aident plus. J'ai besoin d'exemples REAL LIFE tels que l'enregistrement, les pages de profil 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 d'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.

Existe-t-il des exemples concrets mettant en œuvre OOP dans les nombreuses applications PHP différentes (enregistrement, connexion, compte utilisateur, etc.)?

45
BDuelz

La POO ne concerne pas seulement l'apparence et le fonctionnement d'une classe. Cela concerne également la manière dont les instances d'une ou plusieurs classes fonctionnent ensemble.

C'est pourquoi vous voyez autant d'exemples basés sur "Cars" et "People", car ils illustrent très bien ce principe.

À mon avis, les leçons les plus importantes en OOP sont encapsulation et polymorphisme .

Encapsulation: Couplage concis et logique des données et de la logique qui les exploite Polymorphisme: Possibilité pour un objet de ressembler et/ou de se comporter comme un autre.

Un bon exemple du monde réel 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 distant, comme un serveur FTP. Qui sait!

Voici un arbre de classe de base qui illustre 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 d'extraction d'une liste de répertoires. 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 concerne la manière dont les instances de classes fonctionnent ensemble, et non une seule classe ou un seul objet.

Ok, faisons quelque chose avec ces données - les affiche à l'écran? Sûr. Mais comment? HTML? Texte brut? RSS? Parlons de ça.

<?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 arbres de classes pour parcourir et rendre les listes de répertoires. Comment les 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 vous pensez, "Mais Peter, je n'ai pas besoin de ces grands arbres de classe pour faire ça!" mais si vous pensez que cela vous échappe, c'est comme si je soupçonnais que vous avez été avec les exemples "Car" et "People". Ne vous concentrez pas sur les détails de l'exemple, essayez plutôt de comprendre ce qui se passe ici.

Nous avons créé deux arborescences de classes dans lesquelles l'un (*DirectoryRenderer) utilise l'autre (*DirectoryIterator) de la manière attendue (il s'agit souvent d'un contract). Une instance de *DirectoryRenderer ne se soucie pas du type d'instance de *DirectoryIterator qu'elle reçoit, pas plus que les instances de *DirectoryIterator ne s'inquiètent de la manière dont elles sont rendues.

Pourquoi? Parce que nous les avons conçus de cette façon. Ils se connectent les uns aux autres et travaillent. Ceci est OOP en action.

80
Peter Bailey

Achetez un livre du type "Applications quotidiennes PHP et Mysql pour les nuls".

Je connais l’ancien [2005], mais il présente les concepts de connexion des utilisateurs, de forum, de paniers d’achat, etc. dans la procédure et l’objet orienté avec Mysqli.

Cela m'a aidé à apprendre PHP orienté objet, je l'ai beaucoup étudié. Vaut bien l'argent.

La POO est un peu comme regrouper des éléments de votre programme en éléments réutilisables. Ce n’est pas si difficile d’être honnête avec vous, c’est juste l’idée de regrouper vos fonctions en classes. 

Exemple du monde réel avec OOP ci-dessous:

BASE DE DONNEES DE CLASSE
SESSIONS DE CLASSE
WEBFORMS DE CLASSE
COURRIEL DE COURS

COMPTES DE CLASSE (Exemple de fonctions ci-dessous)
SÉLECTION DE FONCTION
FONCTION CHECKPASS MOT
FONCTION CHECKUSERNAME
FONCTION CREATEACCOUNT

J'espère que vous continuerez, PHP 6 sera repensé pour prendre en charge OOP plus que jamais.

Bonne chance!

9
RockyBalboa

Je ne suis pas allé très loin PHP OOP, mais plus j'y vais, plus cela devient facile. Les exemples d’objets ne sont là que pour vous aider à comprendre comment OOP fonctionne. Je comprends et ai déjà vécu cela auparavant OOP ne concerne que les propriétés et les méthodes (variables et fonctions normales). J'ai programmé en temps réel OOP en appliquant moi-même les exemples de mon tutoriel et je n'avais pas nécessairement à être dans le monde réel. C'est comme si vous aviez été nourri à la cuillère et que vous ne comprendriez jamais OOP et qu'il serait facile à oublier. Mon conseil apprendre à comprendre. Si vous comprenez, vous pouvez faire n'importe quoi et vous rendrez compte du pouvoir de la POO. J'ai téléchargé ce livre et je pense que vous devriez aussi. Mais c'est comme si quelqu'un construisait vos applications pour vous ... 

Ici un lien vers le livre PHP et les applications quotidiennes Mysql pour les nuls 

1
blakroku

Comme l'a dit astropanic, vous pouvez jeter un coup d'œil au code source d'un bon framework PHP ou d'une bonne bibliothèque. Je recommande Zend Framework , il est très modulaire et présente un superbe design professionnel. Je dirais que c'est un très bon morceau de code PHP orienté objet.

Néanmoins, je pense qu’il n’est pas si facile d’apprendre à partir d’un énorme morceau de code de production, puisqu’il n’a pas été conçu pour vous apprendre quoi que ce soit. Mais si vous voulez du code PHP orienté objet dans le monde réel, le Zend Framework (ou Symfony, ou peut-être CakePHP) est probablement la solution.

1
mooware

Je vous conseillerais de rester à l'écart de tout cadre pour le moment, si vous ne connaissez pas la programmation orientée objet, creuser dans zend ou tout autre cadre serait trop.

PHP OOP est drôle, comme ha ha ha, car il est supporté, mais PHP n’est pas un langage OOP 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 OOP "à la volée", vous pouvez effectuer les opérations suivantes:

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

et alors

$user->name;

mais vous pouvez utiliser OOP comme vous le feriez en Java ou en C #, mais pas dans la même mesure - et gardez à l’esprit que des systèmes populaires tels que Wordpress et Drupal ne sont pas du pur OOP! mais vous pouvez également faire des héritages et d'autres classifications OOP dans PHP.

1
kristian nissen

Je suggère aussi de voir mon wrapper Arrayzy . C'est une bibliothèque native PHP de manipulation de tableaux dans OOP.

Donc, si vous travaillez avec des fonctions native PHP - vous pouvez faire la même chose dans OOP et Arrayzy vous y aidera, 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 de résultats sera:

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

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

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

0
Victor Bocharsky