非静态方法不应该以静态方式调用

75

我最近升级了PHP 5.4,但是出现了关于静态和非静态代码的错误。

这是错误信息:

PHP Strict Standards:  Non-static method VTimer::get() 
should not be called statically in /home/jaco/public_html/include/function_smarty.php on line 371

这是第371行:

$timer  = VTimer::get($options['magic']);

我希望有人可以帮忙。

4个回答

141

这意味着它应该像这样被调用:

$timer = (new VTimer) -> get($options['magic']);

静态方法非静态方法的区别在于前者不需要实例化,因此您可以调用classname然后附加::并立即调用该方法。 像这样:

ClassName::method();

如果该方法不是静态的,则需要这样初始化:

$var = new ClassName();
$var->method();

然而,在PHP版本>=5.4中,你可以使用以下的语法作为一种简写:

(new ClassName)->method();

3
或许他应该将这个方法改为静态的(因为这是一个现有的代码库,现在正在升级的PHP环境中运行)。 - webbiedave
@mamdouh 你太棒了,错误已经消失。 感谢你的帮助。 祝你晚上愉快。此致敬礼,Jaco - Novice Hobby PHP Boy
@user2938848 - 不用谢。我希望你把这个答案标记为已接受,因为它对你有用 :) - mamdouh alramadan
你指的“更快速的调用:(new ClassName)->method();"是缩写的意思吗? - Piyush Balapure
我相信这是意图而非语法。 - blackmambo

23

你也可以像这样将方法更改为静态:

class Handler {
    public static function helloWorld() {
        echo "Hello world!";
    }
}

8
最优雅的方式是:
(new ClassName)->method();

你也可以将你的函数转换为 static function call() {},但这取决于你的函数以及你对它的使用。
如果需要实例化一个类,则避免这样做,将静态函数视为常量,它们不能有对象,并且需要预定义变量。

3
public function functionName($variable)

更改为

public static function functionName($variable)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接