110

我有一个关于 php 中的静态函数的问题。

假设我有一堂课

class test {
    public function sayHi() {
        echo 'hi';
    }
}

如果我这样做test::sayHi();,它可以正常工作。

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi();也可以。

头等舱和二等舱有什么区别?

静态函数有什么特别之处?

4

6 回答 6

157

在第一个类中,sayHi()实际上是一个实例方法,您将其作为静态方法调用,并且您可以摆脱它,因为sayHi()从不引用$this.

静态函数与类相关联,而不是与类的实例相关联。因此,$this在静态上下文中不可用($this不指向任何对象)。

于 2009-05-24T02:20:02.807 回答
22

简单地说,静态函数的功能独立于它们所属的类。

$this 意味着,这是这个类的一个对象。它不适用于静态函数。

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'
于 2013-08-27T15:36:06.177 回答
20

完全不同的是,您不会$this在静态函数内部获得供应。如果你尝试使用$this,你会得到一个Fatal error: Using $this when not in object context.

好吧,还有另一个区别:E_STRICT您的第一个示例会生成警告。

于 2009-05-24T02:15:02.830 回答
4

静态调用非静态方法会生成 E_STRICT 级别的警告。

于 2014-09-02T18:40:32.567 回答
2

简而言之,在第二种情况下,您没有 $this 对象,因为静态方法是类的函数/方法,而不是对象实例。

于 2009-05-24T02:17:28.380 回答
1

在尝试了示例(PHP 5.3.5)之后,我发现在定义函数的两种情况下,您都不能使用$this运算符来处理类函数。所以我还找不到它们的区别。:(

于 2011-12-30T07:52:02.610 回答