0

我花了 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

4 回答 4

1

这是因为PHP的诡计......

在幕后,PHP 实际上是在创建一个名为 的对象tihs,将一个数组添加到该对象arr并设置keyvalue

这是print_r($tihs);分配后的:

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

)
于 2012-09-05T04:06:41.957 回答
1

通常,如果错误报告级别设置为E_ALL | E_STRICT(或E_ALL从 PHP 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,就像 sberry 在他的回答中提到的那样。

于 2012-09-05T04:28:55.827 回答
0

你似乎拼错$oClass$oCless

于 2012-09-05T04:01:45.693 回答
0

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

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

于 2012-09-05T04:08:56.943 回答