2010-11-05 25 views
2

Je veux créer une classe pour stocker une petite liste de vocabulaire multilingue utilisé dans de nombreux endroits, je veux remplacer un grand nombre d'instructions 'include' qui sont actuellement utilisées dans le programme . Voici ce à quoi je pensais (ce n'est pas complètement fonctionnel). Pouvez-vous m'aider à travailler et à utiliser les constructions OO appropriées?PHP OO class pour la mise en place de la liste de vocabulaire

class VocabClass{ 

    public $term = array();  

    public function __construct(){ 
    // my vocabulary... 
    $this->term['hello']['E'] = 'hello'; 
    $this->term['hello']['F'] = 'bonjour'; 
    $this->term['goodbye']['E'] = 'goodbye'; 
    $this->term['goodbye']['F'] = 'aurevoir';  
    } 
} 

class Program{ 

public $vocab; 
function __construct(){ 
    $vocab = new VocabClass();  
    // this works 
    echo $vocab->term['hello']['F']; 
} 

function Main() { 

    // this doesn't work 
    echo $vocab->term['hello']['E']; 
    echo $this->term['hello']['E']; 


} 
} 


$myProgram = new Program(); 
$myProgram->Main(); 

?> 

Répondre

1

$ Ceci est en référence à l'objet courant (à partir d'un objet). Puisque vous avez la propriété $ vocab à l'intérieur de l'objet, vous pouvez dire $ this-> vocab pour accéder à cette propriété. Vous pouvez également le faire sans le $ this, mais $ this (IMHO) rend les choses plus claires concernant les objets que vous référencez lorsque vous commencez à hériter des objets.

De même, s'il s'agit de valeurs codées en dur et non tirées d'une base de données, pourquoi ne pas utiliser un fichier de langue avec des définitions? Tels que:

langues/english.php

define('LANG_YES', 'Yes'); 
define('LANG_NO', 'No'); 
define('LANG_CANCEL', 'Cancel'); 
define('LANG_WELCOME', 'Welcome!'); 

langues/french.php

define('LANG_YES', 'Oui'); 
define('LANG_NO', 'N'); 
define('LANG_CANCEL', 'Annuler'); 
define('LANG_WELCOME', 'Bienvenue'); 

comprennent ensuite le fichier correct dans votre "common.php" ou fichier "includes.php" . De là, vous pouvez utiliser les constantes tout au long de votre page. Vous pouvez même le prolonger en faisant (si tel est le cas), le fichier anglais par défaut et effectuer

if (!defined('LANG_YES')) define('LANG_YES','Yes'); 

Ensuite, vous pouvez charger l'autre langue première english.php puis sur le dessus (vous pouvez vous assurer que vous avez au moins une valeur par défaut doit-on pas encore traduit)

2

dans votre fonction principale, essayez ceci ...

function Main(){ 
    echo $this->vocab->term['hello']['E']; 
} 
2

Essayez ceci, vous devez faire référence toujours des valeurs et des méthodes dans une classe avec $ this->

class VocabClass{ 

    public $term = array(); 

    public function __construct(){ 
    // my vocabulary... 
    $this->term['hello']['E'] = 'hello'; 
    $this->term['hello']['F'] = 'bonjour'; 
    $this->term['goodbye']['E'] = 'goodbye'; 
    $this->term['goodbye']['F'] = 'aurevoir'; 
    } 
} 

class Program{ 

public $vocab; 
function __construct(){ 
    $this->vocab = new VocabClass(); 
} 

function Main() { 

    // this doesn't work 
    echo $this->vocab->term['hello']['E']; 
} 
} 

Mais obtenu plus loin, pourquoi ne pas faire moins array-ish:

$p = new Program(); 
$p->Main(); 

class VocabClass { 
    const ENGLISH = 1; 
    const FRENCH = 2; 

    public $hello; 
    public $goodbye; 

    public function __construct($language) { 
     switch ($language) { 
      case self::ENGLISH: 
       $this->hello = 'hello'; 
       $this->goodbye = 'goodbye'; 
       break; 
      case self::FRENCH: 
       $this->hello = 'bonjour'; 
       $this->goodbye = 'aurevoir'; 
     } 
    } 
} 

class Program { 
    public $vocab; 

    function __construct() { 
     $this->vocab = new VocabClass(VocabClass::ENGLISH); 
    } 

    function Main() { 
     echo $this->vocab->hello; 
    } 
}