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_selectまたはget_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を呼び出すことはできますか?

はい、これはで定義されている関数の1つであり、core/Common.phpCIアプリのどこでも使用できます。

もちろん、技術的にはこれは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 に答える