我花了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.
}
}
?>
答案 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”作为函数和变量名,你将会遇到更多错误。你甚至不会编译东西。