0

誰かがを処理する方法を提供してくださいFatal error: Call to a member function prepare() on a non-object

これが私のシナリオです:

データベースの詳細を格納し、要求されたときに PDO オブジェクトのインスタンスを作成するシングルトン データベース クラスがあります。

次に、次の2つのクラスがあります。

基本クラス:

namespace lib\translator;
use lib\database as db;

class EntityTranslator {
    protected $dbConn;

    public function __construct() {
        try {
            $this->dbConn = db\Database::getInstance();
        }
        catch(\PDOException $e) {
            // do some error logging here
        }
    }
}

サブクラス:

namespace lib\translator;
use lib\entity as entity;

class RequestTranslator extends EntityTranslator {

    public function __construct() {
        parent::__construct();
    }

    public function createRequest() {
        $request = new entity\Request();
        try {
            $stmt = $this->dbConn->prepare("CALL createRequest()");
            $stmt->execute();

            $rowCount = $stmt->rowCount();
            if ($rowCount == 1) {
                $row = $stmt->fetch(\PDO::FETCH_ASSOC);

        // do stuff with the data here
            }
            return $request;
        }
        catch (\PDOException $pdoe) {
        // do error logging here
        }
    }
}

さて、なぜエラーが発生するのか不思議ではありません。データベース接続が利用できず、PDO オブジェクトのインスタンス化 ( への呼び出しを介して行われるdb\Database::getInstance()) が例外をスローし、変数$dbConnが残りnull.

毎回使用する前$dbConnにテストすることは可能だと思います。しかし、私が述べたように、これは非常にまれな状況であり、実際には決して発生しない可能性があるため、毎回nullチェックすることは賢明なパフォーマンスの選択ではないと思います.null

catch(\Exception $ex){}別のブロックを追加して、本質的に (Java で見られるように) を処理できるようにしたいと考えてNullPointerExceptionいますが、PHP はそのような例外を提供していません。むしろFatal error: Call to a member function prepare()、非オブジェクトに対して を発行します。

したがって、私が探しているのは、この状況で、null毎回チェックせずにこのエラーを処理する方法です。

PHP でのエラー処理の基本的な概念を見逃している可能性がありますが、このトピックに関する決定的なリソースを見つけることができませんでした。

助言がありますか?

4

3 に答える 3

0

RequestTranslator::createRequest()インスタンス化の時点でRequestTranslator、データベース接続が適切にインスタンス化されているかどうかがすでにわかっているのに、なぜアプリケーションは呼び出しを許可されているのでしょうか?

アプリケーション ロジックが次のようなものであってはなりません。

try
{
    /*
     * the following line should throw
     * SomeMeaningfulException when it 
     * is unable to connect to the database
     */
    $rt = new lib\translator\RequestTranslator();

    /*
     * this line should not be reached
     * if the above throws SomeMeaningfulException
     */
    $rt->createRequest();
}
catch( SomeMeaningfulException $e )
{
    /* $rt database connection has not instantiated properly */
}

つまり、オブジェクトのメソッドが適切に機能することに依存している場合、データベース接続をインスタンス化できない場合、コンストラクターはRequestTranslator既にスローする必要があります。SomeMeaningfulException

class EntityTranslator {
    protected $dbConn;

    public function __construct() {
        try {
            $this->dbConn = db\Database::getInstance();
        }
        catch(\PDOException $e) {
            // do some error logging here
            throw new SomeMeaningfulException( 'some meaningful message' );
        }
    }
}

nullこれがどういうわけか好まれない場合、チェックがそれほど問題なる理由がわかりません。パフォーマンスのペナルティはおそらく無視できるという他の人に同意します。

于 2012-10-20T07:02:09.133 に答える
0

PHP では、致命的なエラーをキャッチして回復することはできません。シャットダウン関数を登録して、最後のエラーの詳細を報告できますが、Java の finally ブロックのようなものはありません。

ここでのより詳細な説明: How do I catch a PHP Fatal Error

null毎回チェックすることをお勧めします - コードが実行している他のことと比較して、これは安価な呼び出しです。

于 2012-10-20T05:20:05.153 に答える
0
public function createRequest() {
        $request = new entity\Request();
        try {
            if(!is_null( $this->dbConn)){
            $stmt = $this->dbConn->prepare("CALL createRequest()");
            $stmt->execute();

            $rowCount = $stmt->rowCount();
            if ($rowCount == 1) {
                $row = $stmt->fetch(\PDO::FETCH_ASSOC);

        // do stuff with the data here
            }
            return $request;
          }
        }
        catch (\PDOException $pdoe) {
        // do error logging here
        }
    }
于 2012-10-20T05:14:18.857 に答える