【发布时间】: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