我可以在codeigniter中覆盖一个函数来使用不同的参数吗?

时间:2014-09-14 00:09:34

标签: php codeigniter

基本上,我想拥有相同页面的多个版本,一些接受参数,一些不接受参数。

例如,

public function index()
{
    require_once(APPPATH . 'views/sessiondata.inc.php');//sets up variables from session data
    require_once(APPPATH . 'views/header.inc.php');//header
        include(APPPATH . 'views/breadcrumbs.inc.php');//top breadcrumbs

        echo ' <h1>Let\'s sell an item, '.$username.',</h1>';


        //print_r($this->session->all_userdata());
        include(APPPATH . 'views/breadcrumbs.inc.php');//bottom breadcrumbs
        require_once(APPPATH . 'views/footer.inc.php');//footer
    }

这是控制器x.php的默认函数,假设。我还可以使用:

public function index($item)
{
    require_once(APPPATH . 'views/sessiondata.inc.php');//sets up variables from session data
    require_once(APPPATH . 'views/header.inc.php');//header
    include(APPPATH . 'views/breadcrumbs.inc.php');//top breadcrumbs

    echo ' <h1>Let\'s sell an item, '.$username.',</h1>';

    //DO SOMETHING WITH THE $item VARIABLE.

    //print_r($this->session->all_userdata());
    include(APPPATH . 'views/breadcrumbs.inc.php');//bottom breadcrumbs
    require_once(APPPATH . 'views/footer.inc.php');//footer
}

系统会自动知道要使用哪个版本吗?是否有类似于我需要使用的Java的@OVERRIDE?

2 个答案:

答案 0 :(得分:1)

没有。 PHP不允许您以这种方式重载函数。也就是说,您可以通过重载__call方法来实现类似的功能:

public function __call ( string $name , array $arguments ) 
{
    if( $name === 'index' && sizeof($arguments) === 1 ) {
        // do index($item) stuff
    } else {
        // do index() stuff
    }
}

但说实话,以这种方式使用__call没有实际价值,并增加了不必要的性能开销和复杂性。在PHP中,如果要重用代码,只需将函数分解为较小的离散函数,并根据需要重用它们。

答案 1 :(得分:1)

您不能拥有两个单独的函数(因为PHP不允许函数重载),但您可以使用CodeIgniter在选择控制器函数时将遵循的默认参数。因此,不要使用两个函数,请执行以下操作:

public function index($item=null)
{
    require_once(APPPATH . 'views/sessiondata.inc.php');//sets up variables from session data
    require_once(APPPATH . 'views/header.inc.php');//header
    include(APPPATH . 'views/breadcrumbs.inc.php');//top breadcrumbs

    echo ' <h1>Let\'s sell an item, '.$username.',</h1>';

    if ($item !== null) {
        //DO SOMETHING WITH THE $item VARIABLE.
    }

    //print_r($this->session->all_userdata());
    include(APPPATH . 'views/breadcrumbs.inc.php');//bottom breadcrumbs
    require_once(APPPATH . 'views/footer.inc.php');//footer
}