2009-09-25 6 views
11

Я регулярно создаю класс с несколькими частными переменными. Когда экземпляр этого класса установлен, должно быть возможно заполнить все переменные класса геттерами и сеттерами.Каков наилучший способ автоматического генерации getters и seters для класса в php?

Есть ли простой способ сделать это, не набирая все эти сеттеры и геттеры для каждой переменной при создании класса?

теперь я должен напечатать это для каждого вар в классе

public function setVar($var){ 
$this->var = $var; 
} 

и

public function getVar(){ 
return $this->var; 
} 

Сейчас мы используем RegExp, но я не знаю, если это самый простой способ .. Мы используем Eclipse как среду, поэтому, возможно, есть некоторые полезные плагины?

+0

Несмотря на боль, вряд ли потребуется много времени для их реализации. Обычно я ем, пока я ем свой обед. Еще лучше, передайте код студенту, чтобы его добавить. – Chris

+0

@Chris Передайте его кому-то другому, нельзя считать хорошим решением. Студент или надстройка, возможно, захотят иметь правильное решение для этого ... – Kennethvr

ответ

33

С Eclipse, зайдите в Настройки -> PHP -> Редактор -> Шаблоны -> Новые и использовать что-то вроде этого:

private $$${PropertyName}; 
${cursor}  
public function get${PropertyName}() 
{ 
    return $$this->${PropertyName}; 
} 

public function set${PropertyName}($$value) 
{ 
    $$this->${PropertyName} = $$value; 
} 

Чтобы использовать шаблон типа это имя и нажмите Ctrl + пробел - контекстное меню должно также автоматически появляются при вводе имени.

+0

Любое исправление, связанное с использованием случая верблюда в этих свойствах? – porfiriopartida

+0

@porfiriopartida Я задавался вопросом о том же, и в итоге использовал другую переменную в get и set. При использовании шаблона вам нужно только установить свойство и функцию getter. ;-) – andreas

2

Вы изучали методы __set и __get? Не знаю, означает ли это то, что вы имеете в виду, но автоматически вызывается всякий раз, когда член класса является SET или Retrieved/Fetched/Accessed.

0

Может быть лучше гуманного:

class base { 

    protected $_vars = array(); 


    public function setVar($name, $value = null) { 
     $this->_vars[$name] = $value; 
    } 

    public function getVar($name) { 
     return isset($this->_vars[$name]) ? $this->_vars[$name] : null; 
    } 
} 

И просто расширить этот класс. Кроме того, вы можете использовать методы __set и __get, но они довольно медленны.

+0

это может быть хорошим решением, но стоит ли положить все в массив, а не все как разные вары? или это не имеет значения? – Kennethvr

+1

Если это рабочие данные (например, массивы, строки и т. Д.), Все в порядке. Но если вы хотите установить некоторые объекты, такие как объект базы данных или другие, вы не должны делать этого. Затем используйте конструкторы или другие способы. – Pawka

+0

Вы уверены, что __set и __get mehods являются медленными ?? – andho

1

Zend Studio имеет функцию автоматического генерации геттера/сеттера.

1

Я думаю, что лучший способ - использовать __set и __get с некоторыми строковыми функциями. Здесь я покажу вам.

class UserProfile 
{ 
    public function __get($key) 
    { 
     if(isset($this->$key)) 
     { 
      return $this->$key; 
     } 
    } 

    public function __set($key,$val) 
    { 
     $this->cahnge($key,$val); 
    } 

    public function __call($key,$params) 
    { 
     if(substr("set",$key)) 
     { 
      //Update 
     }elseif(substr("get",$key)) 
     { 
      //return 
     } 

     //Else Blah 
    } 

    private function change($key,$val) 
    { 
     if(isset($this->$key)) 
     { 
      $this->$key = $val; 
     } 
    } 
} 

__call() метод позволит установить с такими функциями, как

$profile->setUsername('Robert Pitt'); до тех пор, как вы substr набор/получить и проверить на остальной части строки в качестве значения класса:)

другой пример

public function __call($method,$params = array()) 
{ 

    if(isset($params[0]) && is_string($params[0])) 
    { 
     $this->$method = $params[0]; 
    } 
} 

//.... 

$profile->username('Robert Pitt'); 

Theres больше работы, чтобы сделать здесь

+0

Вы уверены, что это работает? Я не мог справиться с этим. это какая-то магия PHP? Я могу назвать '$ profile-> __get (username)', но я хотел вызвать '$ profile-> getUsername()' – azerafati

 Смежные вопросы

  • Нет связанных вопросов^_^