2011-02-01 9 views
7

ok co im staramy się robić to makeing coś tak można nazwać jak $this->model->users->getInfomation('name'); czy coś similer na moim ramach ale PHP dają mi surowe normy Tworzenie domyślnego obiektu z pustą wartościąphp Tworzenie domyślnego obiektu z pustej wartości?

protected function model($model) 
{ 
    $path = "features". DS ."models". DS . $model .".php"; 
    require $path; 

    $class = 'Model'. ucfirst($model); 
    $this->model->$model = new $class; 
} 

czy możemy to zrobić, aby jakoś wpasował się w standardy?

edit *

ta funkcja jest w klasie aplikacji, więc można je przedłużyć z naszego kontrolera jak blog rozszerza stosowanie następnie wywołać coś takiego $ this-> Model-> blog dostanie coś takiego, co im robi powyżej, kiedy zrobić coś takiego

tak powyższy kod działa poprawnie$this->blog->getSomething();, ale jakoś chcę, aby je w grupie, jak powyższe pytanie, więc jeśli chcemy uzyskać coś podobnego $this->model->blog->getSomething();

Dzięki za czas.

Adam Ramadhan

+0

Naprawdę nie wiem, co próbujesz osiągnąć. Chcesz modelować automatycznie, gdy wywołasz '$ this-> model -> [modelName]'? – singles

+0

tak, ale problem może wynikać z tego, że $ this-> model jest pusty, nigdzie go nie osiągnąłem. Czy nie możemy tego po prostu dodać? –

Odpowiedz

7

Trudno zobaczyć, co tak naprawdę robisz źle z samym kodem. Zrobiłem kilka bardzo prosty kod do odtworzenia błędu:

<?php 
$bar = 42; 
$foo = null; 

$foo->bar = $bar; 

Powodem daje to ostrzeżenie, że jesteś Przypisanie wartości „Obiekt drogę”, ale jesteś przypisując je do zmiennej nie jest przedmiotem. W ten sposób silnik Zend tworzy obiekt dla $ foo, który jest instancją StdClass. Oczywiście, 9 na 10 razy, to nie jest to, co chcesz zrobić, więc PHP dostarcza pomocną wiadomość.

W twoim przypadku: $ this-> model nie jest obiektem (jeszcze). Jeśli chcesz pozbyć się błędu, po prostu wykonaj:

if(!is_object($this->model)) { 
    $this->model = new StdClass; 
} 
$this->model->$model = new $class; 

Pozdrawiam.

+0

Tak, ta jedna praca, ale jeśli (! Is_object ($ this-> model)) daje mi błąd $ this-> nie znaleziono modelu, jeśli usunę obiekt is to działa dobrze !. anway co to jest klasa standardowa? –

+1

Możesz znaleźć więcej informacji na ten temat na stackoverflow: http://stackoverflow.com/questions/931407/what-is-stdclass-in-php Jeśli nie zdefiniowałeś $ tego-> modelu, być może nadszedł czas, aby zrób to, zamiast polegać na wszelkiego rodzaju magii? –

+0

tak czy inaczej po przeprowadzeniu niektórych badań używających tego na razie, źle zmienić odpowiedź, jeśli jest lepszy: D dzięki. –

0

Musi używać podwójnych $ 's

$this->model->$$model = new $class; 
+0

jak dobrze wiem, że oznacza to $ this-> model -> $ blog? więc daje nam błąd, że $ blog nie istnieje. to czego szukam to coś, co może dać mi $ this-> model-> blog od $ this-> model -> $ model; ale problemem jest to, że $ - model nie zrobił nic w tym kierunku. Proszę, popraw mnie jeśli się mylę. –

+0

Nie masz obiektu na tym-> modelu? Wtedy nie powinieneś oczekiwać, że to zadziała. – yoda

+0

Również $$ oznacza, że ​​jeśli masz model $$, będzie on wstawiał nazwę zmiennej (np. Jeśli $ model to "person", to będzie to $ this-> model-> osoba). Testowane i działające. – yoda

2

Musisz użyć __get magiczną metodę - http://php.net/manual/pl/language.oop5.magic.php

można osiągnąć to, czego szukasz robi coś takiego:

<?php 
class ModelCreator 
{ 
    private $_modelsCreated = array(); 
    public function __get($model) 
    { 
     $class = 'Model'. ucfirst($model); 
     //avoid creating multiple same models 
     if (!array_key_exists($model, $this->_modelsCreated)) { 
      $path = "features". DS ."models". DS . $model .".php"; 
      require_once 'modeluser.php'; 
      $this->_modelsCreated[$class] = new $class; 
     } 
     return $this->_modelsCreated[$class]; 
    } 
} 

class MyClass 
{ 
    private $_model; 

    public function __construct(ModelCreator $model) 
    { 
     $this->_model = $model; 
    } 

    public function __get($name) 
    { 
     if ($name === 'model') { 
      return $this->_model; 
     } 
    } 
} 

$myClass = new MyClass(new ModelCreator()); 
$userModel = $myClass->model->user; // will return a class of ModelUser 

Ale powinieneś unikać magii jak wyżej -> lepszym podejściem jest zrobienie tego w ten sposób:

//model creator is an instance of model creator 
$this->modelCreator->getModel('user'); // now you know what exactly is happening 
+0

dzięki single! tak to też działa !, czekam na prostsze rozwiązanie. –

+0

Jeśli chcesz, aby modele były tworzone dynamicznie na żądanie i używać właściwości zamiast metod do ich pobierania, wątpię, czy istnieje prostsze rozwiązanie. – singles

+1

nie ma prostszego rozwiązania istnieje wzorzec projektowy, który obsługuje unikalne instancje obiektów i nazywa się to multitonem (coś jak ten twórca tego modelu). Możesz nazwać go kolekcją singletonów. Trzymaj się książki, starając się uprościć rzeczy, ponieważ mogą one stworzyć dziwne zachowanie, jak już to odkryłeś. Dobry przykład singli. –

0

Oprócz odpowiedzi Berry Langerak za

is_object nadal będzie wyzwalać ścisłą kontrolę ponieważ zakłada, że ​​to 'coś' w $ this-> model.isset to lepsze podejście

if(!isset($this->model)) { 
    $this->model = new StdClass; 
} 

$this->model->$model = new $class; 
Powiązane problemy