【问题标题】:Undefined property when calling function from model从模型调用函数时未定义的属性
【发布时间】:2014-10-09 11:43:55
【问题描述】:

当我尝试加载模型时,我没有遇到任何问题。代码如下(在控制器中):

applications/controllers/shortlinks.php:

public function __construct() {
    parent::__construct();
    $this->load->library("logged");
    $this->load->model("shortlinks_logic"); //This model I'm interested in
}

例如,shortlinks_logic 模型的代码如下:

applications/models/shortlinks_logic.php

class Shortlinks_logic extends CI_Model {

    public function test() {
        echo "TEST";
    }

}

那里也没有问题。但是,当我尝试在控制器中调用此函数时:

public function something($argument_one, $argument_two) {
    $this->shortlinks_logic->test(); //Line 35 of following error
}

我收到此错误:

遇到 PHP 错误

严重性:通知

消息:未定义属性:Shortlinks::$shortlinks_logic

文件名:controllers/shortlinks.php

行号:35 致命错误:在非对象上调用成员函数 test() C:\xampp\htdocs\tools_v2\application\controllers\shortlinks.php 在第 35 行

我搜索了 StackOverflow,最终找到了 this answer,但我意识到我不想为我的控制器的每个功能都这样做,我不应该添加

$logic = new shortlinks_logic();

并调用所有内容

$logic->function();

因为我知道无论如何我都可以在加载时给模型一个别名

$this->load->model("shortlinks_logic", "logic");

并使用

$this->logic->test();

我需要在每个函数中创建一个新对象有什么原因吗?有没有办法解决这个问题?

我知道我可以自动加载所有模型,这是一个选项,但如果可能的话我想避免这种情况,因为不是每个人都可以访问所有模型并且有很多模型,所以我希望某些模型去某些用户(因此我想在控制器中加载)。

我知道这很长(道歉),所以我加粗了问题。

【问题讨论】:

  • 第 35 1 行的 C:\xampp\htdocs\tools_v2\application\controllers\shortlinks.php 究竟是什么?
  • 对不起,我会更新帖子以反映它是哪一行,但它是:$this->shortlinks_logic->test();something() 控制器函数内。 @AfghanWiz
  • 如果模型没有指定构造函数方法,则调用父类构造函数,所以没有理由在模型中定义一个空的构造函数并调用parent::__construct();...
  • 我在模型中添加了public function __construct() { parent::__construct();},但仍然是同样的错误。 @shadyyx
  • 是的,这就是我所说的——在这种情况下,它完全是一段无用的代码。没有这个 public function __construct() { parent::__construct();} 父类 __construct() 无论如何都会被调用。

标签: php codeigniter object


【解决方案1】:

测试了您的代码并完美运行:- 在application/models 下创建模型文件的文件名shortlinks_logic.php

class Shortlinks_logic extends CI_Model {
    public function test() {
        echo "TEST";
    }
}

我的控制器shortlinks.php

<?php if (!defined('BASEPATH'))exit('No direct script access allowed');
class Shortlinks extends CI_Controller {
  public function __construct() {
    parent::__construct();
    $this->load->model("shortlinks_logic"); 
  }
  public function something() {
    $this->shortlinks_logic->test(); 
  }
}

你会得到完美的工作。

【讨论】:

  • 我的模型在applications/models里面。
  • 和我给定的模型文件名相同
  • 您的新编辑准确地反映了我的代码目前的情况。但它不起作用。
【解决方案2】:

也许你的模型没有正确加载...

试试这个:

public function __construct() {

    $this->load->library("logged");
    $this->load->model("shortlinks_logic");
    parent::__construct();
}

【讨论】:

    【解决方案3】:

    我知道这是什么问题。

    由于某种原因,它不允许我加载

    $this->load->library("logged");
    

    之前

    $this->load->model("shortlinks_logic");
    

    我必须先加载模型。

    例如:

    $this->load->model("shortlinks_logic");
    $this->load->library("logged");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多