【问题标题】:Using $this when not in object context不在对象上下文中时使用 $this
【发布时间】:2011-11-09 05:26:00
【问题描述】:

也许是凌晨,或者我完全失明,但为什么在下面的代码中出现“致命错误:不在对象上下文中使用 $this”。里面没有静态的东西。

班级:

<?php

class Property
{

    /**
     * @var string[]
     */
    private $values;

    public function __contruct($file)
    {
        $this->values = parse_ini_file($file, false);
    }

    /**
     * @return string
     */
    public function get($key, $default = null)
    {
        if (key_exists($key, $this->values)) { //<-- error
            return $this->values[$key];
        }
        return $default;
    }
}

测试:

<?php

class PropertyTest extends Test
{

    public function testGet()
    {
        $prop = new Property($this->getResource('test.properties'));
        $this->assertEquals('foo', $prop->get('test.entry', 'xyz')); 
        $this->assertEquals('bar', $prop->get('test.entry2', 'xyz'));
        $this->assertEquals('xyz', $prop->get('test.entry3', 'xyz'));
        $this->assertEquals(null, $prop->get('test.entry3'));
    }
}

编辑

指示跟踪的错误cmets。在第一个 $prop->get() 上运行 PropertyTest->testGet() 时出现错误,由 Property->get() 方法的第一行引起。

解决方案

除了 xdazz 发现的错字和 Phil 指出的弃用之外,user985935 是对的。 :)

简而言之,我的类加载器使用了静态 get,而 phpUnit 错误误导了我的调查以及我提供给您的用于查找问题的信息。对不起。

【问题讨论】:

  • 不应该是array_key_exists()吗?
  • 只是测试,似乎key_exists() 是一个有效的函数,至少在5.3.6 中是这样。此外,无法复制此错误
  • 完整的错误信息是什么意思,包括文件和行引用?
  • @Phil 为了向后兼容,可以使用以下不推荐使用的别名:key_exists()
  • 我在行引用中添加了解释。这很奇怪,因为构造函数正在工作,而 $prop->get() 绝对不是静态的。

标签: php


【解决方案1】:

您的代码中有错字。

public function __contruct($file)

应该是

public function __construct($file)

【讨论】:

  • 谢谢。我目前正在工作,无法重新测试它,但这似乎很可能会导致问题。所以真的是一大早;)
【解决方案2】:

'致命错误:不在对象上下文中使用 $this'

$this 关键字指向对象内部的方法,但您不能在对象外部使用 $this 我认为这是导致您的问题的原因

【讨论】:

  • 这是错误:'Fatal error: Using $this when not in object context' 那么你将如何分析返回的错误呢?
  • @BoltClock 如果您要分析错误并且不仅仅基于用户在此处发布的代码,这是我们可能无法直接看到发布的问题的想法,但它可能发生在应用程序的其他地方我已经遇到过同样的问题,我已经进行了几次开发,并且我已经多次遇到此错误。 ;)
  • @daGrevis 这只是我们应该如何分析事物的问题。呵呵。 ;)
猜你喜欢
  • 2015-02-12
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多