我有一个名为“query”的控制器类 另一个名为“language”的类用于检测浏览器中的语言并将其验证为可用的语言之一。 我的代码看起来像这样:
在控制器中:
Language::detect();
在“语言”课程中:
public function detect()
{
$this->_verify(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2));
}
private function _verify($input)
{
$languages=array
(
'English' => 'en',
'German' => 'de',
);
if (in_array($input,$languages))
{
echo $input;
}
}
问题是,似乎调用方法_verify()就像它属于控制器一样,我得到一个“致命错误:调用未定义的方法.....”
如何调用它以便在同一个类中查找它?
答案 0 :(得分:6)
问题在于,您正在混合静态调用:
Language::detect();
使用非静态方法:
public function detect()
即,您的detect()
方法不是static
- 但您将其称为static
。
结果是$this
方法中的detect()
并不存在 - 因为它是对当前对象的引用 - 它本身不存在,因为方法是静静地叫。
因此,PHP正在考虑$this
指向调用该方法的类...结果是$this
指向您的控制器; _verify()
为private
,无法从该控制器调用;这解释了致命错误。
你应该下定决心:
static
方法static
。答案 1 :(得分:2)
Yout在没有初始化对象的情况下调用方法,在这种情况下没有特殊变量$this
,因为$this
引用了本地对象,但是除非你执行:{{1 }};
您应该做的是使用new Language()
运算符来规定您访问类的方法,而不是对象:
::
请注意以下行已更改:
public static function detect()
{
self::_verify(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2));
}
private static function _verify($input)
{
$languages=array
(
'English' => 'en',
'German' => 'de',
);
if (in_array($input,$languages))
{
echo $input;
}
}
private static function _verify($input)
public static function detect()
第一个指定方法是静态的并且应该静态访问,最后一行是说我想静态地和本地地访问这个方法。
答案 2 :(得分:1)
如果您使用的是“Language :: detect”,则不能在课堂上使用“$ this”,但必须使用“self ::”
答案 3 :(得分:1)
您的detect
方法不是静态的,但您将其称为静态方法。因此,您无法在此方法中使用$this
。
答案 4 :(得分:0)
您需要一个对象语言或静态标识符,以便您可以调用对象的函数而不实际使用它。
如果你想要非静态方法,你应该做类似的事情:
Language $test = new Language();
$test->detect();