4

PHPで問題が発生しているのは、タイトルに例外の言及がスローされ続けるためです。次の行で失敗します。

$item->getDescription();

エラーの意味を理解しています($itemnull)。ただし、$itemはnullではありません。

シナリオは次のとおりです。これは、サプライヤからストアに製品を同期するスクリプトです。そのために、独自のクラス(SimpleProduct)を作成しました。このクラスにはgetDescription()関数があります。

問題は、私が受け取っているデータには、まだ入力されていないアイテムなど、多くのゴミが含まれている傾向があることです。スクリプトはこれらの項目をスキップし、残りの製品を繰り返し処理する必要があります。この致命的なエラーにより、スクリプト全体が強制終了されます。

私はこれを防ぐためにすでにセーフガードを実装しようとしましたが、それでも常に発生します。現在のコードは次のとおりです(現在のケースに関連していないため、一部のスニペットは削除されています)。

//This is part of a class that performs the sync

public function syncProduct($item) {

    if(empty($item)) { return "Not a product"; }
         else { var_dump($item) }

    $foo = $item->getDescription();
}

var_dumpの結果を確認すると、いくつかの値が入力されたオブジェクトが表示されます。正しいタイプ(SimpleProduct)であり、空/ nullではないため、このエラーは発生しなくなると思われますが、それでも発生します。

また、これがポップアップする前に、いくつかの製品同期がエラーなしですでに発生していることに注意してください。したがって、コードが有効であることがわかります。どういうわけか、この特定のケースは私のヌルチェックをすり抜けます。

nullチェックに問題がありますか?問題のオブジェクトが存在する場合、非オブジェクトのエラーをどのようにスローできますか?

4

5 に答える 5

8

変数が空かどうかをチェックする代わりに、それがのインスタンスであるかどうかをチェックしてみませんかSimpleProduct

if ($item instanceof SimpleProduct)
{

}

http://php.net/manual/en/language.operators.type.php

于 2012-08-06T09:35:06.203 に答える
0

nullチェックでは、オブジェクトに非オブジェクトが含まれている場合でも、オブジェクトの使用が妨げられることはありませ

これを使って:

public function syncProduct($item) {
    var_dump($item);

    if($item InstanceOf SimpleProduct) {
        $foo = $item->getDescription();
    }

    return "Not a product";
}

私は正直に立っています!returnステートメントに気づきませんでした。これが発生するもう1つのケースは、からの値が$item空ではないが積ではない場合です。他のタイプのオブジェクトとしてオブジェクトを使用すると、メソッドが見つからないという別のエラーが発生するため、スカラーまたは配列である可能性があります。

于 2012-08-06T09:29:23.103 に答える
0

確かに、オブジェクトは関数syncProductのコンテキストではまだ使用できません。

var_dump($ item)を実行してそこを確認し、コードのelse部分内で実行して、空でないことを確認してください。

于 2012-08-06T09:32:54.973 に答える
0

$ itemがオブジェクトかどうかを確認するにはis_object()を使用できます

于 2012-08-06T09:35:58.603 に答える
0

私はまた、これを実行した後、同様の問題に遭遇します:

$user = DB::getInstance()->action($action="SELECT * ", 'users');

次に、$ userがDBのインスタンスであるかどうかを確認したところ、そうではないことがわかりました。次に、次のように分離することにしました。

$user = DB::getInstance();
$user->action($action="SELECT * ", 'users');

これを実行し、instanceof()メソッドを使用すると、それがインスタンスになり、メンバー関数への致命的な呼び出しエラーが消えることが示されます。

于 2014-06-20T06:47:55.943 に答える