3

我制作了一个依赖于现有特定方法的 CodeIgniter 库。这种方法曾经是“隐藏的”(没有记录,但似乎有效)。最终 CodeIgniter 成功了protected,所以我不能从库中调用它。在 GitHub 上的 CodeIgniter 开发版中,有一个我可以使用的新公共方法。

在我的库中,我is_callable用来检测使用哪种方法,旧方法还是新方法。问题是,在当前稳定版本的 CodeIgniter 中,两者都不存在。因此,库将失败。有没有办法可以优雅地出错,或者从我的构造函数中抛出异常?目前,如果这两种方法都不可用,则脚本在尝试调用该方法时将崩溃。

我不知道 CodeIgniter 库由于缺少方法而无法正确加载的约定是什么。

编辑:这是我要问的那一行:

$this->func = is_callable(array($this->db, '_compile_select')) ? '_compile_select' : 'get_compiled_select';

如果这些都不存在(_compile_selectget_compiled_select),那么当库尝试调用$this->func. 我不知道惯例,我可以show_error从图书馆打电话吗?从库的构造函数中抛出错误的正确方法是什么?

4

2 回答 2

3

如果目标只是一个漂亮的错误消息而不是致命错误,那真的很简单:

$this->func = is_callable(array($this->db, '_compile_select')) ? '_compile_select' : 'get_compiled_select';

if ( ! is_callable(array($this, $this->func)))
{
    show_error("You can't use this library, you're missing a function");
}

基本上,只是不要假设get_compiled_select在您的条件中是可调用的 - 首先检查。

我可以从图书馆调用 show_error 吗?

是的,这是 中定义的功能之一core/Common.php,您可以在 CI 应用程序的任何地方使用它。

当然,从技术上讲,这并不是throw一个例外,但它是 Codeigniter 的惯例。如果您想catch出错并尝试其他方法,这可能会出现问题:

try {
    $this->load->library('might_not_exist', 'alias');
} catch (Exception $e) {
    $this->load->library('definitely_exists', 'alias');
}

以上将不起作用,因为show_error()将在执行 catch 块之前被加载程序调用并退出程序。

于 2012-08-28T20:21:20.490 回答
1

我不确定,但看到这个 URL 我认为它对你很有帮助。

http://codeigniter.com/forums/viewthread/67096/

也可以看看

http://phpcodeignitor.blogspot.in/2011/07/php-exception.html

或试试这个

MY_Exceptions.php 并将其放入 /applications/libraries/

 <?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_Exceptions extends CI_Exceptions{

    function MY_Exceptions(){
        parent::CI_Exceptions();

    }

    function show_404($page = '')
    {
    echo 'test';
    }

    function show_error($heading, $message, $template = 'error_general')
    {
echo 'test';    
}

    function show_php_error($severity, $message, $filepath, $line)
    {
         echo 'test';
         }
}
?>

MY_Exceptions 中的函数似乎根本没有被覆盖。异常中的函数是运行的函数

于 2012-08-28T20:10:41.000 回答