PHP静态函数
我有一个关于在PHP静态function的问题。
让我们假设我有一个class级
class test { public function sayHi() { echo 'hi'; } }
如果我test::sayHi();
它工作没有问题。
class test { public static function sayHi() { echo 'hi'; } }
test::sayHi();
也适用。
第一课和第二课有什么区别?
静态函数有什么特别之处?
在第一个类中, sayHi()
实际上是一个你正在调用的实例方法,因为sayHi()
永远不会引用$this
。
静态函数与类关联,而不是类的实例。 因此, $this
是不可用的静态上下文( $this
不是指向任何对象)。
完全不同的是,你没有得到$this
静态函数中提供的$this
。 如果你尝试使用$this
,你会得到一个Fatal error: Using $this when not in object context
。
好吧,还有一个区别:你的第一个例子会产生一个E_STRICT
警告。
简单地说,静态函数独立于它所属的类别而运行。
$这意味着,这是这个类的一个对象。 它不适用于静态函数。
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'
因为没有创build对象的实例就可以调用静态方法,所以伪variables$ this在声明为静态的方法内不可用。
无法使用箭头运算符 – >通过对象访问静态属性。
调用非静态方法会静态生成E_STRICT级别的警告。
像任何其他PHP静态variables一样,静态属性只能使用文字或常量初始化; expression式是不允许的。 所以虽然你可以初始化一个静态属性为一个整数或数组(例如),但不能将它初始化为其他variables,函数返回值或对象。
从PHP 5.3.0开始,可以使用variables来引用类。 variables的值不能是关键字(例如self,parent和static)。 PHP.NET
调用非静态方法会静态生成E_STRICT级别的警告。
简而言之,在第二种情况下,您没有将对象作为$ this,因为静态方法是类的函数/方法而不是对象实例。
在尝试使用示例(PHP 5.3.5)之后,我发现在定义函数的两种情况下,您都不能使用$this
运算符来处理类函数。 所以我还没有find它们的区别。 🙁