【问题标题】:No error or warning when attempt to access property of non object (not assigned)尝试访问非对象(未分配)的属性时没有错误或警告
【发布时间】:2011-04-16 11:01:40
【问题描述】:

谁能解释一下为什么 PHP 在访问空对象的属性时不报告警告或错误(未分配 var)?

例如:

$oMyObject->test = 'hello world'; // $oMyObject is not assigned but no warning or error

当我这样做时,它会产生一个错误:

$oMyObject->test(); // Error: Calling function on non-object

版本信息:

Windows XP
XAMPP Windows Version 1.7.0
Apache/2.2.11 (Win32) 
PHP 5.2.8
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans

为什么?尝试设置 error_reporting( E_ALL ) 但仍然没有错误或警告。

【问题讨论】:

    标签: php object error-handling var


    【解决方案1】:

    $oMyObject->text = 'hello world';是一个完全有效的声明,前提是文本被声明为公共的而不是私有的或受保护的。至于$oMyObject->text(),您需要提供更多信息。你得到什么样的错误?函数 text() 是公共的、私有的还是受保护的?你能发布这个函数的作用吗?

    【讨论】:

    • 我知道这是一个有效的声明,但事实并非如此。 $oMyObject->test() 只是一个例子。 PHP 报告关于空 var 的错误,它是一个非对象。那没问题。 t 函数做什么并不重要,因为没有运行时信息,因为 var 为空。它与公共、私有等无关。它是关于 var 是空的,它没有被分配!在第一种情况下 ($oMyObject->test = 'Hello World') 我看不到任何警告或错误。这很奇怪。
    • 对不起,第一次没有得到你。似乎 php 允许动态实例属性。
    • 但这是一个错误还是它是什么?有人吗?
    • 实际上,像 JavaScript 和 Python 这样的一些语言确实允许您在不定义类的情况下动态创建匿名对象/函数。似乎 PHP 也允许这样做。你也可以通过这样做来创建你的 test() 函数。 $obj->test = function(){ echo '这是一个测试';}; $test = $obj->测试; $测试;
    • 我明白但是.... var $oMyObject 是空的/未分配!那么为什么我没有看到任何错误?在 javascript 中,当您尝试在未定义的情况下访问它时会出现错误。在javascript中尝试一下,你会看到。为什么php只在要调用函数时才报错?
    【解决方案2】:

    PHP 中的这种行为非常容易出错! 谁真的认为这是个好主意?

    $rs = $db->Execute("SELECT 1");
    while(!$r->EOF) {
       // runs forever
       $rs->MoveNext();
    }
    

    没有立即检测到错字($r 而不是$rs),因为它没有错误。

    YIPPIE!

    在我看来,这是非/空对象成员访问是完整的 FUBAR。 在这种情况下,每一种健全的语言(PHP 不是)都会给你一个大错误(例如异常、空指针异常、总线错误、分段错误等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多