2011-02-01 96 views
7

确定什么即时试图做的是makeing东西,所以我可以把它像 $this->model->users->getInfomation('name');什么similer我的框架 但是PHP给我一个严格的标准创建默认的对象从空值php从空值创建默认对象?

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

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

我们可以做到这一点,它会以某种方式符合标准?

编辑*

这个功能是在课堂上的应用,所以我可以从我们的控制器 延长他们像博客扩展应用程序然后调用类似$这个 - >模型 - >博客将得到的东西像什么IM上面做,当我这样做

是上面的代码工作正常$this->blog->getSomething();,但不知何故,我想让他们在一组,像上面的问题,所以如果我们想要得到的东西像$this->model->blog->getSomething();

谢谢你的时间。

亚当·拉马丹

+0

我真的不知道你想达到什么目的。当你调用`$ this-> model - > [modelName]`时,你想要模型自动创建? – singles 2011-02-01 08:12:38

+0

是的,但问题可能是因为$ this->模型是空的,我没有做到这一点。不能我们只是补充说? – 2011-02-01 08:16:11

回答

7

很难看到你实际上做错了单独的代码。我做了一些非常简单的代码来重现错误:

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

$foo->bar = $bar; 

它给出了这样的警告的原因,是你要指定值“对象的方式”,但你将其分配给一个变量,不是一个对象。通过这样做,Zend引擎实际上为$ foo创建了一个对象,这是StdClass的一个实例。显然,10次中的9次,这不是你想要做的,所以PHP提供了一个有用的信息。

在你的情况:$ this-> model不是一个对象(还)。如果你想摆脱错误,只要做:

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

干杯。

0

必须使用双$的

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

以及我知道$$意味着这样$ this-> model - > $ blog?所以它给了我们一个$ blog不存在的错误。我在寻找的东西可以给我$ this-> model-> blog from $ this-> model - > $ model;但问题是$ this-> model,我没有做任何事情。如果我错了,请纠正我。 – 2011-02-01 08:15:04

+0

你在这个模型上没有对象? – yoda 2011-02-01 08:16:43

2

您必须使用__get魔术方法 - http://php.net/manual/pl/language.oop5.magic.php

你可以实现你在找什么做这样的事情:

<?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 

但是你应该避免魔法像上面 - >更好的办法是这样做的:

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

除了贝瑞Langerak的回答

is_object仍然将触发严格检查因为它假设存在$这个 - “东西”>模型。isset是更好的方法

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

$this->model->$model = new $class; 
相关问题