PHP中self和this的用法區別

2021-08-11 05:10:07 字數 2297 閱讀 6922

php支援類和物件導向結構,php的類的靜態函式和變數不與任何特定類的例項相關聯(換句話說,乙個物件)。

相反,靜態函式和變數與類定義本身相關聯。換言之,乙個類的所有例項都共享相同的靜態變數。在乙個類的方法(函式)的上下文中,靜態變數和函式被訪問使用self::,在乙個類的物件(例項)的上下文中使用其他方法和變數時用this

比較表

self

this

能在靜態函式裡使用是否

可訪問的類變數和方法由

self::

$this-> (注意:php > 5.3 允許由 $this 使用靜態變數,用 $this::$foo。 $this->foo 將仍然沒有被定義,如果 $foo 是乙個靜態變數.)

需要乙個例項物件否是

php中self和this的例項

class exampleclass

public static function staticfunction()

public static function anotherstatfn()

public function regularfnusingstaticvar()

// 注: 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

}class bar extends foo

}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";

?>

靜態方法示例

PHP中self 和 this 的用法

在訪問php類中的成員變數或方法時,1.類外部呼叫 如果被引用的變數或者方法被宣告成const 定義常量 或者static 宣告靜態 那麼就必須使用操作符 反之如果被引用的變數或者方法沒有被宣告成const或者static,那麼就必須使用操作符 2.類內部呼叫 如果從類的內部訪問const或者sta...

PHP中self和this的用法區別

php支援類和物件導向結構,php的類的靜態函式和變數不與任何特定類的例項相關聯 換句話說,乙個物件 請看 類與物件的區別 相反,靜態函式和變數與類定義本身相關聯。換言之,乙個類的所有例項都共享相同的靜態變數。在乙個類的方法 函式 的上下文中,靜態變數和函式被訪問使用self 在乙個類的物件 例項 ...

php中static和self的區別

在閱讀一些框架的原始碼時發現了new static 和new self 甚是不解,後來查閱資料,才知道static採用了延遲繫結,能準確知道是父類還是子類的呼叫。這就是說static是個聰明的小孩,家裡的親戚的輩分他都能準確的叫出 而不是像他的兄弟self,只知道自己的親爹媽。例子如下 class ...