文档章节

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

王永濤
 王永濤
发布于 2016/09/29 22:04
字数 442
阅读 28
收藏 0
点赞 0
评论 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

[完]

© 著作权归作者所有

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

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

刘胜球 ⋅ 2015/09/27 ⋅ 0

PHP简明教程-面向对象基础 1

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

栗子boomboomboom ⋅ 2017/07/03 ⋅ 0

PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

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

big_cat ⋅ 2016/02/02 ⋅ 0

ThinkPHP的使用基础(一)

在项目开始就要开始创建单入口文件,然后运行它,以便让系统产生一个名为INDEX的编译文件; 2.我们所需要的使用的模板就放在这个编译文件的Tpl文件夹下面;但是我们要在这个编译的Tpl文件下面...

笨小熊 ⋅ 2014/07/27 ⋅ 0

PHP高级编程中关于PHP函数的介绍

PHP函数 在PHP中,函数是一段PHP代码的集合,通过调用函数就可以执行一些任务或返回一些结果。PHP脚本通常是由主程序和函数构成的,这些函数不仅构成了PHP脚本的主要功能,也实现了程序代码的...

PXZ6603 ⋅ 2016/08/19 ⋅ 0

PHP高级编程中关于PHP函数的介绍

PHP函数 在PHP中,函数是一段PHP代码的集合,通过调用函数就可以执行一些任务或返回一些结果。PHP脚本通常是由主程序和函数构成的,这些函数不仅构成了PHP脚本的主要功能,也实现了程序代码的...

PXZ6603 ⋅ 2016/08/20 ⋅ 0

使用 CodeIgniter 框架快速开发 PHP 应用(七)

CodeIgniter 和对象 这是玩家章节。它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'。如果你是 CI 的新手,你可能想要跳过它。不过, 迟早, 你可能想要了解CI的幕后在发生什...

mac_zhao ⋅ 2014/12/15 ⋅ 0

PHP开发脚手架--Bingo

一个小巧易用,流程完整,易于拓展,方便维护的PHP开发脚手架。 Bingo目录 components:系统组件目录 Model.php:model组件 config:系统配置目录 core:系统核心文件目录 Action.php:动作基类 ...

夏涌升 ⋅ 2013/08/06 ⋅ 1

PHP 方法覆盖override 与 抽象方法的实现之间的关系

Overload重载:重载是多态的基础,是方法名相同但根据参数不同做不同的处理,PHP是弱类型语言,不能直观的实现方法重载 Override覆盖:覆盖是子类继承父类方法并对齐进行重新构造,方法名相同...

big_cat ⋅ 2015/09/13 ⋅ 0

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

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

ddwhan0123 ⋅ 2017/09/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 15分钟前 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部