5

まず最初に、この質問がここで2回以上出回っていることを知っています。

しかし、すべてのE_NOTICEを修正すればするほど(人々が言うように)、次のことに気づきます。

  • 私はマイクロ最適化しています
  • 私は実際にもっと多くのコードを作成していて、コードを維持するのが難しく、遅くなっています

例を見てみましょう:

MongoDB PHPドライバーを使用していて、データベース内のコレクション内の単一の行を表すクラス内で名前がMongoDate付けられたクラス変数内のオブジェクトがあるとします。tsここで、次のようにこの変数にアクセスします。ただし、この特定の行にはフィールドがない$obj->ts->secため、この場合はオブジェクト自体として定義されていないため、PHPは近似(E_NOTICE)をスローします。したがって、これは問題ないと思います。これは望ましい動作です。returnnullが設定されていない場合は、インタプリタ自身のロボット動作の外で自分で処理します(varがまたはである場合にのみ戻る関数でこれをラップするため) )。tstsdate()1970nullnone-object

しかし、今度は、別の開発者としてそのE_NOTICEを修正することは、E_NOTICEを持っていることはひどいことであり、エラーに応じてそれを行わないようにコードを遅くするので、私に本当に望んでいます。$objそこで、というクラスで新しい関数を作成し、getTsそれに3行を与えます。文字通り、tsvarがMongoDateオブジェクトであるかどうかを確認し、オブジェクトである場合はそれを返します。

なぜ?PHPは、アプリ自体のランタイム内で実行するよりもはるかに高速なインタープリター内でこれを完全にうまく実行できませんか?つまり、コードに役に立たないバンプを追加する必要があるすべての場所で、実際に処理する変数を検出するためのほとんど空の関数を、PHP独自の機能で返したり、本当に必要なときにnullチェックしたりすることができます(操作に不可欠な場合上記の関数の動作)そして、私が約300行追加instanceofしたsを始めないでください、それは手に負えなくなっています。もちろん、あなたができないので、私はこの関数を作らなければなりません:isset()isset()getTs

class obj{
    public $ts = new MongoDate();
}

ts内に格納するか__constructor(どちらもあまり満足していません。そのまま多くの魔法を使用しています)、関数を使用して設定されているかどうかを検出する必要があります(これは現在行っています)。

つまり、修正する必要がある理由を理解しています。

  • 未定義の変数
  • 未設定の変数(nullvars)のプロパティの割り当て
  • 一定のエラーなど

しかし、コードをテストし、それが安全であり、希望する方法でのみ機能することがわかっている場合、すべてのエラーundefined indexまたはnone-objectエラーを修正するポイントは何ですか?たくさんのisset()sと2行の関数をコードに追加することは、実際にはマイクロ最適化ではありませんか?

サイトの半分をE_NOTICEに準拠させた後、実際にはより多くのCPU、メモリ、および時間を使用していることに気付きました...エラーであるエラーだけでなく、すべてのE_NOTICEエラーに対処するポイントは本当に何ですか?

あなたの考えをありがとう、

4

2 に答える 2

6

を使用すると、確かにパフォーマンスが向上しますisset()。少し前にいくつかのベンチマークを実行しましたが、エラーを非表示にするだけで約10倍遅くなりました。

http://garrettbluma.com/2011/11/14/php-isset-performance/

とはいえ、PHPでは通常パフォーマンスは重要な要素ではありません。何をするの個人的に私を夢中にさせるのはサイレントエラーです。

インタプリタが何かをエラーとしてフラグ付けしないことを選択した場合(不安定になる可能性があります)、大きな問題になります。特にPHPは

  • エラーが発生する可能性のあるもの(データベースへの接続の失敗など)について警告し、
  • 警告すべき事項に関する通知を発行します(たとえば、nullオブジェクトのメンバーにアクセスしようとする)。

おそらく私はこの種のことについて過度に意見を述べていますが、私は以前にこれらのサイレントエラーに噛まれたことがあります。エラー報告には常にE_NOTICEを含めることをお勧めします。

于 2012-07-16T19:21:20.987 に答える
3

それらを修正する必要があるかどうかは確かに議論の余地があり、あなたの状況でのリターンに依存します。たとえば、コードの寿命が長くなるか、開発者が増えるかなどがより重要になります。

一般に、関数が他の誰かによって使用される(および誤用される)と想定するのがベストプラクティスであるため、これを説明するためにisset /!empty/is_objectチェックを実行する必要があります。多くの場合、あなたのコードは、あなたが意図していなかった使用法や状況への道を見つけるでしょう。

パフォーマンスに関しては、あらゆる種類のエラーがスローされるたびに(E_NOTICEを含む)、インタープリターはエラーハンドラーを起動し、スタックトレースを構築し、エラーをフォーマットします。重要なのは、レポートがあるかどうかに関係なく、エラーは常に実行を遅くするということです。したがって、E_NOTICEを回避するための2〜3回の関数呼び出しは、パフォーマンスを向上させます

編集: 上記の例の代替案

エラーを回避するために、必ずしも追加のオブジェクトを作成する必要はありません。あなたは優雅にそれらなしでそれらを避けることができます。ここにいくつかのオプションがあります:

1)欠落しているtsを処理する関数:

SpecialClass class {

    funciton getTs () {
        return !empty($this->ts) ? $ts->sec : false;
    }
}

2)テンプレート/手順で欠落しているtsに対処します。

if (!empty($obj->ts->sec)) {
    //do something
}

empty()の代わりに使用できるので、特に気に入っています(isset($var) && ($var or 0 != $var //etc))。複数の呼び出し/比較を保存し、空の場合、ターゲットの変数または属性の通知がスローされることはありません。存在しない変数のプロパティ/メンバーで呼び出すと、エラーがスローされます。

于 2012-07-16T18:57:15.430 に答える