我对php中的静态函数有疑问。
让我们假设我有一个班级
class test {
public function sayHi() {
echo 'hi';
}
}
如果我test::sayHi();
它可以毫无问题地工作。
class test {
public static function sayHi() {
echo 'hi';
}
}
test::sayHi();
也适用。
头等舱和第二等舱有什么区别?
静态函数有什么特别之处?
答案 0 :(得分:144)
在第一个类中,sayHi()
实际上是一个实例方法,您将其作为静态方法调用,因为sayHi()
从不引用$this
,所以您可以使用它。
静态函数与类关联,而不是类的实例。因此,$this
在静态上下文中不可用($this
未指向任何对象。)
答案 1 :(得分:22)
简单地说,静态函数的功能独立于它们所属的类。
$这意味着,这是这个类的一个对象。它不适用于静态函数。
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'
答案 2 :(得分:20)
完全不同的是,你没有在静态函数中提供$this
。如果您尝试使用$this
,则会获得Fatal error: Using $this when not in object context
。
嗯,好吧,还有一个区别:你的第一个例子会产生E_STRICT
警告。
答案 3 :(得分:3)
静态调用非静态方法会生成E_STRICT级警告。
答案 4 :(得分:2)
简而言之,在第二种情况下,你没有像$ this这样的对象 static方法是类的函数/方法而不是对象实例。
答案 5 :(得分:1)
在尝试了示例(PHP 5.3.5)后,我发现在定义函数的两种情况下,都不能使用$this
运算符来处理类函数。所以我找不到他们的差别。 :(