2009-05-24 163 views
88

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

让我们假设我有一个类

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

如果我做test::sayHi();它的工作原理没有问题。

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

test::sayHi();也适用。

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

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

+9

从php7开始,你不能静态调用非静态方法 – 2016-02-15 04:47:44

回答

134

在第一类中,sayHi()实际上是一种实例方法,您将其称为静态方法,因此您不会使用它,因为sayHi()从未指向$this

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

+19

现在,非静态方法的静态调用可以工作,但不建议使用。对于实例方法,请小心使用此语法! – Jet 2009-05-24 12:52:02

+1

所以这就是为什么他们说它是静态函数?因为不存在具有动态数据流和动态输出的多个实例。只是引导我@ chaos – sun 2014-02-25 13:50:26

19

整个区别在于,你不会得到$this里面的静态函数。如果您尝试使用$this,则会得到Fatal error: Using $this when not in object context

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

2

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

+1

只是静态的,你是如何定义类的功能的?没有其他花哨的生意?所以你说如果它被称为“class_method”而不是“static”,它会更加语义化吗? – ahnbizcad 2015-05-10 06:31:07

1

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

16

简单的,静态的功能独立运作,他们属于的类别。

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

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 'hello' 
3

由于静态方法在没有创建对象实例的情况下可调用,因此伪变量$ this在声明为静态的方法内不可用。

无法使用箭头运算符通过对象访问静态属性 - >。

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

像任何其他PHP静态变量一样,静态属性只能使用文字或常量初始化;表达式是不允许的。因此,虽然可以将静态属性初始化为整数或数组(例如),但不能将其初始化为其他变量,函数返回值或对象。

从PHP 5.3.0开始,可以使用变量来引用类。变量的值不能是关键字(例如self,parent和static)。 PHP.NET

3

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