2

ライブ サーバーで E_NOTICE を有効にして使用する必要がありますか?

E_NOTICE エラーを修正する必要があるのはなぜですか? でわかるように 誰もが再びisset()通知を省略するために使用しています。私はプロを読んだことがありますが、コードの読みやすさはどうですか?

いくつかのコードを調べてみましょう:

if ($this->_oldattributes['category_id'] != $tattr['category_id']
    || $this->_oldattributes['deal_id'] != $tattr['deal_id']
) {

ここで私が何を望んでいるのかを理解するのは明らかですよね?

isset()通知を省略して追加しましょう:

$old_cat_id = isset($this->_oldattributes['category_id']) ? $this->_oldattributes['category_id'] : null;
$new_cat_id = isset($tattr['category_id']) ? $tattr['category_id'] : null;
$old_deal_id = isset($this->_oldattributes['deal_id']) ? $this->_oldattributes['deal_id'] : null;
$new_deal_id = isset($tattr['deal_id']) ? $tattr['deal_id'] : null;
if ($old_cat_id != $new_cat_id || $old_deal_id != $new_deal_id) {

悪くはありませんが、ここで何が起こっているのかを理解するには、もっと時間が必要です。

デバッグに関するいくつかのビット - 初期化されていない変数が原因で発生したエラーをデバッグするために 1 日を無駄にすることはありませんでした。はい、クラス/関数に滑り込むために30分が無駄になったかもしれませんが、コードの可読性を失うことと比較すると、これは大きな無駄ではありませんか?

パフォーマンスに関するいくつかのビット - http://seanmonstar.com/post/909029460/php-error-suppression-performance

違いは、最初に通知が存在するかどうかをチェックするだけで、通知を抑制するのに 100% かかったということです」 DB接続等に比べて時間はかかりますか?

たぶん、私は正しいコードを書くことに慣れていないだけかもしれません(長い間PHPだけを使用していました)。

コンテキストのために、プロジェクトを E_NOTICE を表示するサーバーに移動しました。そのため、これを求めています。それらをオフにすることがなぜこれが大きな問題なのかわかりませんか?

もう一つの例:

class Item extends CActiveRecord {
    private $_oldattributes = array();

public function afterFind()
{
    // Save old values
    $this->_oldattributes = $this->getAttributes();
    $this->_oldcategory = $this->category;
    $this->_olddeal = $this->deal;
}

したがって、古い属性が存在しない場合は null になります。

$tattr = $this->getAttributes();
$this->_oldattributes['category_id'] != $tattr['category_id']

これで必要なものが得られ、エラーはありませんよね?

オブジェクト エラーではない場合と同じです。Yii でリレーションを設定したときに、一部のオブジェクトが初期化されていない可能性があります。はい、一種のエラーがあります。この場合、null 値があり、初期化されていないため、実際のエラーになることがあります。

$this->deal->item->id != $this->_olddeal->item->id

これにより通知が表示される場合がありますが、意図したとおりに機能するため、通知を無視します。

if ($_GET['foo']) ...

問題は、これを無視できないことです。これはまだ通知をスローし、これを使用するたびに次のように書く必要があるためです。

if (isset($_GET['foo']) && $_GET['foo']) ...

また:

if (@$_GET['foo']) ...
4

2 に答える 2

3

たとえば、あなたのコードを見ると

$this->_oldattributes['category_id']

私の最初の考えは、これはおそらく代わりにクラスであるべきだということでした。

class Attributes {
  public $categoryId;
  // and so on
}

現在の違いはisset()、プロパティが存在するか (おそらくnull)、または明らかにバグ (「未定義のプロパティ」) であり、修正する必要があるため、もう使用する必要がないことです。で「修正」したあなたのケースのほとんどはisset()、この種のものだと思います。

于 2012-04-09T17:44:46.937 に答える
1

コードをデバッグするとき、定義すべき変数が定義されていないときに、未定義の変数メッセージが表示されると便利です。他の言語が PHP よりも厳密であることがわかっている限り、使用前に変数を定義することをお勧めします。

于 2013-12-21T21:47:50.367 に答える