|
|
|
|
|
PHP支持類和面向?qū)ο蠼Y(jié)構(gòu),PHP的類的靜態(tài)函數(shù)和變量不與任何特定類的實例相關(guān)聯(lián)(換句話說,一個對象)。請看:類與對象的區(qū)別。
相反,靜態(tài)函數(shù)和變量與類定義本身相關(guān)聯(lián)。換言之,一個類的所有實例都共享相同的靜態(tài)變量。在一個類的方法(函數(shù))的上下文中,靜態(tài)變量和函數(shù)被訪問使用self::,在一個類的對象(實例)的上下文中使用其他方法和變量時用this。
比較表
self | this | |
---|---|---|
能在靜態(tài)函數(shù)里使用 | 是 | 否 |
可訪問的類變量和方法由 | self:: | $this-> (注意:PHP > 5.3 允許由 $this 使用靜態(tài)變量,用 $this::$foo。 $this->foo 將仍然沒有被定義,如果 $foo 是一個靜態(tài)變量.) |
需要一個實例對象 | 否 | 是 |
PHP中self和this的實例
class exampleClass
{
public static $foo;
public $bar;
public function regularFunction() { echo $this->bar; }
public static function staticFunction() { echo self::$foo; }
public static function anotherStatFn() { self::staticFunction(); }
public function regularFnUsingStaticVar() { echo self::$foo; }
// 注: PHP 5.3 使用 $this::$bar 代替 self::$bar 是允許的
}
exampleClass::$foo = "Hello";
$obj = new exampleClass();
$obj->bar = "World!";
exampleClass::staticFunction(); /* 打印 Hello */
$obj->regularFunction(); /* 打印 World! */
靜態(tài)函數(shù)只能使用靜態(tài)變量,靜態(tài)函數(shù)和變量的引用是通過 self::函數(shù)名() 和 self::變量名。上述實例中,靜態(tài)變量的引用是由類名(exampleClass::$foo),或者 self:: (self::$foo),當(dāng)在這個類的靜態(tài)方法[稱為 靜態(tài)函數(shù)()]里使用時。類的正則函數(shù)和變量需要一個對象上下文來引用,他們不能脫離對象上下文而存在。對象上下文由 $this 提供。在上述函數(shù)中,$bar 是一個正則變量,所以它被 $obj->bar(上下文使用變量obj) 來引用,或者使用 $this->bar(再次在一個對象的方法里在一個對象上下文中) 來引用。
self 不使用前面的 $,因為 self 不意味著是一個變量而是類結(jié)構(gòu)本身。而 $this 引用一個特定的變量,所以有前面的 $ 。
參考:靜態(tài)關(guān)鍵詞
聲明類屬性或方法為靜態(tài),就可以不實例化類而直接訪問。靜態(tài)屬性不能通過一個類已實例化的對象來訪問(但靜態(tài)方法可以)。
為了兼容 PHP 4,如果沒有指定訪問控制,屬性和方法默認為公有。
由于靜態(tài)方法不需要通過對象即可調(diào)用,所以偽變量 $this 在靜態(tài)方法中不可用。
靜態(tài)屬性不可以由對象通過 -> 操作符來訪問。
用靜態(tài)方式調(diào)用一個非靜態(tài)方法會導(dǎo)致一個 E_STRICT 級別的錯誤。
就像其它所有的 PHP 靜態(tài)變量一樣,靜態(tài)屬性只能被初始化為文字或常量,不能使用表達式。所以可以把靜態(tài)屬性初始化為整數(shù)或數(shù)組,但不能初始化為另一個變量或函數(shù)返回值,也不能指向一個對象。
自 PHP 5.3.0 起,可以用一個變量來動態(tài)調(diào)用類。但該變量的值不能為關(guān)鍵字 self,parent 或 static。
靜態(tài)關(guān)鍵詞實例
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Undefined "Property" my_static
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
</programlisting>
</example>
<example>
<title>靜態(tài)方法示例</title>
<programlisting role="php">
<![CDATA[
<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // 自 PHP 5.3.0 起
?>