PHP: CodeIgniter3中函数名不能与控制器名相同的问题
2016-09-29 00:00
459 查看
PHP: 有关CodeIgniter3中函数名不能与控制器名相同的问题
在CodeIgniter3开发中遇到一个问题:
控制器名与方法名同名时,报"404 Page Not Found"错误。
比如有个控制器“Controllers/Login.php”:
预期结果是: 可以使用“index.php/login/login”访问此login()函数,输出"login"字符串
实际结果是: 页面报出"404 Page Not Found"错误
查看CodeIgniter3框架代码,在CodeIgniter.php中有这样一段代码:
问题就出在函数 is_callable() 上面, 从PHP5.3起,构造函数调用is_callable()检查会返回不可被调用。
$class 的值为 'Login', $method的值为'login', 方法login()被当成了控制器Login的构造函数(PHP4风格)
查看CodeIgniter2中的CodeIgniter.php代码,没有发现有使用is_callable函数,所以CodeIgniter2不会有这个问题。
好吧,看来目前CodeIgniter3不能再使用控制器和方法名相同的命名了。
PHP手册上有这样一个示例:
参考资料:
http://codeigniter.org.cn/user_guide/general/controllers.html
http://php.net/manual/en/function.is-callable.php
[完]
在CodeIgniter3开发中遇到一个问题:
控制器名与方法名同名时,报"404 Page Not Found"错误。
比如有个控制器“Controllers/Login.php”:
class Login extends CI_Controller{ function login(){ echo 'login'; } }
预期结果是: 可以使用“index.php/login/login”访问此login()函数,输出"login"字符串
实际结果是: 页面报出"404 Page Not Found"错误
查看CodeIgniter3框架代码,在CodeIgniter.php中有这样一段代码:
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()检查会返回不可被调用。
$class 的值为 'Login', $method的值为'login', 方法login()被当成了控制器Login的构造函数(PHP4风格)
查看CodeIgniter2中的CodeIgniter.php代码,没有发现有使用is_callable函数,所以CodeIgniter2不会有这个问题。
好吧,看来目前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
[完]
相关文章推荐
- PHP 函数之 array_merge_recursive,相同键合并问题
- PHP语言 fopen()函数不能打开文件的问题
- PHP中被调用的PHP文件中有函数则调用文件里不能重复定义的问题
- php不能上传is_uploaded_file函数引发的问题
- 问题: 更新处理函数在对话框的菜单中不能工作?
- javascript firefox中onclick()函数不能用的问题
- 解决php的loadXML()不能识别空格的问题
- oracle 临时表 解决 "表 *** 发生了变化,触发器/函数不能读"的问题
- 抛开Cookie使用SESSION-PHP中SESSION不能跨页传递问题的解决办法(转载)
- PHP 内置 函数 32 位 和 64 位平台兼容性问题
- 处理 C++ 项目中的 IntelliSense 失败:输入类实例后,不能显示其成员几成员函数问题解决
- 在Netscape中,event.target 不能在函数中调用的问题
- PHP字符串截取函数(解决中文乱码问题!支持UTF-8和GB2312)
- 解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
- 解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
- 解决PHP中函数重复定义的问题
- php的mail()函数出错的问题
- PHP中SESSION不能跨页传递问题的解决办法
- 在php中 urlencode函数解决乱码问题
- 刻录光驱不能访问出现函数不正确问题解决