范圍解析操作符 (::)
理解
類外使用
靜態(tài)成員
$obj::$member1;
//訪問實(shí)例中的靜態(tài)變量ClassName::member3_visit2();
//訪問ClassName類中的靜態(tài)方法
普通成員
echo $obj->member1;
//訪問實(shí)例中的變量$obj->member2();
//訪問實(shí)例中的方法
常量
- echo $obj::member1;//訪問實(shí)例中的常量
類內(nèi)使用
靜態(tài)成員
self::$member2;
//訪問類中靜態(tài)變量ClassName::$member2;
//訪問類中靜態(tài)變量(不建議使用)self::member2;
//訪問類中靜態(tài)方法
普通成員
echo $this->member2;
//訪問類中的變量echo $this->member3();
//方法中訪問其他方法
常量
- echo self::member2;//方法中訪問常量
訪問大綱
訪問又分為靜態(tài)成員的訪問和普通成員訪問
1:靜態(tài)成員
- 類內(nèi)訪問
self::$靜態(tài)屬性名
self::$類常量名
(其實(shí)類內(nèi)頁可以使用類外訪問的類名的訪問方式,不過考慮到了后期類名的更改,self就很方便的解決了這個問題)
- 類外訪問
類名::$靜態(tài)屬性名
類名::$類常量名
2:普通成員
- 類內(nèi)訪問
$this->屬性名
$this->方法名
- 類外訪問
$對象名->屬性名
$對象名->方法名 ($對象名 指的是實(shí)例化后的對象)
實(shí)戰(zhàn)演示
一:靜態(tài)成員屬性的訪問
1: 靜態(tài)外部訪問
<?php
class ClassName {
//必須帶“$”,否則是常量
public static $member1 = '成員1';
}
$obj = new ClassName;
//注意這里的“::”
echo $obj::$member1;
?>
輸出:
成員1
2:靜態(tài)內(nèi)部訪問?(要知道,在類內(nèi)部訪問類成員必須定義一個方法來訪問)
<?php
class ClassName {
//必須帶“$”,否則是常量
public static $member2 = '成員2 <br />';
public function member2() {
echo self::$member2;
//下面這條效果與上條相同,但不推薦使用(考慮繼承中。類名會變的因素)
echo ClassName::$member2;
}
}
$obj = new ClassName;
//類內(nèi)訪問類中靜態(tài)成員
$obj->member2();
?>
輸出:
成員2
成員2
- 1:類內(nèi)訪問類內(nèi)成員首先要定義一個方法在方法內(nèi)訪問;
- 2:最開始介紹到:類內(nèi)其實(shí)可以使用類名的訪問方式(
echo ClassName::$member2;
),考慮到項目后期可能會有類名更改問題,類內(nèi)最好使用self來代替
(不過也正好證明了在類內(nèi)訪問其實(shí)就是使用類(名)進(jìn)行指定類內(nèi)的成員,講這個是因?yàn)椴煌谄胀ǔ蓡T中的類內(nèi)訪問方式--$this)
二:靜態(tài)成員方法的訪問
1:在類外訪問類內(nèi)靜態(tài)方法
<?php
class ClassName {
//靜態(tài)方法
public static function member3() {
echo __METHOD__;//打印當(dāng)前方法的方法名
}
}
//類外訪問類內(nèi)靜態(tài)方法
ClassName::member3();
?>
輸出:
ClassName::member3
在類外使用 類名::類中的方法名。 (__METHOD__指的是當(dāng)前方法的方法名)
2:在類內(nèi)訪問類內(nèi)靜態(tài)方法
<?php
class ClassName {
//靜態(tài)方法
public static function member3() {
echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
}
//方法訪問靜態(tài)方法
public function member3_visit1() {
self::member3();
}
//靜態(tài)方法訪問靜態(tài)方法
public static function member3_visit2() {
self::member3();
}
}
$obj = new ClassName;
$obj->member3_visit1();
ClassName::member3_visit2();
?>
輸出
ClassName::member3
ClassName::member3
- 類內(nèi)訪問靜態(tài)方法,同樣需要在方法內(nèi)訪問,
- 定義的方法可以使用普通方法進(jìn)行訪問,
- 也可以定義一個同樣是靜態(tài)方法的方法來訪問其他靜態(tài)方法。。
- (可能這句話有些繞,直接分析代碼就行)
三:普通成員的屬性訪問
1:在類外訪問
<?php
class ClassName {
public $member1 = '成員1 ';
}
$obj = new ClassName();
//注意這里,不是“$member1”
echo $obj->member1;
?>
輸出:
成員1
這里有個重點(diǎn),記得看后面
2:在類內(nèi)訪問
<?php
class ClassName {
public $member2 = '成員2 ';
function member2() {
echo $this->member2;
}
}
$obj = new ClassName();
$obj->member2();
?>
輸出:
成員2
你可能已經(jīng)發(fā)現(xiàn)了,為什么在最開始靜態(tài)訪問演示的時候,
function member2() {
echo $this->member2;
}
$obj->member2();
上面變量名都有$符號,而這里卻沒有。
要知道這里面php里面有個可變屬性和可變方法。下面來演示一下。

在外面如果不帶$,就是代表著取obj這個對象中進(jìn)行訪問查找 為此名字的成員。
一旦加上$,因?yàn)樵陬愅獠浚蜁划?dāng)做變量來找,所以就會報錯。當(dāng)然可以這樣寫 ?
<?php
class ClassName {
public $member1 = '成員1 ';
public $member2 = '成員2 ';
function member2() {
echo $this->member2;
}
}
$obj = new ClassName();
$member1 = 'member1';
echo $obj->$member1;
$obj->member2();
?>
輸出:
成員1 成員2
(其中一個值當(dāng)作另一個的名)當(dāng)obj進(jìn)行指向訪問的時候 $member就會被解析為 member
四:普通成員的方法訪問
1:類外訪問
<?php
class ClassName {
public $member2 = '成員2,<br /> ';
function member2() {
echo $this->member2;
}
public function member3() {
echo __METHOD__;//打印當(dāng)前方法的方法名
}
}
$obj = new ClassName();
$obj->member2();
$obj->member3();
?>
輸出
成員2,
ClassName::member3
2:類內(nèi)訪問
<?php
class ClassName {
public function member3() {
echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
}
public function member4() {
echo $this->member3();
//與上面一行代碼同樣的意思
$member3 = 'member3';
echo $this->$member3();
}
}
$obj = new ClassName();
$member4 = 'member4';
$obj->$member4();
?>
輸出:
ClassName::member3
ClassName::member3
再次直接寫了 可變的 形式,方法同樣適用。
思考(這樣的好處,以后比如前臺頁面的訪問可以都給定 一個頁面,頁面中定義好類,類中定義好各個對象,通過頁面點(diǎn)擊傳遞要制定的對象名也就是方法名,然后使用可變的形式,來隨時替換到變量,而調(diào)用只需要調(diào)用一次 $obj->變量名)
五:類常量的訪問
首先:類常量就是const定義的常量。
要記住:類常量只能用const來定義
1:類外訪問
<?php
class ClassName {
const member1='類常量1<br />';
}
$obj = new ClassName;
echo $obj::member1;
?>
輸出:
類常量1
2:類內(nèi)訪問
<?php
class ClassName {
const member2='類常量2<br />';
public function visit() {
echo self::member2;
}
}
$obj = new ClassName;
$obj->visit();
?>
輸出
類常量2
跟靜態(tài)方式其實(shí)一樣,但唯一的差別就是最前面中的 注釋,變量名在類內(nèi)聲明的時候沒有 $。
注意:(至于可變的形式,在常量中類內(nèi)或者類外訪問都不可以)
<?php
//以下代碼采用可變方法訪問常量,會報錯
class ClassName {
const member1='類常量1<br />';
}
$obj = new ClassName;
//可變方法
$member1 = 'member1';
echo $obj::$member1;
?>
不過在調(diào)用方法的時候可以使用可變的形式,畢竟跟常量也沒太大關(guān)系。
類與對象的內(nèi)存關(guān)系
我們上面都知道,靜態(tài)訪問和類常量都是使用 類名來訪問,而其他都是通過實(shí)例化的對象來訪問。
其實(shí):
在類內(nèi)部,是分空間的,靜態(tài)成員一般保存在類空間里,而像其他的 普通屬性都是保存在對象的空間里(這里的對象指的是實(shí)例化的對象)
而唯一特殊的就是 成員方法,它按我們的訪問方式是通過 對象來訪問的,但是它并不存儲在對象的空間里,相反存儲在了類的空間里。
我們來使用前面的代碼 證明一下:
<?php
class ClassName {
public $member1 = '成員1 ';
public $member2 = '成員2,<br /> ';
function member2() {
echo $this->member2;
}
//兩個成員方法的訪問
public function member3() {
echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
}
public function member4() {
$member3 = 'member3';
echo $this->member3();
}
}
$obj = new ClassName();
$obj->member1 = '成員5';
echo $obj->member1;
$member1 = 'member1';
echo $obj->$member1;
$obj->member2();
$obj->member3();
$member4 = 'member4';
$obj->$member4();
$obj1 = new ClassName;
echo $obj1->member1;
?>
輸出
成員5成員5成員2,
ClassName::member3
ClassName::member3
成員1
可以看出 新聲明的obj1?明顯沒有被前面的 obj 改變的成員5 而改變!
就算是這個特殊的成員方法雖然存在了類空間里,但是仍不會被改變。
這樣的原因就是因?yàn)榇鎯υ诹?實(shí)例化的對象的空間里,一個實(shí)例化中的改變不會影響其他實(shí)例化對象的改變
二
<?php
class ClassName {
//兩個靜態(tài)屬性
public static $member1 = '靜態(tài)成員1 <br /> ';
public static $member2 = '靜態(tài)成員2 <br /> ';
//兩個靜態(tài)方法
public static function member3() {
echo __METHOD__.'<br />';//打印當(dāng)前方法的方法名
}
public function member3_visit1() {
self::member3();
}
public static function member3_visit2() {
self::member3();
}
public function member2() {
echo ClassName::$member2;
}
}
$obj = new ClassName();
//類外訪問類中靜態(tài)屬性
ClassName::$member1 = '11131313';
echo ClassName::$member1;
//類內(nèi)訪問類中靜態(tài)屬性
$obj->member2();
//類外訪問類內(nèi)靜態(tài)方法
ClassName::member3();
$obj->member3_visit1();
ClassName::member3_visit2();
$obj1 = new ClassName;
echo ClassName::$member1;
?>
而在類空間中除了不能改變的,常量外的靜態(tài)成員,只要被改變,其他的實(shí)例化對象同樣就會被調(diào)用。如上所顯示。