【问题标题】:No Error for Undefined Variable Used in Class Methods in PHPPHP 类方法中使用的未定义变量没有错误
【发布时间】:2012-09-05 03:57:19
【问题描述】:

为了调试我的 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.
        }
    }
?>

【问题讨论】:

  • “this”的拼写非常混乱
  • 有一个名为'this'的函数也很混乱
  • PHP 中未定义的值不是错误。如果您启用了正确级别的 display_errors/error_reporting,它们只会发出警告。
  • 确保您的错误报告包括通知,并设置自定义错误处理程序,在报告任何错误后中止所有处理,无论是通知、警告还是真正的错误。然后准备修复大量会突然开始抛出通知的代码。

标签: syntax syntax-error php


【解决方案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】:

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

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

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

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

)

【讨论】:

    【解决方案3】:

    您似乎将$oClass 拼错为$oCless

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多