0

同じクラス名の prefix_Exceptions.php という名前のアプリケーション/コアに例外があります。コントローラーからこの例外をスローしようとすると、次のようになります。

Fatal error: Class 'prefix_Exceptions' not found in user_controller.php

application/core/prefix_Exceptions.php

<?php
class prefix_Exceptions extends CI_Exceptions {
    public function __construct() {
        parent::__construct();
    }

    public function test() {
        echo "This is a test.";
    }
}

そしてでapplication/controllers/user_controller.php

<?php
class User_Controller extends CI_Controller {
    public function view($id = '0') {
        $this->load->model('user_model');
        $u = $this->user_model->getUser($id);

        if (!isset($u)) {
            $this->exceptions->test(); // ???
        }
        echo "Test: $u";
    }
}

ああ、私のプレフィックスは次のように設定されていprefix_ます:

$config['subclass_prefix'] = 'prefix_';

この問題について約12のスレッドを読みましたが、コントローラーによってスローされるように例外を修正するスレッドはありません。

4

1 に答える 1

6

コードが機能しない主な理由は (エラー メッセージが示唆するように)、次のとおりprefix_invalid_user.phpです。必要なファイル命名スキームに従っていないため、CI はこのファイルをロードすることを知りません。

組み込みクラスを拡張したい場合は、プレフィックスを からCI_に変更することを除いて、同じクラス名を使用する必要がありますMY_(または構成で設定したプレフィックス)。

クラスを拡張するにCI_Exceptionsは、名前を付けてMY_Exceptions、その php ファイルを に保存する必要があります/application/core/MY_Exceptions.php。その後、CI が自動的にロードします。

ただし、CI の例外クラスは実際には例外をスローするためのものではないことも知っておく必要があります (名前は誤解を招きますがCI_Exceptions、エラー報告を処理します)。/system/core/Exceptions.phpファイルからわかるように、このCI_Exceptionsクラスは PHP のネイティブ クラスを拡張していませんExceptions。これは、カスタムのスロー可能な例外を作成するために必要です。

カスタムのスロー可能な例外が必要な場合は、独自のラッパーを作成し、ライブラリとしてロード/オートロードする必要があります。

編集:

OPの要求に従って、ソリューションの残りの半分を追加します。これは、CIの内部からクラスオブジェクトを取得するだけでした。このために、load_class関数を使用できます。この関数は、インスタンス化されている場合はクラス オブジェクトを返し、そうでない場合はインスタンス化して返します。

$foo = load_class('Exceptions', 'core', $this->config->item('subclass_prefix'))

次に、カスタム Exceptions クラスのメソッドに次のようにアクセスできます。

$foo->someMethodName();
于 2013-10-04T17:08:08.907 に答える