延伸过载特性的是CI_Controller /间接修改[重复](Extending CI_Contr

2019-10-17 05:14发布

这个问题已经在这里有一个答案:

  • 调用一个成员功能的非对象上[重复] 8个答案

在CI界似乎也没有回答这个(或者它是如此明显,它看起来像一个小白的问题吗?),所以我在这里问。

我一直在现在看到的这种错误的很长一段时间(错误消息遵循),但我一直使用这种“脏”的解决方法 。 现在我不想再编辑的核心CI代码,我知道必须有一个优美的解决了这一点。

这里是设置。

在我的应用程序/配置/路由我有这个

$route['default_controller'] = "dispatcher";

在应用/控制器分派器类/被定义为这样的:

class Dispatcher extends MY_Controller {

 function __construct() {
  parent::__construct();
  $this->load->helper(array('form','https'));
 }


 function index() {

  # load models
  $this->load->model('site/map');
  $this->load->model('site/langs');
  $this->load->model('site/pages');
  if ( $mapped = $this->map->get_map() ){ // this is the line 21
   $this->langs->set_user_lang( $this->GLO['show_lang_in_url'], $this->GLO['show_lang_at_home'] );
   $red = base_url().$this->GLO['user_lang_label']."/".$mapped;
   redirect($red, "refresh");
   } 

  ...

现在MY_Controller驻留在应用程序/核心并且被定义为如下:

class MY_Controller extends CI_Controller {

 public function __construct() {
        parent::__construct();
  $this->GLO = array();   

  #
  # set defaults:
  #
  $this->GLO['deb'] = '';
  $this->GLO['baseurl'] = base_url();
  ... (more GLO[key] = value ) 
}

 public function __set ($key, $value ) {
  $this->GLO[$key] = $value;
 }

我使用的每一个模型都开始像这样(据此命名):

class Map extends CI_Model {

 function __construct(){
  parent::__construct(); 
 }

 function get_map(){
        .....
        return true;
        }

现在,随着CI 2.1.2,5.3.3 PHP,在Debian的Apache 2尝试加载页面时,我得到这个错误:

一个PHP错误遇到严重性:通知消息:超载财产LANGS的间接修改:: $ GLO不起作用文件名:网站/ langs.php行号:82

一个PHP错误遇到严重性:通知消息:未定义的属性:调度:: $映射文件名:控制器/ dispatcher.php行号:21

致命错误:调用一个成员函数get_map()一个非对象在/home/webdev/MC/_WWW/application/controllers/dispatcher.php第21行

线21是一个在地图模型上面注

if ( $mapped = $this->map->get_map() ){

在其他模型中的线82看起来是这样的:

$this->GLO['langs'][] = $temp;

整个代码,这GLO数组作为$引用本-GLO [ ]。 必须读取和写入不时。 如果我删除MY_Controller的__set函数,我得到更多的警告。

问题出在哪儿?

非常感谢提前!

Answer 1:

我不知道的第一个错误 - 但这两个:

一个PHP错误遇到严重性:通知消息:未定义的属性:调度:: $映射文件名:控制器/ dispatcher.php行号:21

致命错误:调用一个成员函数get_map()一个非对象在/home/webdev/MC/_WWW/application/controllers/dispatcher.php第21行

......像你还没有正确加载你的模型?

更改

if ( $mapped = $this->map->get_map() ){

$this->load->model('map');
if ( $mapped = $this->map->get_map() ){


文章来源: Extending CI_Controller / Indirect modification of overloaded property [duplicate]