You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter控制器复用外部函数报错:未定义方法Lang::get_all_languages()

解决CodeIgniter中全局复用函数的问题

你遇到的问题核心有两个:一是普通函数不能通过类实例的$this->调用,二是普通函数里无法直接用$this访问CI的库(比如curl)。下面给你几种符合CodeIgniter架构的解决方案,按推荐程度排序:

方案1:使用CodeIgniter Helper(最推荐)

CodeIgniter的Helper就是专门用来存放全局可复用普通函数的,完全适配你的场景:

  1. 创建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);
        }
    }
    
  2. 在控制器中加载Helper
    在Lang.php的构造函数里加载这个helper:

    public function __construct() {
        parent::__construct();
        $this->load->helper('language'); // 加载自定义helper
    }
    
  3. 调用函数
    直接调用函数名即可,不需要$this->:

    $languages = get_all_languages();
    

方案2:封装成CodeIgniter Library

如果这个函数以后可能扩展出更多相关方法,做成Library会更符合面向对象的设计:

  1. 创建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);
        }
    }
    
  2. 在控制器中加载并调用

    public function __construct() {
        parent::__construct();
        $this->load->library('language_service'); // CI会自动处理大小写
    }
    
    // 调用方法
    $languages = $this->language_service->getAllLanguages();
    

方案3:保留原文件结构的修正版

如果你不想改动文件结构,也可以修正现有代码,但这种方式不符合CI的最佳实践,仅做参考:

  1. 修改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);
    }
    
  2. 在控制器中调用
    引入文件后,直接调用函数名,不要用$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:07:06