PHP: CodeIgniter3中函數名不能與控制器名相同的問題

PHP: 有關CodeIgniter3中函數名不能與控制器名相同的問題php

在CodeIgniter3開發中遇到一個問題:html

控制器名與方法名同名時,報"404 Page Not Found"錯誤。框架

好比有個控制器「Controllers/Login.php」:ide

class Login extends CI_Controller{
	function login(){
		echo 'login';
	}
}

預期結果是: 可使用「index.php/login/login」訪問此login()函數,輸出"login"字符串函數

實際結果是: 頁面報出"404 Page Not Found"錯誤codeigniter

查看CodeIgniter3框架代碼,在CodeIgniter.php中有這樣一段代碼:ui

require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php');
if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)){
	$e404 = TRUE;
}
elseif (method_exists($class, '_remap')){
	$params = array($method, array_slice($URI->rsegments, 2));
	$method = '_remap';
}
elseif ( ! is_callable(array($class, $method))){
	////問題在這裏: 
	////is_callable(array($class, $method)) 返回 false.
	////$class的值爲 'Login', $method的值爲'login', 方法login()被當成了控制器Login的構造函數(PHP4風格)
	$e404 = TRUE;
}

問題就出在函數 is_callable() 上面, 從PHP5.3起,構造函數調用is_callable()檢查會返回不可被調用。.net

$class 的值爲 'Login', $method的值爲'login', 方法login()被當成了控制器Login的構造函數(PHP4風格)code

查看CodeIgniter2中的CodeIgniter.php代碼,沒有發現有使用is_callable函數,因此CodeIgniter2不會有這個問題。orm

好吧,看來目前CodeIgniter3不能再使用控制器和方法名相同的命名了。

PHP手冊上有這樣一個示例:

Example #2 is_callable() and constructors
As of PHP 5.3.0 is_callable() reports constructors as not being callable.   
This affects PHP 5 style constructors (__construct) as well as PHP 4 stlye constructors (i.e. methods with the same name as the class).   
Formerly, both cases have been considered callable.

<?php
class Foo{
    public function __construct() {}
    public function foo() {}
}
var_dump(
    is_callable(array('Foo', '__construct')),
    is_callable(array('Foo', 'foo'))
);

上邊這段代碼將會輸出: 
The above example will output: 
bool(false)
bool(false)

參考資料:

http://codeigniter.org.cn/user_guide/general/controllers.html
http://php.net/manual/en/function.is-callable.php

[完]

相關文章
相關標籤/搜索