PHP 静态函数

110

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

假设我有一个类

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

如果我执行test::sayHi();,它可以正常工作。

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

test::sayHi();同样有效。

一等和二等有什么区别?

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


18
从PHP7开始,您不能以静态方式调用非静态方法。 - sanjay yadav
6个回答

157
在第一个类中,sayHi() 实际上是一个实例方法,你将其作为静态方法调用,并且可以通过这种方式成功调用 sayHi(),因为它从未引用过 $this
静态函数与类相关联,而不是类的实例。因此,在静态上下文中无法使用 $this$this 没有指向任何对象) 。

23
现在静态调用非静态方法可以正常工作,但已被弃用。使用这种语法来调用实例方法时要小心! - Jet
1
所以他们为什么称其为静态函数?因为它没有多个实例,也没有动态数据流和动态输出。请指导我。@chaos - sun

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'

9
我不是 PHP 的专家,但传递给静态函数的变量 ('hello') 显然被覆盖成了 'Hi',这意味着打印语句 print test1::sayHi('hello'); 不会返回 'hello',而是会返回 'hi'。请问需要翻译哪些内容? - Fnord23
7
这个答案比较粗糙(静态函数的效果可能取决于它们所在的类),而且例子没有很清楚地说明问题。 - reinierpost
不是很好的例子。$hi = 'Hi'; 会覆盖给定的参数,并且与静态声明无关。我会像这样修复它:self::$hi = $hi;,它将像非静态方法一样工作。您可以使用self::访问类变量,而不是使用$this->。 - GotBatteries

20

唯一不同的是,在静态函数中不会提供$this。如果您尝试使用$this,将会得到一个Fatal error:Using $this when not in object context

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


1
我在使用PHP7时,当我使用“first”时没有任何警告。 - TechDogLover OR kiaNasirzadeh
为什么静态函数内部没有$this?这背后的架构逻辑是什么?谢谢。 - Lucas Bustamante
1
@LucasBustamante:$this 指的是当前对象。在静态函数中,没有当前对象;该函数存在于类上,无需或引用该类的对象实例。 - chaos

4
静态调用非静态方法会触发 E_STRICT 级别的警告。

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


1
静态方法只是用来定义类函数的吗?没有其他花哨的东西?所以你的意思是,如果它被称为"class_method"而不是"static",那么它会更语义化? - ahnbizcad

1

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


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