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

时间:2012-09-05 03:57:20

标签: syntax syntax-error php

我花了10多个小时来找出调试我的PHP程序的错字。我预计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 个答案:

答案 0 :(得分:1)

这是因为PHP技巧......

在幕后,PHP实际上创建了一个名为tihs的对象,向名为arr的对象添加了一个数组,并将key设置为value

分配后的print_r($tihs);

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

)

答案 1 :(得分:1)

通常,如果错误报告级别设置为E_ALL | E_STRICT(或从PHP 5.4.0开始为E_ALL),则应该吐出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,就像在his answer中提到的sberry一样。

答案 2 :(得分:0)

您好像$oClass

拼错了$oCless

答案 3 :(得分:0)

同意,$ oCless而不是$ oClass会给你一个未定义的变量错误。

此外,“this”在大多数语言中都是关键字,也可能在php中。你应该避免使用它,以免它成为习惯的其他语言。如果你使用“this”作为函数和变量名,你将会遇到更多错误。你甚至不会编译东西。