CodeIgniter控制器复用外部函数报错:未定义方法Lang::get_all_languages()
解决CodeIgniter中全局复用函数的问题
你遇到的问题核心有两个:一是普通函数不能通过类实例的$this->调用,二是普通函数里无法直接用$this访问CI的库(比如curl)。下面给你几种符合CodeIgniter架构的解决方案,按推荐程度排序:
方案1:使用CodeIgniter Helper(最推荐)
CodeIgniter的Helper就是专门用来存放全局可复用普通函数的,完全适配你的场景:
创建Helper文件
在application/helpers/目录下新建language_helper.php,把你的函数修改后放进去:<?php if (!function_exists('get_all_languages')) { // 防止函数重复定义 function get_all_languages() { $CI =& get_instance(); // 获取CI的全局实例,用来访问库、模型等 $CI->curl->create(GetAllLanguages); $CI->curl->http_login(REST_KEY_ID, REST_KEY_PASSWORD); return json_decode($CI->curl->execute(), true); } }在控制器中加载Helper
在Lang.php的构造函数里加载这个helper:public function __construct() { parent::__construct(); $this->load->helper('language'); // 加载自定义helper }调用函数
直接调用函数名即可,不需要$this->:$languages = get_all_languages();
方案2:封装成CodeIgniter Library
如果这个函数以后可能扩展出更多相关方法,做成Library会更符合面向对象的设计:
创建Library文件
在application/libraries/目录下新建LanguageService.php:<?php class LanguageService { protected $CI; public function __construct() { $this->CI =& get_instance(); $this->CI->load->library('curl'); // 确保curl库被加载 } public function getAllLanguages() { // 用驼峰命名更符合类方法规范 $this->CI->curl->create(GetAllLanguages); $this->CI->curl->http_login(REST_KEY_ID, REST_KEY_PASSWORD); return json_decode($this->CI->curl->execute(), true); } }在控制器中加载并调用
public function __construct() { parent::__construct(); $this->load->library('language_service'); // CI会自动处理大小写 } // 调用方法 $languages = $this->language_service->getAllLanguages();
方案3:保留原文件结构的修正版
如果你不想改动文件结构,也可以修正现有代码,但这种方式不符合CI的最佳实践,仅做参考:
修改
get_all_languages.php中的函数
解决$this->curl的问题,改用CI实例:<?php function get_all_languages() { $CI =& get_instance(); $CI->curl->create(GetAllLanguages); $CI->curl->http_login(REST_KEY_ID, REST_KEY_PASSWORD); return json_decode($CI->curl->execute(), true); }在控制器中调用
引入文件后,直接调用函数名,不要用$this->:// 在Lang.php顶部引入 include __DIR__.'/../../Generic/Users/get_all_languages.php'; // 调用时 $languages = get_all_languages();
为什么原来的代码报错?
- 你用
include引入的是普通全局函数,不是Lang类的成员方法,所以用$this->get_all_languages()会提示“未定义方法”——$this指向的是Lang控制器实例,它根本没有这个方法。 - 原函数里的
$this->curl也会报错,因为普通函数中的$this没有指向CI的全局实例,必须通过get_instance()获取才能访问CI的库。
内容的提问来源于stack exchange,提问作者JianYA
相关产品推荐
相关产品推荐

