2011-05-28 2 views
0

Эй, ребята. Я разрабатывал модель для некоторых данных и хотел, чтобы она работала так: $this->groupmodel->VARIABLE->FUNCTION(VAR1, VAR2); для вызова функции, где VARIABLE изменен на что угодно и передается функции.Нечетный вопрос php OOP

Это чувствует себя более правильно (то сказать $this->groupmodel->FUNCTION(VARIABLE, VAR1, VAR2)), потому что каждый VARIABLE имеет ту же функцию, и функция быть предварительно (технически) на VARIABLE. Это возможно?
Обратите внимание, что VARIABLE может быть установлен в любом месте (в его собственной функции или в вызываемой функции) (он является постоянным во всем классе, но должен быть установлен каждый вызов).

Max

+1

Это не * ООП *, это попытка сделать ужасные вещи, используя объекты. * ООП * ** - это парадигма, изобретенная для снижения сложности программ, делает программы более понятными, понятными и читаемыми. Но вы хотите что-то, что не позволит следовать всем этим идеям. – zerkms

+0

Фактически, пример, который mazzzzz опубликовал, как-то напоминает подход, который некоторые языки должны выполнять ООП. Вызываемый объект автоматически упоминается как $ this, и это почти все. –

+2

Мне нравится, как тот, кто понятия не имеет, как мои функции программы будут подходить к таким высоким выводам о том, как это сделать *. – Ben

ответ

2

Вы должны создать класс, реализующий функции, которые вы хотите использовать, и все ваши «переменные» должны быть объектами этого класса. Например:

class Kid { 
    private $age = 0; 
    public function _construct($age){ 
     $this->age = $age; 
    } 
    public function birthday() { // implement in Kid instead of in Groupmodel 
     $this->age++; 
     echo "Growing old... "; 
    } 
    public function age($age_new = null){ // age setter and getter 
     if(!is_null($age_new)){ 
     $this->age = $age_new; 
     } 
     return $this->age; 
    } 
} 

, а затем внутри groupmodel:

class GroupModel { 

    private $variables; 

    public function _set($name, $value) { 
    if (array_key_exists($name, $this->variables)) { 
     $this->variables[$name]->age($value); 
    } else { 
     $this->variables[$name] = new Kid($value); 
    } 
    } 

    public function _get($name) { 
    if (array_key_exists($name, $this->variables)) { 
     return $this->variables[$name]; 
    } else { 
     return null; 
    } 
    } 
} 

так что вы можете позвонить:

$this->groupmodel = new GroupModel() 
$this->groupmodel->var1 = 8 
$this->groupmodel->var1->birthday(); // will add 1 to var1's age and print "Growing old" 
$this->groupmodel->var1 = 9 // will replace var1's age 

Что мы делаем здесь, создает объекты класса Kid автоматически каждый раз при попробуйте установить свойство объекта GroupModel. (Это то, что делает магический метод _set())

Фактически он создает их как элементы частного массива вместо реальных свойств GroupModel.

Затем при попытке получить доступ к этим «свойствам» будет вызван _get(), и он будет извлекать элемент массива и возвращать его.

Как и объект класса Kid, вы можете вызвать любой метод, который он реализует (например, день рождения()).

Для получения дополнительной информации о перегрузке и магических методов, таких как _GET и _set см:

http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

+0

Не могли бы вы быть более наглядными в вашем примере? Если бы я не был очищен, каждая функция после 'переменной' является точной для каждой переменной. Я не вижу, как я могу адаптировать ваше решение для этого. – Ben

+0

См. Отредактированный ответ. –

1

PHP 5.3 позволяет использовать очень хорошая вещь под названием late static bindings

Допустим, у вас есть 2 классов: Foo которая простирается groupmodel:

class groupmodel { 
     const MY_CONST = 'groupmodel'; 

     protected function myName(){ 
     echo static::MY_CONST; //Will print 'groupmodel'; 
     } 


     protected function whoAmI(){ 
     //do something here 
     } 
} 

и Foo:

class Foo extends groupmodel { 
     const MY_CONST = 'ClassFoo'; 

     public function tellMyName(){ 
     $this->myName(); //Will print 'ClassFoo'; 
     } 
} 

На самом деле, идея вместо использования

$this->groupmodel->FUNCTION(VARIABLE, VAR1, VAR2) 
OR 
$this->groupmodel->VARIABLE->FUNCTION(VAR1, VAR2); 

вы будете использовать:

$object = new Foo(); 
$object->tellMyName(); //Will print 'ClassFoo' 

и теперь $ объект будет предоставлять все groupmodel методов.

еще одна важная вещь с вашим делом и для работы с ООП столько, сколько вы можете в настройке abstract class

+0

Вы говорите о поздней статической привязке, но вы ее не используете. Ни одна из функций не является статической. Это будет работать без поздней статической привязки (кроме ключевого слова static). –

+0

Я согласен, что вы можете использовать его при использовании статических методов, но вы можете использовать его в своем экземпляре. поэтому, если вы будете использовать self :: MY_CONST, это не сработает (см. мой пример). Вы сможете сделать несколько более сложных вещей и создать полностью динамическое наследование путем использования поздних статических привязок с обоими типами методов (статические и экземпляры). –

1

Да, это возможно. php позволяет использовать переменные для доступа к членам и функциям. Например: $this->groupmodel->$myvar->myfunc($var1, $var2);

Это вызовет $this->groupmodel->{Whatever-string-is-stored-in-myvar}.

Обратите внимание, что если вы хотите сделать это, groupmodel должен быть установлен в классе и $ MyVar должен быть публичным членом в groupmodel и содержание $ MyVar должен быть действительным членом, который также является класс, который реализует myfunc() , Это много связанных зависимостей (следовательно, zerkms «пренебрежительно относится к этому подходу»). Однако помогло бы узнать, что вы пытаетесь сделать.

+0

groupmodel управляет группой людей. Класс groupmodel не имеет состояния (ничто не перевернулось от одного вызова функции к другому), поэтому мне нужно установить, какой член группы (извлечен из db), я запускаю функцию (и чувствую, что это модель, и сохраняется непосредственно к базе данных, я рассуждал, что это должно быть просто без гражданства). Мне нужен интуитивно понятный интерфейс для каждого участника (вместо того, чтобы включать их имя в вызов функции, и именно так я пришел к этому. – Ben

+0

Итак, вам нужен активный шаблон записи ... –