標籤:物件導向 php 靜態成員 靜態方法
Php物件導向—靜態成員
靜態屬性
使用static關鍵字聲明的屬性
該靜態屬性,在邏輯上,是定義在類上面的屬性。保證一個類,對應一個屬性。
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
}
}
訪問靜態屬性:
通過類來訪問:在利用靜態訪問符號(::)
類::成員
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
Student::$stu_count ++;
}
}
::的訪問稱之為靜態訪問,->為非靜態訪問(對象訪問)
在訪問靜態屬性時,如果是在類內訪問:則可以使用self當前類
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
self::$stu_count ++;
}
}
注意:$this 和 self 的區別
$this 表示的是這個對象,self表示這個類
靜態方法
靜態方法的邏輯意義,也是定義再類上的方法。同樣,調用形式類::
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
self::$stu_count ++;
}
public static function sayCount()
{
echo “run static ”;
}
}
Student::sayCount();
靜態方法和非靜態方法,的主要區別,在於是否可以接收一個對象的執行環境。
就是是否可以為方法內的$this是否可以被賦值
只有在對象調用方法時,才能將對象執行環境傳遞到方法內,$this才可以被賦值。
靜態方法中無法使用非靜態屬性。
一個靜態方法,只能處理待用資料(靜態屬性)
例子:
class Student
{
public $stu_id;
public $stu_name;
public static $stu_count = 0;
public function __constuct($id,$name)
{
$this->stu_id = $id;
$this->stu_name = $name;
self::$stu_count ++;
}
public static function sayCount()
{
echo self::$stu_count;
}
}
Student::sayCount();
Php中特殊的方法訪問問題:
強調:靜態方法應該類來調用,非靜態方法應該對象來調用
class C
{
public function f1()
{
echo‘f1<br>’;
}
public static function f2()
{
echo‘f2<br>’;
}
}
$o = new C;
$o->f1();
C::f2();
但是:
1. 無論靜態還是非靜態方法,都可使用類訪問:不過如果類靜態調用一個非靜態方法,會報告一個文法不標準的錯誤。
2. 區別就在於$this上
只有再使用對象調用非靜態方法時,才可以使用方法內的$this.
class C
{
public function f1()
{
echo‘f1<br>’;
}
public static function f2()
{
echo‘f2<br>’;
}
}
C::f1();
C::f2();
總結:類的靜態方法和非靜態方法,類都只儲存一份,只是運行時的運行環境不同。只有再使用對象調用非靜態方法時,才可以使用方法內的$this.