php从空值创建默认对象?

php从空值创建默认对象?,php,model-view-controller,standards,Php,Model View Controller,Standards,好吧,我想做的是做点什么,这样我就可以把它叫做 $this->model->users->getinformation('name')或我的框架上类似的东西 但是php给了我一个严格的标准,从空值创建默认对象 我们能让它以某种方式符合标准吗 编辑* 这个函数是类应用程序,所以我可以从控制器扩展它们 比如blog扩展应用程序,然后调用类似$this->model->blog的东西,当我做类似的事情时,就会得到类似于我上面所做的事情 protected function model($model)

好吧,我想做的是做点什么,这样我就可以把它叫做
$this->model->users->getinformation('name')或我的框架上类似的东西
但是php给了我一个严格的标准,从空值创建默认对象

我们能让它以某种方式符合标准吗

编辑*

这个函数是类应用程序,所以我可以从控制器扩展它们 比如blog扩展应用程序,然后调用类似$this->model->blog的东西,当我做类似的事情时,就会得到类似于我上面所做的事情

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

    $class = 'Model'. ucfirst($model);
    $this->$model = new $class;
}
是的,上面的代码工作正常
$this->blog->getSomething(),但不知怎么的,我想把它们放在一个组中,就像上面的问题一样,所以如果我们想得到像
$this->model->blog->getSomething()这样的东西

谢谢你抽出时间

亚当·拉马丹必须使用双美元

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

您必须使用
\u get
魔术方法-

你可以通过这样做来实现你的目标:

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

单凭这些代码很难看出你到底做错了什么。我编写了一些非常简单的代码来重现错误:

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

$foo->bar = $bar;

干杯。

除了Berry Langerak的回答

is\u对象仍将触发严格检查,因为它假定$this->model中有“某物”。isset是一种更好的方法

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

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

我真的不知道你想要实现什么。您想在调用
$this->model->[modelName]
时自动创建模型吗?是的,但问题可能是因为$this->model是空的,我没有在任何地方创建它。我们就不能加上这个吗?我知道$$的意思就像这个$this->model->blog一样?所以它给了我们一个错误,$blog不存在。我要找的是能从$this->model->blog中给我$this->model->blog的东西;但问题是$this->model我还没有做任何修改。如果我错了,请纠正我。另外,$$意味着在有$$model的地方,它将粘贴变量的名称(例如,如果$model是“person”,它将是$this->model->person)。测试和工作。是的,这一个工作,但如果(!is_对象($this->model))给我一个错误$this->model not found,如果我删除了is对象,它工作正常!。anway什么是std类?你可以在stackoverflow上找到更多关于这个的信息:如果你还没有定义$this->model,也许是时候这样做了,而不是依赖于各种各样的魔法了?无论如何,在做了一些研究之后,我现在使用这个,如果有更好的答案,我会改变答案:D谢谢。谢谢单身人士!是的,它也有用!,我在等待一个更简单的解决方案。如果您希望根据您的请求动态创建模型,并使用属性而不是方法来检索模型,我怀疑是否有更简单的解决方案。没有更简单的解决方案,有一种处理唯一对象实例的设计模式,它被称为multiton(类似于此模型创建者).你可以称之为单身人士的集合。正如你已经发现的那样,坚持这本书,试图让事情变得比实际情况更简单可能会产生奇怪的行为。单身人士就是一个很好的例子。但这并不是他发出错误信息的原因。我同意这段代码实际上比他现在使用的代码要好,尽管一个简单的注册表也能满足他的情况?
<?php
$bar = 42;
$foo = null;

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

$this->model->$model = new $class;
if( !is_object( $this->request ) ) {
        $this->request = new StdClass;
    }
    if(!property_exists($this->request, 'method')) {
        $this->request->method = new StdClass;
    }
    // How is this request being made? POST, DELETE, GET, PUT?
    $this->request->method = $this->_detect_method();