0

PHP プログラムのデバッグのタイプミスを見つけるのに 10 時間以上を費やしました。未定義の変数を使用すると、PHP がエラーを生成することを期待していました。ただし、メソッドでオブジェクトとして使用される場合はそうではありません。それには理由がありますか?

<?php

    $oClass = new MyClass;
    // $oCless->tihs('key', 'taht');    //<-- triggers the error: Notice: Undefined variable
    $oClass->tihs('key', 'taht');
    echo $oClass->arr['key'];

    class MyClass {
        public $arr = array('key' => 'foo');

        function tihs($key, $value) {
            $tihs->arr[$key] = $value;  //<-- this does not cause an error message.
        }
    }
?>
4

4 に答える 4

1

それはPHPの策略によるものです...

内部では、PHP は実際に というオブジェクトを作成し、 というオブジェクトtihsに配列を追加して にarr設定keyしていvalueます。

print_r($tihs);割り当て後は次のとおりです。

stdClass Object
(
    [arr] => Array
        (
            [key] => taht
        )

)
于 2012-09-05T04:06:41.957 に答える
1

通常、エラー報告レベルがE_ALL | E_STRICT(またはE_ALLPHP 5.4.0 以降) に設定されている場合、E_STRICT エラーが出力されます。たとえば、次のコード:

error_reporting(E_ALL | E_STRICT);
$tihs->adrr = 453;  

プロデュース:

Strict Standards: Creating default object from empty value in [...]

興味深いことに、存在しないオブジェクトのプロパティとして、通常の変数の代わりに配列を具体的に作成すると、次のようになります。

error_reporting(E_ALL | E_STRICT);
$tihs->adrr[25] = 453;  

厳密な基準エラーは表示されません! これが文書化されていることを認識しておらず、この動作に正当な理由があるとは思わないため、これは PHP 関係者が修正したいと考えている可能性があるようです。

記録のために、どちらの場合も、エラーに関係なく、新しいstdClassがその場で作成されています

于 2012-09-05T04:28:55.827 に答える
0

$oClass の代わりに $oCless を使用すると、未定義の変数エラーが発生します。

また、「this」はほとんどの言語のキーワードであり、php にも含まれている場合があります。他言語でクセが出ないように、使うのは控えたほうがいいです。「this」を関数名や変数名として使用すると、さらに多くのエラーが発生します。コンパイルするものさえ得られません。

于 2012-09-05T04:08:56.943 に答える
0

次のようにスペルを間違えた$oClassようです$oCless

于 2012-09-05T04:01:45.693 に答える