0

这可能很容易做到,但我现在似乎无法理解它。假设在 cakephp 应用程序的一个组件中,我有一个变量my_model,其中包含当前正在使用该组件的相应控制器的模型,例如:

function TestComponent extend Object
{
    var $my_model; // can be either User, or Person

    function test()
    {
        $myModelTemp = $this->my_model; 

        $model = $myModelTemp != 'User' ? $myModelTemp.'->User' : 'User';

        $this->$model->find('all'); 
    }
}

正如您在上面的函数中看到的那样,test()我正在尝试做的是根据 的值调用正确的模型my_model。因此,根据条件,我的查询将是:

$this->Person->User->find('all');

或者

$this->User->find('all');

当我像上面那样做时,我收到一条错误消息Fatal error: Call to a member function find() on a non-object。换句话说,该错误意味着Person->User不是一个对象(因此,它被视为一个字符串)。

4

2 回答 2

0

一般来说,看起来你可能做错了。显然,您希望模型是动态的,但是您正在对事物进行硬编码,这首先破坏了它是动态的全部意义。

通过在组件中执行所有这些操作,您似乎也违反了 CakePHP 和 MVC 的原则。我不确定这个组件是否真的应该操纵模型或假设当前正在使用哪些模型。

然而,如果你想把一个字符串当作一个实际的对象来计算,你可以把它包装进去{ ... }(这是有效的标准 PHP 语法,而不是 Cake 特定的代码)。

尝试这个:

$modelName = $this->my_model; 

$model = ($modelName != 'User') ? $this->{$modelName}->User : $this->User;

$model->find('all');

现在,如果这不起作用,或者您收到一条错误消息说它找不到模型,您需要确保模型在当前范围内实际加载和初始化。

于 2012-11-19T12:31:00.440 回答
0

您所说的可能是真的,但是,它可以指呼叫的任何部分。

因此,Person 或 User 可能无效,或者它们一起导致错误。很难说。尝试使用 var_dump() 转储单个对象;

所以试试:

<?php
    echo "<pre>";
    var_dump(is_object($this->Person));
    var_dump(is_object($this->User));
    echo "</pre>";
?>

确定你的代码哪里出错了。需要明确的是,返回值必须为真才能成为对象。

返回 false 的那个可能是罪魁祸首。

如果您的问题是指引用对象的正确方法,那么对象基本上就是一个数组。例如:

<?php 
    $obj = (object) array("this", "my_function");
?>

上面的示例将数组转换为对象。但是,使用多层可能比您预期的要困难。

于 2012-11-19T05:45:00.030 回答