用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3670|回复: 6
收起左侧

[已解决] 引用类文件的奇怪问题

[复制链接]
发表于 2012-6-30 09:07:57 | 显示全部楼层 |阅读模式
本帖最后由 bottom 于 2012-6-30 11:53 编辑

我在CI下面自己写了一个库,用于封装一些常用的操作。但是在写动态调用代码的时候遇到了一个问题,就是在下面的代码中:
PHP复制代码
 
//生成实际命令类所在文件路径
        $filepath = APPPATH . 'libraries/Seashell/bin/' . $command .'.php';
        //判断文件是否存在
        if(file_exists($filepath))
        {
            //存在,引入实际命令类
            require $filepath;
            //实际命令类名称首字母大写
            $class_name = ucfirst($command);
            //调试代码
            $this->response = $class_name;
                return;
            //判断实际命令类是否存在
            if(class_exists($class_name, FALSE))
            {
               
                //建立实际命令类实例,传入CI的资源变量
                //$this->instance = new $class_name($this->CI);
                //调用执行方法,保存返回值到$response中
                //$this->response = $this->instance->run($args);
               
            }
            else
            {
                //否则,抛出异常
                throw new Seashell_Exception('没有此命令的定义', 'Seashell');
                die();
            }
        }
        else
        {
            //否则,抛出异常
            throw new Seashell_Exception('命令不存在!', 'Seashell');
            die();
        }
       
 
复制代码

比如说我现在的$command是“delete-ticket”,那么就应该引用文件APPPATH/libraries/Seashell/bin/delete-ticket.php。这个文件已经存在,里面的内容为:
PHP复制代码
 
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
//这里是引用另外的一个基类文件
require dirname(__FILE__).'/../share/Base.php';
 
class Delete-ticket {
}
 
复制代码

现在有一个问题就是,当delete-ticket.php里面没有Delete-ticket类的定义,只有require一句的时候,之前的代码能够正常运行到“$this->response = $class_name;”这一句并返回。但是如果有Delete-ticket类的定义时,不管有没有require语句,都报错。

百思不得其解,求高手指点。

发表于 2012-6-30 09:45:00 | 显示全部楼层
报什么错是关键
 楼主| 发表于 2012-6-30 09:59:12 CI中国手机版 | 显示全部楼层
Hex 发表于 2012-6-30 09:45
报什么错是关键

我用的是nginx,只看到HTTP 500错误。
等下我再去开错误报告。
其实都有哪些情况会引起这样的错误呢?
发表于 2012-6-30 11:26:14 | 显示全部楼层
把报错信息贴上来吧
 楼主| 发表于 2012-6-30 11:52:57 | 显示全部楼层
搞定了。
开了错误信息之后,看到这么一句话:
  1. Parse error: syntax error, unexpected '-', expecting '{' in /var/www/application/libraries/Seashell/bin/delete-ticket.php on line 13
复制代码


原来类名里面不能用“-”号~修正就好了。不过还是不清楚php这样设计的用意。

顺便放一下nginx里面开错误报告要改的设置,Ubuntu12.04下默认是不出错误报告的。
一个是fastcgi_params,里面的"fastcgi_intercept_errors"要改成off
第二个是php.ini,里面的display_errors要设成on
最后一个是/etc/php5/fpm/pool.d/www.conf,这个比较偏门,里面的php_flag[display_errors]要去掉注释,并设为on

评分

参与人数 1威望 +5 收起 理由
Hex + 5 感谢分享

查看全部评分

发表于 2012-6-30 15:10:14 | 显示全部楼层
bottom 发表于 2012-6-30 11:52
搞定了。
开了错误信息之后,看到这么一句话:

减号不能用作标识符这个应该比较容易理解,因为减号是一个运算符,如果减号可以用作标识符,那 $abc-def 你怎么区分是在做减法还是一个变量名呢?

PS: 你分享的经验很不错~
 楼主| 发表于 2012-6-30 19:00:14 | 显示全部楼层
Hex 发表于 2012-6-30 15:10
减号不能用作标识符这个应该比较容易理解,因为减号是一个运算符,如果减号可以用作标识符,那 $abc-def  ...

受教了。

本版积分规则