CodeIgniter:如何将我自己的静态函数类加载到控制器中?

时间:2016-03-29 03:59:39

标签: codeigniter codeigniter-3

我有一类静态函数(常用实用函数),我希望将其加载到codeigniter中。目前我正在使用include_once(...)正常加载它,它按预期工作。

但是,我想使用codeigniter的方法加载它。我知道我应该将我的类文件保存到third_party目录中;并且我应该创建一个库类(将其保存在库目录中),这需要我的类。

以下是三个组件,但它不起作用。

1

// my class, saved at: APPPATH.'third_party/My_Class.php'
class My_Class  
  {
    public static function my_static_utility_method (  )
      {
        return "booger" ;
      }

    // ...
  }

2 - 我明白我应该创建一个符合“库”的CI规则的包装器。实例

// saved at: APPPATH.'libraries/Library_Wrapper.php'
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Library_Wrapper 
  {
    public function __construct()
      {
        require_once APPPATH.'third_party/My_Class.php';
      }
  }

3 - 现在我想从我的控制器访问My_Class的静态方法:

// saved at: APPPATH.'controllers/my_controller.php'
class My_Controller extends CI_Controller
  { 

    public function __constructor( )
      {
        parent::__construct();
        $this->load->library( 'Library_Wrapper' ) ; 
      }

    public function some_function()
      {
        echo $this->My_Class->my_static_utility_method( ) ;
      }

  }

4 个答案:

答案 0 :(得分:1)

请尝试以下步骤:

  1. 创建一个新的控制器文件:{ "type": "database", "name": "grocery", "objects": [{ "type": "table", "database": null, "name": "grocery1", "withoutRowId": true, "ddl": "CREATE TABLE grocery1 (name CHAR (20))", "columns": [{ "name": "name", "type": "CHAR" }], "rows": [ [ "sdd" ], [ "adddd" ], [ "add" ], [ "asd" ], [ "aaa" ] ] }] } 。在该文件中,您可以添加静态函数。

    application/core/MY_Controller.php
  2. 需要访问静态函数的控制器可以扩展此类,如: 文件:<?php class MY_Controller extends CI_Controller { protected function static_fn1() { //code } }

    application/controllers/Welcome.php

答案 1 :(得分:1)

你几乎已经迈出了第三步,但并不完全。加载库将使用与其加载的名称相同的名称:

//Load library
$this->load->library( 'Some_name' );
//Use Library
$this->some_name->someFunction();

因此,在您的情况下,您需要切换访问库的方法:

//Will throw an PHP undefined My_Class error
echo $this->My_Class->my_static_utility_method();

改为Library_wrapper

//from $this->load->library( 'Library_wrapper' );
echo $this->library_wrapper->my_static_utility_method();

但这会出现下一个问题,因为My_Class是library_wrapper的一个属性,因此调用它会有点冗长:

echo $this->library_wrapper->My_Class->my_static_utility_method();

如果可公开访问,哪个应成功调用My_Class后代方法。

这不像你想的那样干净。最好将My_Class扩展为Library_wrapper,而不是共享静态实例:

/**
 * Static helper methods:
**/
class Library_wrapper extends My_Class {

}

可以将库“加载”到different name(请参阅“将库分配给其他对象名称”标题)。

答案 2 :(得分:0)

您可以尝试以下解决方案:

在此层次结构中$ this-&gt; library_wrapper-&gt; My_Class-&gt; my_static_utility_method();

使用Php Functions中列出的php函数查找层次结构中每个点的方法/变量。这将指出事情出错的确切位置。

答案 3 :(得分:0)

我认为你不需要构建一个类。最简单的方法是帮助(&#34; Helpers,顾名思义,帮助您完成任务。每个帮助文件只是特定类别中的函数集合&#34; - 只是阅读来自official tutorial的文章。

名称为arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Werror -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wconversion -Wpointer-arith -Wpadded -Wshadow -Wlogical-op -Waggregate-return -Wfloat-equal -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"config/linker" --specs=nano.specs -L/home/tkl/git/engine_control/source/os/release -Wl,-Map,"/home/tkl/git/engine_control/release/map/arm/release/.map" -lkosmos-arm-stm32f4-discovery -o "/home/tkl/git/engine_control/release/execute/arm/release/.elf" 的帮助文件将位于myfunctions_helper.php文件夹中,并且可能具有以下结构:

/application/helpers

然后,您可以自动加载帮助程序,将其声明为<?php defined('BASEPATH') OR exit('No direct script access allowed'); if (!function_exists('my_static_fuction')) { function my_static_fuction ( ) { return "booger" ; } } // etc...

/application/config/autoload.php

如果你需要构建一个类,那么像@MackieeE所写的库将完成这项工作(check the tutorial以获取更多信息)。