【问题标题】:Notice: Undefined property: In creating new model using namespace注意:未定义的属性:在使用命名空间创建新模型时
【发布时间】:2018-09-12 12:55:01
【问题描述】:

我是一个新手 php 编码器。我有这个主控制器:

namespace App\Core;

class Controller
{
    /** @var View View The view object */
    public $View;
    public $templates;
    /**
     * Construct the (base) controller. This happens when a real controller is constructed, like in
    */
    public function __construct()
    {
    }

    public function loadModel() {

        $this->model = new \App\Front\Model\IndexModel(); //error line

    }
}

在 IndexController 我有:

namespace App\Front\Controller;

use App\Front\Model\IndexModel;

class IndexController extends \App\Core\Controller {

    public function index(){
        $this->loadModel->test();
    }
}

在 IndexModel 我有:

namespace App\Front\Model;

class IndexModel
{

    public function test(){

        echo 'test print';

    }
}

在操作中我收到此错误:

注意:未定义的属性:第 13 行 /Applications/xampp/htdocs/cmstest/application/Front/Controller/IndexController.php 中的 App\Front\Controller\IndexController::$loadModel

我使用 composer 和 PDR-4 方法加载所有类。

有什么问题,我该如何解决?谢谢

【问题讨论】:

  • Controller::loadModel 是一个方法而不是一个属性,所以$this->loadModel->test(); 应该是$this->loadModel()->test();
  • @CD001:我改变了这个但是看到错误:Fatal error: Uncaught Error: Call to a member function test() on null in /Applications/xammp/htdocs/cmstest/application/Front/Controller/IndexController.php:13
  • loadModel() 需要返回您刚刚分配给 $this->modelIndexModel - 例如public function loadModel() { $this->model = new \App\Front\Model\IndexModel(); return $this->model }如果什么都不回,那就是NULL
  • @harmonytalk - 我的帖子回复你了吗?
  • @DavidWinder:当然。你在你的答案下面看到我的评论。

标签: php function return-value


【解决方案1】:

请注意,在您的 loadModel 方法中,您只是将新模型分配给 this,但您没有返回任何内容 -> 因此您不能在 null 上运行 test()

为了修复它,请使用:

class IndexController extends \App\Core\Controller {
    public function index(){
        $this->loadModel();
        $this->model->test();
    }
}

如果您坚持只在index 中执行一项功能,您可以将您的loadModel 功能修改为:

public function loadModel() {
    if (!$this->model) // that way you load the Model only once. If you want to reload every time just remove the if
        $this->model = new \App\Front\Model\IndexModel();
    return $this->model;
}  

然后你可以这样做:

public function index(){
    $this->loadModel()->test();
}

【讨论】:

  • 这行得通。我的方式对在IndexController 中加载两个对象是正确的和有益的?
  • 不确定我是否理解,您的意思是“加载”= 在 loadModel()` 函数中设置 2 属性?
  • @DavidWinder:我的意思是分开两个$this->loadModel(); $this->model->test();
  • 如果你的意思是调用 2 个不同的函数,那么是的
  • @DavidWinder:你的意思是:好还是坏?!有什么方法可以调用一个函数?!
猜你喜欢
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多