【问题标题】:When instantiating a PHP, there arguments that a passed as for instance实例化 PHP 时,例如传递的参数
【发布时间】:2018-01-24 13:19:42
【问题描述】:

当实例化一个类时,有时会有参数/参数传递给该类的构造函数

class MyLibrary{
    function __construct($param1, $param2, $param3){
      /*
      * do something with those params
      * Here im setting "something" to be $param3 instead of param1 nor param2
      */
      $this->something = $param3; //I used param three to clarify my question
    }
}

类构造函数依赖于这些参数在 Codeigniter 中运行,它们声明在使用时参数必须以数组的形式传递

$arg = ['param1' => '1', 'param2' => '2', 'param3' => '3'];

$this->load->library('MyLibrary', $arg, 'custom_name');

所以我的问题是,如何按照构造函数在 Codeigniter 中期望它们的顺序传递这些参数?

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    您的构造函数将按照您填充它的顺序接收数组。

    所以当你这样做时:

    $arg = ['param1' => '1', 'param2' => '2', 'param3' => '3'];
    $this->load->library('MyLibrary', $arg);
    

    你的库中的构造函数必须是这样的:

    public function __construct($args)
    {
        // Do something with $args like:
        $this->var1 = $args['param1'];
        $this->var2 = $args['param2'];
        // etc
    }
    

    请参阅文档以供参考:https://www.codeigniter.com/user_guide/general/creating_libraries.html

    【讨论】:

    • 说它是第三方库,我不想去修改库,我只想传参数玩
    【解决方案2】:

    基于您在上面定义的数组$arg

    $this->something = $arg['param3'];
    

    如果您的问题是“如何定义一个接受 __construct 参数的自定义类,该类可以使用 $this->load->library() 加载?”答案是使用关联数组作为参数。 `load' 类只允许一个参数,所以你必须使用一个数组来传递多个值。

    所有核心库都使用关联数组将参数传递给类构造函数。

    您的库必须这样定义。

    /application/libraries/Custom_library.php

    class Custom_library
    {
        public function __construct($args = array()){
          //code here
        }
    }
    

    如果Custom_library 需要三个参数,那么您需要创建并传递一个具有三个名称/值对的关联数组。在控制器中它可能看起来像这样。

    class Example extends CI_Controller
    {
        public function __construct()
        {
            parent::__construct();
            //create an associative array
            $args = ['param1' => '1', 'param2' => '2', 'param3' => '3'];
            //pass array to library
            $this->load->library('custom_library', $args);
        }
    }
    

    要使用上述控制器,可以像这样定义更完整的Custom_library 版本

    class Custom_library
    {
        protected $foo;
        protected $bar;
        protected $baz;
    
        public function __construct($args = array())
        {
            if(!empty($args))
            {
                $this->foo = $args['param1'];
                $this->bar = $args['param2'];
                $this->baz = $args['param3'];
            }
        }
    }
    

    【讨论】:

    • 我明白这一点,所以有时,那些是第三方库,我们不想修改它们,它们只是即插即用库。这些库只希望您传递这些参数
    • $arg 数组是索引的或关联的。如果库指定了索引数组,则它依赖于将它们添加到数组中的顺序。如果库指定了一个关联数组,那么数组的键必须与库所期望的匹配 - 就像我的答案中的示例一样。还是我完全误解了你的问题?
    • 让我试着解释一下,例如,我想为参数 1 传递 value = 1,为参数 2 传递 value 5以及参数 3 的 值“参数 3”
    • 我已经扩展了我的答案,希望能回答你的问题。
    【解决方案3】:

    根据您的评论:

    我明白这一点,所以有时,那些是第三方库和 我们不想修改它们,它们只是即插即用库。 这些库只希望您传递这些参数

    如果它是您不想想要修改的第三方库,就像 DFriend 在他的回答中建议的那样。

    在模型/控制器/基础控制器中:

    require_once(APPPATH . '/third_party/somename.php);

    然后在你需要的地方new Somename($param1, $param2, $param3)

    不是应该在 CI 中完成的事情(如果你想修改,DFriends 的回答是最好的),但我理解有时人们不想修改库,所以更新或任何简单的事情,你都可以在 CI 中以这种方式使用普通的 php。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      相关资源
      最近更新 更多