PHP中的类方法中使用的未定义变量没有错误

I spent more than 10 hours to find out the typo for debugging my PHP program. I expected PHP would produce an error when using an undefined variable. But when it is used as an object in a method, it doesn't. Is there a reason for it?

<?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.
        }
    }
?>

Normally if the error reporting level is set to E_ALL | E_STRICT (or E_ALL as of PHP 5.4.0) it should spit out an E_STRICT error. For instance, this code:

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

Produces:

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

Interestingly enough, if you specifically create an array instead of an ordinary variable as a property of an object that doesn't exist, e.g.:

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

No strict standards error is shown! It looks like this could potentially be something PHP folks might want to fix, because I'm not aware this is documented nor I think there's a legitimate reason for this behaviour.

For the record, in both cases regardless of the error a new stdClass is being created on the fly instead, like sberry mentions in his answer.

You seemed to have misspelt $oClass as $oCless

It is because of PHP trickery...

Under the covers, PHP is actually creating an object called tihs, adding an array to the object called arr and setting key to value.

Here is a print_r($tihs); after the assignment:

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

)

Agreed, $oCless instead of $oClass would give you an undefined variable error.

Also, "this" is a keyword in most languages and may be in php as well. You should refrain from using it so that it doesn't come out in other languages as a habit. You'll get way more errors if you're using "this" as function and variable names. You wouldn't even get things to compile.