php oop私有方法引用

时间:2011-04-05 11:40:47

标签: php oop

我有一个名为“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()就像它属于控制器一样,我得到一个“致命错误:调用未定义的方法.....”

如何调用它以便在同一个类中查找它?

5 个答案:

答案 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();