PHP支持類和面向對象結構,PHP的類的靜態函數和變量不與任何特定類的實例相關聯(換句話說,一個對象)。請看:類與對象的區別。
相反,靜態函數和變量與類定義本身相關聯。換言之,一個類的所有實例都共享相同的靜態變量。在一個類的方法(函數)的上下文中,靜態變量和函數被訪問使用self::,在一個類的對象(實例)的上下文中使用其他方法和變量時用this。
比較表
self | this | |
---|---|---|
能在靜態函數里使用 | 是 | 否 |
可訪問的類變量和方法由 | self:: | $this-> (注意:PHP > 5.3 允許由 $this 使用靜態變量,用 $this::$foo。 $this->foo 將仍然沒有被定義,如果 $foo 是一個靜態變量.) |
需要一個實例對象 | 否 | 是 |
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! */
靜態函數只能使用靜態變量,靜態函數和變量的引用是通過 self::函數名() 和 self::變量名。上述實例中,靜態變量的引用是由類名(exampleClass::$foo),或者 self:: (self::$foo),當在這個類的靜態方法[稱為 靜態函數()]里使用時。類的正則函數和變量需要一個對象上下文來引用,他們不能脫離對象上下文而存在。對象上下文由 $this 提供。在上述函數中,$bar 是一個正則變量,所以它被 $obj->bar(上下文使用變量obj) 來引用,或者使用 $this->bar(再次在一個對象的方法里在一個對象上下文中) 來引用。
self 不使用前面的 $,因為 self 不意味着是一個變量而是類結構本身。而 $this 引用一個特定的變量,所以有前面的 $ 。
參考:靜態關鍵詞
聲明類屬性或方法為靜態,就可以不實例化類而直接訪問。靜態屬性不能通過一個類已實例化的對象來訪問(但靜態方法可以)。
為了兼容 PHP 4,如果沒有指定訪問控制,屬性和方法默認為公有。
由於靜態方法不需要通過對象即可調用,所以偽變量 $this 在靜態方法中不可用。
靜態屬性不可以由對象通過 -> 操作符來訪問。
用靜態方式調用一個非靜態方法會導致一個 E_STRICT 級別的錯誤。
就像其它所有的 PHP 靜態變量一樣,靜態屬性只能被初始化為文字或常量,不能使用表達式。所以可以把靜態屬性初始化為整數或數組,但不能初始化為另一個變量或函數返回值,也不能指向一個對象。
自 PHP 5.3.0 起,可以用一個變量來動態調用類。但該變量的值不能為關鍵字 self,parent 或 static。
靜態關鍵詞實例
- <?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>靜態方法示例</title>
- <programlisting role="php">
- <![CDATA[
- <?php
- class Foo {
- public static function aStaticMethod() {
- // ...
- }
- }
- Foo::aStaticMethod();
- $classname = 'Foo';
- $classname::aStaticMethod(); // 自 PHP 5.3.0 起
- ?>