web-dev-qa-db-fra.com

Quand utiliser une classe contre une fonction dans PHP

L'ampoule n'a pas encore fonctionné pour cela ...

J'aimerais vraiment une explication facile à comprendre de l'avantage d'utiliser une classe en php plutôt que d'utiliser des fonctions.

Voici un exemple simple de la pensée que j'ai maintenant et je me demande si une classe est plus efficace:

Disons que j'ai un mini widget de calendrier que j'ai construit en php. Je pense à appeler la fonction miniCal('arrayVars1', 'var2'). Mais je pourrais le faire deux fois sur cette page. Utilisez-vous moins de ressources en utilisant une classe ici, créez-en de nouvelles instances?

Quel arbre devrais-je aboyer ici, parce que j'ai l'impression qu'en ce moment l'arbre est un mur de briques ...

61
jay

Les classes sont utilisées pour représenter les données sous forme d'objets. Si vous représentez quelque chose comme les données d'un utilisateur ou une offre d'enchères, la création d'un objet Utilisateur ou d'un objet AuctionBid facilite la conservation de ces données, leur transmission dans votre code et la rend plus facile à comprendre pour les lecteurs. Ces classes auraient des attributs (champs de données comme des nombres, des chaînes ou d'autres objets) ainsi que des méthodes (fonctions que vous pouvez opérer sur n'importe quelle classe).

Les cours n'offrent généralement aucun avantage en termes de performances, mais ils ont très rarement des effets négatifs non plus. Leur véritable avantage est de rendre le code plus clair.

Je vous recommande de lire le PHP5 Object-Oriented Programming Guide et le Wikipedia OOP entry .

52
Kaleb Brasee

Une chose courante à faire depuis PHP5 était de créer des classes qui agissent comme des bibliothèques. Cela vous donne l'avantage d'organiser vos fonctionnalités et de profiter des fonctionnalités de classe comme __autoload ();

Par exemple, imaginez que vous disposez de deux fonctions pour crypter et décrypter les données. Vous pouvez les envelopper dans une classe (appelons-le Cryptage) et en faire des fonctions statiques. Vous pouvez ensuite utiliser les fonctions comme celle-ci (notez qu'aucune initialisation n'est nécessaire (c'est-à-dire $ obj = nouveau chiffrement)):

$encrypted_text = Encryption::encrypt($string);

et

$decrypted_text = Encryption::decrypt($string);

Les avantages de ceci sont:

  1. Votre fonctionnalité de cryptage est regroupée et organisée. Vous et toute personne conservant le code savez où trouver votre fonctionnalité de chiffrement.
  2. C'est très clair et facile à lire. Bon pour la maintenabilité.
  3. Vous pouvez utiliser __autoload () pour inclure automatiquement la classe pour vous. Cela signifie que vous pouvez l'utiliser comme s'il s'agissait d'une fonction intégrée.
  4. Parce qu'il est contenu dans sa propre classe et son propre fichier, il est réutilisable et peut facilement être porté vers de nouveaux projets.
38
John Conde

L'utilisation de classes est un bon moyen de regrouper vos fonctions.

La différence réside dans l'utilisation du paradigme de programmation. Les cours sont nécessaires en O.O.P. mais ne sont pas nécessaires dans le paradigme procédural. Dans le paradigme procédural, vous pouvez regrouper des fonctions dans un fichier, qui peut être considéré comme un module.

--- modifier ---

Vous pouvez utiliser paradigme procédural. Les cours ne sont pas vraiment nécessaires dans ce paradigme.

function miniCal($string_1, $string_2){
//do something   
}

//invoke function
miniCal('arrayVars1', 'var2');

Vous pouvez utiliser paradigme OOP. Des cours sont nécessaires.

class Calculation {

public static function miniCal($string_1, $string_2){
    //do something   
    }
}

//invoke function
Calculation::miniCal('arrayVars1', 'var2');

Conclusion

Les deux paradigmes fonctionnent, mais l'exemple OOP ci-dessus utilise un objet Calculs qui contient toutes les méthodes de calcul (fonctions). L'objet Calculs regroupe les fonctions de calcul, les gardant ainsi au même endroit.

L'O.O.P. dans cet exemple, le paradigme obéit à un principe appelé "Responsabilité solide". L'idée derrière cela est de garder le code élégant, maintenable et lisible.

6
Julian

Les fonctions sont la viande de votre application et les cours ressemblent plus à l'assiette. C'est désordonné de manger de la viande sans assiette. Mais si vous n'avez pas de viande, vous n'avez pas de repas.

Si vous avez 500 fonctions dans vos applications, vous voudrez probablement en regrouper au moins la moitié dans des collections plus grandes pour en faciliter l'accès. Vous pouvez concevoir des conventions de dénomination communes ("Encryption_Encrypt", "Encycryption_Decrypt", etc.) ... mais les classes sont simplement plus faciles. Si vous n'avez que 12 fonctions dans votre application, vous pourriez probablement survivre avec seulement 1 ou des classes, le cas échéant.

Je n'ai pas souvent besoin de stocker des données/propriétés dans les classes. J'ai tendance à les stocker dans la base de données. Je n'ai donc pas souvent profité de cet aspect des cours.

Les classes permettent également le polymorphisme, ce qui peut être utile. Si vous avez plusieurs classes extrêmement similaires, ou plusieurs variantes d'une classe, vous pouvez enregistrer du code ... sans avoir à construire une classe polyvalente de type Frankenstein.

4
John Doe

J'ai une liste d'endroits où vous utiliseriez des classes de style OOP dans ma réponse à cette question: https://stackoverflow.com/questions/2035449/why-is-oop-hard-for-me/2035482# 2035482

Fondamentalement, chaque fois que vous voulez représenter un objet qui contient des choses. Comme une variable de base de données qui possède une connexion unique. Je voudrais donc stocker cela afin que je puisse m'assurer que le mysql_query utilise la bonne connexion à chaque fois:

class MySQL extends Database
{
    public function connect($Host, $user, $pass, $database)
    {        
        $this->connection = mysql_connect($Host, $user, $pass);
        $this->select_db($database);
    }

    public function query($query)
    {
        return mysql_query($query, $this->connection);
    }

    public function select_db($database)
    {
        mysql_select_db($database);
    }    
}

Ou peut-être que vous souhaitez créer un formulaire, vous pouvez créer un objet de formulaire qui contient une liste d'entrées et tel que vous souhaitez être à l'intérieur du formulaire lorsque vous décidez de l'afficher:

class Form
{
    protected $inputs = array();
    public function makeInput($type, $name)
    {
         echo '<input type="'.$type.'" name="'.$name.'">';
    }

    public function addInput($type, $name)
    {
         $this->inputs[] = array("type" => $type,
                "name" => $name);
    }

    public function run()
   {
       foreach($this->inputs as $array)
       { 
          $this->makeInput($array['type'], $array['name'];
       }
    }
}

$form = new form();

$this->addInput("text", "username");
$this->addInput("text", "password");

Ou comme quelqu'un l'a suggéré, une personne:

class Person{

    public $name;
    public $job_title;
    // ... etc....

}

Toutes sont des raisons de créer des classes car elles représentent quelque chose qui a des propriétés comme un nom ou un titre de poste, et peuvent avoir des méthodes, telles que l'affichage d'un formulaire.

2
Tyler Carter

Fondamentalement, les deux font le même travail, mais en utilisant des classes, vous pouvez gérer votre code plus facilement.Une chose de plus si nous utilisons la classe, nous devons créer un objet pour appeler les fonctions qui y sont définies, tandis que si nous créons des fonctions directement, nous n'avons pas besoin pour créer un objet.

0
Priyank Dadhich