Classes d'interface en PHP

  • MasterZ
  • Expert
  • Expert
  • Avatar de l’utilisateur
  • Inscription: Déc 04, 2004
  • Messages: 699
  • Loc: Colorado Springs
  • Status: Offline

Message Mai 5th, 2009, 9:32 pm

Hey guys,

Comme plusieurs d'entre vous le savent Im un vétéran Im à PHP, mais tout à l'heure à essayer d'apprendre la programmation orientée objet de ce côté (je sais, sur le temps, hein?).

Ive a obtenu une grande partie de la base vers le bas, mais se demande si j'ai 2 classes différentes, peut fonctionner dans une classe de faire usage d'une fonction dans une autre classe ou d'avoir fait quelque chose de spécial à se produire en premier?

Merci.

- Jon
Image Eternal Truth Ministry - Biblical Resources, Forums
Have mercy on me, O God, according to your unfailing love; according to your great compassion blot out my transgressions. - Psalm 51:1 http://www.zssites.net - ZS Sites Web Hosting
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Mai 5th, 2009, 9:32 pm

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13458
  • Loc: Florida
  • Status: Offline

Message Mai 5th, 2009, 9:41 pm

Si les deux catégories se partageront un peu de propriétés et / ou des méthodes qui ne le serait autrement inutile par eux-mêmes, vous pouvez coller l'ensemble de ces communes membres dans un Abstract Base Class et ont tous les deux de vos classes étendre cette classe de base.

Si je mal compris ce que vous entendez par "l'utilisation de fonctions. :)
Strong with this one, the sudo is.
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8212
  • Loc: USA
  • Status: Offline

Message Mai 5th, 2009, 9:51 pm

:lol: Quel que soit le nombre d'articles sur les classes abstraites et les exemples que je viens de lire, je ne peux pas les saisir :banghead:
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • MasterZ
  • Expert
  • Expert
  • Avatar de l’utilisateur
  • Inscription: Déc 04, 2004
  • Messages: 699
  • Loc: Colorado Springs
  • Status: Offline

Message Mai 6th, 2009, 2:21 am

Un exemple qui Im pense (mais ne l'ont pas encore essayé), dire que j'ai un jeu, avec 2 classes. 1 est l'accès aux bases de données, l'autre est le caractère. Puis-je avoir une méthode de caractères (ex. $ character-> add_exp (10)) utiliser la méthode de base de données (par exemple, $ db-> query (mise à jour de jeu de caractères de 10 exp = exp où id = 1))?

Est-ce qu'il ya quelque chose que je dois faire pour parler à ces classes eux ou je peux juste faire ça comme ça?

Merci. :)

S'il vous plaît pardonnez-sql toute erreur de syntaxe, de son juste un exemple rapide
Image Eternal Truth Ministry - Biblical Resources, Forums
Have mercy on me, O God, according to your unfailing love; according to your great compassion blot out my transgressions. - Psalm 51:1 http://www.zssites.net - ZS Sites Web Hosting
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13458
  • Loc: Florida
  • Status: Offline

Message Mai 6th, 2009, 3:04 am

Code: [ Select ]
class db {...}
class utilizes_db
{
public function add_exp($exp)
{
     global $db;
     $db->query(...);
}
}
$db = new db();
$obj = new utilizes_db();
$obj->add_exp(10);
  1. class db {...}
  2. class utilizes_db
  3. {
  4. public function add_exp($exp)
  5. {
  6.      global $db;
  7.      $db->query(...);
  8. }
  9. }
  10. $db = new db();
  11. $obj = new utilizes_db();
  12. $obj->add_exp(10);
Strong with this one, the sudo is.
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6134
  • Loc: Seattle, WA
  • Status: Offline

Message Mai 6th, 2009, 7:53 am

Vous avez besoin d'en apprendre davantage sur la programmation orientée-objet avant de pouvoir commencer à apprendre et à utiliser correctement les classes. Vous ne pouvez pas commencer à coller des variables et des fonctions dans les classes et l'appeler orientée objet, il ne fonctionne pas de cette façon.

http://staffweb.londonmet.ac.uk/~chalkp ... cepts.html
http://www.aonaware.com/OOP1.htm
The Beer Monocle. Classy.
  • MasterZ
  • Expert
  • Expert
  • Avatar de l’utilisateur
  • Inscription: Déc 04, 2004
  • Messages: 699
  • Loc: Colorado Springs
  • Status: Offline

Message Mai 6th, 2009, 1:47 pm

Im essayant d'apprendre. Im complètement nouvelle à ce :D

http://www.killerphp.com est une bonne introduction à la programmation orientée objet.
Image Eternal Truth Ministry - Biblical Resources, Forums
Have mercy on me, O God, according to your unfailing love; according to your great compassion blot out my transgressions. - Psalm 51:1 http://www.zssites.net - ZS Sites Web Hosting
  • Nightslyr
  • Proficient
  • Proficient
  • No Avatar
  • Inscription: Sep 21, 2005
  • Messages: 274
  • Status: Offline

Message Mai 7th, 2009, 2:05 pm

joebert a écrit:
Code: [ Select ]
class db {...}
class utilizes_db
{
   public function add_exp($exp)
   {
      global $db;
      $db->query(...);
   }
}
$db = new db();
$obj = new utilizes_db();
$obj->add_exp(10);
  1. class db {...}
  2. class utilizes_db
  3. {
  4.    public function add_exp($exp)
  5.    {
  6.       global $db;
  7.       $db->query(...);
  8.    }
  9. }
  10. $db = new db();
  11. $obj = new utilizes_db();
  12. $obj->add_exp(10);


:o

Si vous devez utiliser un mondial brut, vous le faites mal.

Pour l'OP, il existe quelques moyens que vous pourriez faire:

Le plus simple serait de créer une nouvelle base de données objet à chaque fois que vous ajoutez l'exp. Quelque chose comme:

Code: [ Select ]
public function addExp($exp)
{
   $db = new Database();
   $db->query(/* the query */);
}
  1. public function addExp($exp)
  2. {
  3.    $db = new Database();
  4.    $db->query(/* the query */);
  5. }


Cela devient inefficace s'il ya des appels multiples à la fonction à chaque rechargement de la page. Aussi, selon votre conception, vous devrez sans doute plusieurs connexions à la BD à un moment donné - dans le code principal, et dans l'objet.

Une meilleure façon serait de rendre la base de données un membre de l'objet caractère:
Code: [ Select ]
class Character
{
   private $db;
   private $exp;
 
   /* assuming everything is constructed properly */
 
   public function addExp($exp)
   {
      $this->db->query(/* query */);
   }
}
  1. class Character
  2. {
  3.    private $db;
  4.    private $exp;
  5.  
  6.    /* assuming everything is constructed properly */
  7.  
  8.    public function addExp($exp)
  9.    {
  10.       $this->db->query(/* query */);
  11.    }
  12. }


Cette méthode a le même potentiel écueil de la précédente - la possibilité de connexions multiples à la DB.

Thats où un singleton qu'intervient un singleton est un objet qui se comporte comme un mondiale, mais est plus sûr parce qu'il ne peut pas être remplacé, et un seul mai existent à tout moment. Votre objet base de données devrait être un singleton afin que tous les autres objets et le code principal peut l'utiliser, car cela réduit à néant la possibilité de connexions multiples glissent dans votre code.

Singletons sont simples à créer:
Code: [ Select ]
class Database
{
   private static $instance;
 
   private final function __construct(){};
 
   public static function getInstance()
   {
      if(!self::$instance)
      {
         self::$instance = new self();
      }
 
      return self::$instance;
   }
}
  1. class Database
  2. {
  3.    private static $instance;
  4.  
  5.    private final function __construct(){};
  6.  
  7.    public static function getInstance()
  8.    {
  9.       if(!self::$instance)
  10.       {
  11.          self::$instance = new self();
  12.       }
  13.  
  14.       return self::$instance;
  15.    }
  16. }


Donc maintenant vous pouvez simplement écrire:
Code: [ Select ]
public function addExp($exp)
{
   $db = Database::getInstance();
   $db->query(/* query */);
}
  1. public function addExp($exp)
  2. {
  3.    $db = Database::getInstance();
  4.    $db->query(/* query */);
  5. }
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8212
  • Loc: USA
  • Status: Offline

Message Mai 7th, 2009, 2:11 pm

@ Nightslyr: Ou vous pouvez faire ce que je fais...vérifier si la base de données est connecté, et s'il l'est, ne se connectent pas.

Code: [ Select ]
<?php
function connect($dbname = null)
{
    // Checking if we are already connected to MySQL
    if(is_resource($this->mysql_link) || @mysql_ping($this->mysql_link))
    {
        return true;
    }
   
    // Connecting to MySQL
    if($this->persistant)
    {
        // Persistant connect
        $this->mysql_link = @mysql_pconnect($this->host, $this->user, $this->pass);
    }
    else
    {
        // Normal Connect
        $this->mysql_link = @mysql_connect($this->host, $this->user, $this->pass);
    }
   
    // If we are still not connected, then die with some debugging script
    if(!is_resource($this->mysql_link))
    {
        die($debug);
    }
   
    // Selecting the Database
    $this->dbselect($dbname);
}
?>
  1. <?php
  2. function connect($dbname = null)
  3. {
  4.     // Checking if we are already connected to MySQL
  5.     if(is_resource($this->mysql_link) || @mysql_ping($this->mysql_link))
  6.     {
  7.         return true;
  8.     }
  9.    
  10.     // Connecting to MySQL
  11.     if($this->persistant)
  12.     {
  13.         // Persistant connect
  14.         $this->mysql_link = @mysql_pconnect($this->host, $this->user, $this->pass);
  15.     }
  16.     else
  17.     {
  18.         // Normal Connect
  19.         $this->mysql_link = @mysql_connect($this->host, $this->user, $this->pass);
  20.     }
  21.    
  22.     // If we are still not connected, then die with some debugging script
  23.     if(!is_resource($this->mysql_link))
  24.     {
  25.         die($debug);
  26.     }
  27.    
  28.     // Selecting the Database
  29.     $this->dbselect($dbname);
  30. }
  31. ?>


Lisez également cet mettre en avant...selon Joebert, vous n'êtes pas censé avoir le __construct (); privé.
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • Nightslyr
  • Proficient
  • Proficient
  • No Avatar
  • Inscription: Sep 21, 2005
  • Messages: 274
  • Status: Offline

Message Mai 7th, 2009, 2:22 pm

Ça va marcher pour les objets PB multiples? Comme dans:

Code: [ Select ]
$db1 = new Database();
$db2 = new Database();
 
$db1->connect(/* some db name */);
$db2->connect(/* same name */);
  1. $db1 = new Database();
  2. $db2 = new Database();
  3.  
  4. $db1->connect(/* some db name */);
  5. $db2->connect(/* same name */);


D'après ce que je peux voir, à moins que $ mysql_link est défini dans le constructeur, codés en dur lorsque le membre de données est déclarée, ou déclarées comme statique, la comparaison initiale échouera toujours que $ mysql_link sera nulle jusqu'à ce que cet objet se connecte à la DB.

EDIT: Je ne suis pas d'accord avec Joebert. Id bien utiliser plutôt un singleton que l'espoir que quelqu'un fait en sorte de nommer l'échelle mondiale liée à la variable correctement (sans parler de l'écraser par accident ou de le supprimer). Sans parler de l'utilisation de l'encapsulation global Choisissez pauses, comme quelqu'un utilisant la classe a besoin de savoir comment un membre de classe est nommé avant de pouvoir utiliser la classe correctement.

Globals sont mauvais en soit, mais si vous allez les utiliser, vous pourriez aussi bien être en sécurité avec eux. Id sacrifier volontiers le constructeur de mon objets d'interface public de le faire.
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8212
  • Loc: USA
  • Status: Offline

Message Mai 7th, 2009, 2:53 pm

Je ne sais pas si cela peut le faire...Globals-je utiliser pour mon site et il n'ya aucun problème avec eux que je vois...il m'aide à organiser effectivement le codage un peu.
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13458
  • Loc: Florida
  • Status: Offline

Message Mai 8th, 2009, 5:26 am

Quote:
Si vous devez utiliser une matière première mondiale, vous le faites mal.


Oui parce que d'une salle de bains dans chaque pièce de votre maison est une bonne idée. :roll:
Strong with this one, the sudo is.
  • Nightslyr
  • Proficient
  • Proficient
  • No Avatar
  • Inscription: Sep 21, 2005
  • Messages: 274
  • Status: Offline

Message Mai 8th, 2009, 8:41 am

joebert a écrit:
Quote:
Si vous devez utiliser une première mondiale, vous le faites mal.


Ouais parce qu'en ayant une salle de bains dans chaque pièce de votre maison est juste une bonne idée. :roll:


gif "alt =": roll: "title =" Rolling Eyes ">

Utilisation du "global" est le mot-clé antithèse de la POO. Les objets doivent pas besoin d'avoir une connaissance intime du code qui les utilise, et le code principal ne doit pas besoin de savoir comment le fonctionnement interne d'une œuvre d'objet. Ce qui compte est la interface . Les objets doivent avoir une interface public clairement défini que le code principal utilise pour communiquer avec les objets afin d'effectuer des opérations. Si quelque chose dans le code principal doit être travaillé par l'objet, puis elle doit être passée en argument dans cette méthode.

Globales brutes sont dangereux car ils favorisent un couplage fort et peut être remplacé à tout moment. Cela rend le code plus difficile à déboguer et moins modulaire. C'est pourquoi globales devraient être évitées. Cependant, s'il est déterminé que par une approche globale est la seule ou la meilleure façon de résoudre un problème, puis un singleton atténue certains négatifs A Global premières a. Une solution encore meilleure serait de créer ce que quelqu'un appelle un Singlestantiator:
Code: [ Select ]
class Singlestantiator
{
   private static $instantiated = false;
 
   public function __construct()
   {
      if(self::$instantiated == true)
      {
         throw new Exception("Can only have one");
      }
 
      self::$instantiated == true;
   }
}
  1. class Singlestantiator
  2. {
  3.    private static $instantiated = false;
  4.  
  5.    public function __construct()
  6.    {
  7.       if(self::$instantiated == true)
  8.       {
  9.          throw new Exception("Can only have one");
  10.       }
  11.  
  12.       self::$instantiated == true;
  13.    }
  14. }


Et il passer par référence à d'autres objets.

Maintenant, si vous souhaitez utiliser le "global" mot-clé, allez-y. Mais pour l'impliquent comme de bonnes pratiques à l'intérieur d'un fil POO est risible.
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6134
  • Loc: Seattle, WA
  • Status: Offline

Message Mai 8th, 2009, 12:29 pm

Nightslyr, si ce n'était Reddit, Id upvote votre poste.
The Beer Monocle. Classy.

Afficher de l'information

  • Total des messages de ce sujet: 14 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 217 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC