PHP OO класс для настройки словарного списка - PullRequest
2 голосов
/ 05 ноября 2010

Я хочу создать класс для хранения небольшого списка многоязычного словаря, используемого во многих местах, я хочу заменить большое количество операторов include, которые в настоящее время используются в программе. Вот о чем я думал (он не полностью функционален). Можете ли вы помочь мне сделать работу и использовать правильные ОО конструкции.

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();

?>

Ответы [ 3 ]

2 голосов
/ 05 ноября 2010

Попробуйте это: вам нужно всегда ссылаться на значения и методы внутри класса с помощью $ 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'];
 }
}

Но для продолжения, почему бы не сделать его менее массивным:

$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;
    }
}
2 голосов
/ 05 ноября 2010

в вашей основной функции, попробуйте это ...

function Main(){
    echo $this->vocab->term['hello']['E'];
}
1 голос
/ 05 ноября 2010

$ это ссылка на текущий объект (изнутри объекта). Поскольку у вас есть свойство $ vocab внутри объекта, вы можете сказать $ this-> vocab для доступа к этому свойству. Вы также можете сделать это без $ this, но $ this (IMHO) проясняет ситуацию с тем, на какие объекты вы ссылаетесь, когда вы начинаете наследовать объекты.

Кроме того, если это жестко заданные значения, а не извлеченные из базы данных, почему бы не использовать языковой файл с определениями в нем? Такие как:

языки / english.php

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

языки / french.php

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

Затем включите правильный файл в ваш файл "common.php" или "includes.php". Оттуда вы можете использовать константы по всей вашей странице. Вы даже можете расширить его, сделав (если это так) английский файл по умолчанию и выполнить

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

Затем вы можете сначала загрузить другой язык, затем english.php (так что вы можете убедиться, что у вас есть хотя бы значение по умолчанию, если оно еще не переведено)

...