# CodeIgniter 控制器 - 重新定义方法的调用规则

**URL:** <https://www.isharkfly.com/t/codeigniter/2873>\
**Category:** PHP\
**Created:** [January 5, 2014, 1:15am UTC](https://www.isharkfly.com/t/codeigniter/2873 "2014-01-05T01:15:43Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [January 5, 2014, 1:15am UTC](https://www.isharkfly.com/t/codeigniter/2873/1 "2014-01-05T01:15:43Z")

</div>

如上所述，URI 的第二片段决定会调用控制器中的哪个方法。CodeIgniter 允许你使用 \_remap() 方法来废除这种规则：`public function _remap()
{
 // Some code here...
}`注意：如果你的控制器中包含一个名为 \_remap() 的方法，那么不管你的 URI 中包含什么，它总会被忽略掉。

这个方法会废除掉由 URI 片段来决定哪个方法被调用的规则，允许你重新定义调用方法的规则（方法的路由规则）。

被重新定义的方法调用方式（一般是 URI 中的第二片段）将作为一个参数传递给 \_remap() ：`
public function _remap($method)
{
 if ($method == 'some_method')
 {
 $this->$method();
 }
 else
 {
 $this->comments();
 }
}`任何附加在该方法名称之后的段都会被视为 \_remap() 的第二个参数（可选）。这个可选的数组参数可以与PHP的call\_user\_func\_array联用，模拟CodeIgniter的默认行为。`public function _remap($method, $params = array())
{
 $method = 'process_'.$method;
 if (method_exists($this, $method))
 {
 return call_user_func_array(array($this, $method), $params);
 }
 show_404();
}`
