文档章节

PHP: CodeIgniter3中函数名不能与控制器名相同的问题

王永濤
 王永濤
发布于 2016/09/29 22:04
字数 442
阅读 31
收藏 0

PHP: 有关CodeIgniter3中函数名不能与控制器名相同的问题

在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

[完]

© 著作权归作者所有

共有 人打赏支持
王永濤
粉丝 10
博文 57
码字总数 35659
作品 0
浦东
程序员
php codeigniter

1、CI是什么 CI的全称是CodeIgniter, 一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序。基于MVC设计模式,轻量易学,注重...

刘胜球
2015/09/27
122
0
PHP简明教程-面向对象基础 1

PHP简明教程 面向对象基础 1 类中魔术方法 类中魔术方法不能被手动调用,几乎每个魔术方法都有触发时机和参数,PHP不能调用类中没有实现的魔术方法 方法名 触发时机 参数1 参数2 备注 get() 对...

栗子boomboomboom
2017/07/03
0
0
PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

相比 PHP5.2 版本 PHP5.3 新增了三大主要新特性 命名空间 延迟静态绑定 lambda匿名函数 命名空间的出现也使PHP可以更加合理的组织项目结构,同时通过命名空间和自动载入机制一大批 PHP 的 MV...

big_cat
2016/02/02
5.4K
0
php CI框架学习笔记第一期(目录结构,控制器,视图)

1.目录结构 在编写代码之前,要明确,我们的代码写在什么地方?(解压后的目录结构) 其中user_guide 一般会将其删除 重点来关注application文件夹 2.控制器 控制器说白了就是一个类文件,并...

Rhymo-Wu
07/05
0
0
分享下学习Kotlin的历程-构造函数/抽象类/枚举

转载请注明出处:王亟亟的大牛之路 开篇之前还是老规矩,先安利https://github.com/ddwhan0123/Useful-Open-Source-Android 还是尽量每天做更新和维护 Kotlin和Java一样支持多构造函数的姿势...

ddwhan0123
2017/09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

WePY 开发指南注意事项

**** 1 代码规范 **** 1 变量与方法尽量使用驼峰式命名,并且注意避免使用$ 开头的标识为Wepy框架的内建属性和方法,可在JavaScript 脚步可以this的方式直接使用。2 小程序入口,页面,...

舒龙虎
34分钟前
3
0
70:shell脚本中的逻辑判断(文件目录属性判断、if判断、case用法)

1、shell脚本中的逻辑判断语法: 格式1:if 条件 ; then 语句 ; fi 格式2:if 条件 ; then 语句; else 语句;fi 格式3:if 条件; then 语句;elif 条件;then 语句;else 语句;fi 逻辑...

芬野de博客
34分钟前
2
0
Java调用脚本并输出脚本返回数据

public class ExecuteSHFile {private static Logger logger = LoggerFactory.getLogger(ExecuteSHFile.class);public static String executeSHFile(String shutdown_path) throws ......

Aeroever
36分钟前
1
0
MySQL常见错误

###Ignoring query to other database 登录数据库时 没有在用户名前加-u

我是菜鸟我骄傲
37分钟前
2
0
mysql之explain分析

我是参考这篇文章的 https://my.oschina.net/ruoli/blog/1807394

求是科技
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部