$this
只有在類產生實例之后才會存在,我們只是設置一個屬性,此時不存在 $this
,下圖會產生語法錯誤。
image.png
image.png
image.png
記得這種情況不要使用[0],[1] 這種寫法,全都用常量代替,還有獲取一個 pubblic static 屬性不需要 new一個實例,app(classA) 這個方式 == new classA
修改如下:
image.png
關于類屬性、方法調用有3個
$this、self、static
$this->foo();
selff::foo();
static::foo();
-
$this
指向當前對象,用來訪問當前對象的非靜態變量和非靜態方法。
<?php
class Person {
public $name;
public function getName() {
echo $this->name;
}
}
$p = new Person();
$p2 = new Person();
$p->name = "小紅";
$p2->name = "小明";
$p->getName(); // 小紅
$p2->getName(); // 小明
上面 new 了兩個對象,并分別設置對象的 name 屬性,getName() 中使用了 this 訪問當前對象的 name 屬性,所以分別輸出了 name 的值。所以說,this 就是指向當前對象,不指向其他對象或類。
- self::指向類,一般用來訪問當前類的靜態變量和靜態方法,運行之前已經確定指向哪個類。
<?php
class Person {
public static $name = "小紅";
public static function getName() {
echo self::$name;
}
}
$p = new Person();
$p2 = new Person();
$p::getName(); // 小紅
$p2::getName(); // 小紅
$p::$name = "小明";
$p::getName(); // 小明
$p2::getName(); // 小明
self 和 this 不同,它指向類本身,不指向任何實例化對象,一般用來訪問類中的靜態變量和靜態方法;
上例中 new 了兩個對象,并修改了其中一個對象的 name 屬性,另一個對象的 name 屬性值也改變了,所以說,self 是指向當前類的,和對象無關,所有的對象共用一個值。
- static指向類,一般用來訪問當前類的靜態變量和靜態方法,但是又不限于靜態的調用,運行時才確定指向哪個類。
static 和 self 一樣,都是指向類,一般都用來訪問類中的靜態變量和靜態方法,但是又有一些不一樣,具體來講:self 寫在哪個類里,實際調用的就是這個類;static 則是寫在父類里,然后通過子類用到了這個 static,這個 static 指向的是這個子類,官方稱之為 后期靜態綁定 。
<?php
class A {
public function say() {
echo "Hello";
}
public function saySelf() {
self::say();
}
public function sayStatic() {
static::say();
}
}
class B extends A {
public function say() {
echo "World";
}
}
$b = new B();
$b->say(); // World
$b->saySelf(); // Hello
$b->sayStatic(); // World
上例中可以看到,self 寫在 A 類里,調用時就指向了 A 類,static 同樣寫在 A 類里,但是用 A 類的子類 B 類的對象去調用時,卻指向了 B 類,在使用時,static 才確定指向哪個類,這就是 后期靜態綁定 。