PHP静态函数


108

我对php中的静态功能有疑问。

假设我有一堂课

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

如果我这样做,test::sayHi();那就没问题了。

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

test::sayHi(); 也可以。

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

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


15
从php7开始,您不能静态调用非静态方法
sanjay yadav

Answers:


153

在第一类中,sayHi()实际上是一个实例方法,您将其作为静态方法进行调用,但由于sayHi()从未引用,所以您将其取消$this

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


22
现在可以对非静态方法进行静态调用,但已弃用。对于实例方法,请谨慎使用此语法!
喷射机

1
那么这就是为什么他们称其为静态功能?因为没有动态数据流和动态输出的多个实例。只是指导我。@ chaos
2014年

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'明确覆盖了?这意味着该行打印test1 :: sayHi('hello'); 不会返回“ hello”,而是会返回“ hi”?
Fnord23

6
这个答案很草率(静态函数的效果可能取决于它们所在的类),并且这些示例并不清楚。
reinierpost '16

这不是一个很好的例子。$ hi ='嗨'; 覆盖给定的参数,与静态声明无关。我会这样解决:self :: $ hi = $ hi; 它会像非静态的一样工作。您可以使用self ::代替$ this->访问类变量
GotBatteries

20

完全不同的是,您没有$this在静态函数内获得任何信息。如果您尝试使用$this,将会得到一个Fatal error: Using $this when not in object context

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


1
我第一次使用并且在php7中时没有任何警告
ashkan nasirzadeh

为什么我们在静态函数中没有$ this?这是什么架构逻辑?谢谢。
卢卡斯·布斯塔曼特

@LucasBustamante:$this引用当前对象。在静态函数中,没有当前对象。该函数存在于类中,而无需或引用该类的对象实例。
混乱

3

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


2

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


1
静态只是您定义类函数的方式吗?没有其他幻想的生意吗?因此,您要说的是,如果它被称为“ class_method”而不是“ static”,它将更具语义吗?
ahnbizcad 2015年

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.