PHP对象已损坏,$这是未定义的

PHP对象已损坏,$这是未定义的,php,Php,守则: 您的测试代码没有问题。它在PHP5.3.3上运行没有问题。当您将“真实”代码转换为测试代码并在此处发布时,您可能已经失去了问题的原因。代码似乎按原样工作,但我从未见过没有参数的对象实例化 $test = new My_Test; // Should be $test = new My_Test(); 您还可以实现一些日志记录: public function test() { // Can edit this to use instanceof or getclass fo

守则:


您的测试代码没有问题。它在PHP5.3.3上运行没有问题。当您将“真实”代码转换为测试代码并在此处发布时,您可能已经失去了问题的原因。

代码似乎按原样工作,但我从未见过没有参数的对象实例化

$test = new My_Test;

// Should be

$test = new My_Test();
您还可以实现一些日志记录:

public function test()
{
    // Can edit this to use instanceof or getclass for further testing
    if (!is_object($this)) {
        error_log(serialize($this));
    }

    return $this->exists;
}

正如人们之前所说,代码看起来很好,不应该导致任何错误

因此,我猜这与php引擎本身的一个错误有关:

你是如何安装PHP的

  • 你自己编译源代码了吗?是否在执行时配置或记录任何警告或错误消息
  • 您是否使用软件包管理器安装了PHP?(我想一切都会好起来的)
您是如何配置PHP的

  • 您是否对php.ini进行过任何更改,如更改内存限制、路径等
  • 您是否安装了任何可能导致问题的扩展?根据我的经验,操作码缓存(如APC)通常会导致无法轻松解释的错误。调试器或其他扩展也可能会造成干扰
您的HTTP守护程序日志中是否有任何(其他)错误消息

  • 有时,如果服务器配置为执行此操作(例如,脚本意外终止或类似操作),则会在error.log文件中发现其他错误

这很奇怪,对我来说很好除了通知之外还有其他错误吗?您在标题中提到$this未定义,这是您收到的错误吗?-我认为这是一个非常简单的代码段,因为代码是从CLI接口工作的。我唯一能想到的是在不调用构造函数的情况下实例化该类。不是这样,这是我正在使用的代码,这会产生错误。我知道这段代码是有效的,问题的关键(我将尝试重新表述)是为什么我的两个环境使用这段有效代码失败?@user1098407:考虑到粘贴的错误和调用堆栈转储点与粘贴的代码不匹配,我发现这不太可能。我去掉了一行:echo phpversion()。PHP_EOL;它在第3行,并没有引起错误。。相信我,我知道代码不应该出错,但事实确实如此。代码在其他框上也可以工作,只是这两个框不行。@awoods:您的原始调用堆栈引用了第16行(
。/test.php:16
,您现在将其编辑为读取14),而您只粘贴了13行代码。除非您的
phpversion()
调用出于某种原因占用了3行,否则您也会忽略其他代码。如果您需要真正的帮助,请粘贴您正在测试的实际代码。否则,没有人能帮到你。这就是代码,我追踪到了一个分段错误,但这就是代码。。我不敢相信我甚至不得不证明这一点。荒谬。事实上,这是(正确的)PHP代码风格。即使没有大括号也可以实例化对象,请参见@GeneSys:correct是什么意思?在深入研究链接生成的几个链接后,所有示例都显示了parens。在以下方面正确:使用默认构造函数(或没有参数的用户定义构造函数)实例化对象,而不在类名后指定parantesis,在语义和词汇上都是正确的。上的第一个代码示例在第10行显示:
$bar=newfoo
@GeneSys:我跟进纯粹是为了学习。你告诉我的意思是我和几个同事没有遵循实例化对象的“正确”语法。当然,这基本上是一种偏好,但如果这是行业标准,不考虑父母(如果没有args),那么很高兴知道这一点。我在第10行看到了这个例子,你在其他链接上看到其他10多个例子了吗?在实例化对象时,如果在类名后面加上parantise,你也遵循了正确的语法。这里“正确”的只是编码指南告诉您要做的事情:例如,Kohana Framework说:在创建类的实例时,如果您没有将某些内容传递给构造函数(),请不要使用括号。如果您的编码指南告诉您在它之后放上妄想症,那也没关系;)感谢GeneSys,这是php的一个问题,它在一个完全不同的应用程序中是seg故障,但是每当错误的脚本运行时,它就会设法阻止通过apache运行的任何其他php,直到apache重新启动。
public function test()
{
    // Can edit this to use instanceof or getclass for further testing
    if (!is_object($this)) {
        error_log(serialize($this));
    }

    return $this->exists;
}