- 相關(guān)推薦
PHP中如何定義類(lèi)及其成員屬性與操作
類(lèi)是具有相同屬性和操作的一組對(duì)象的集合。它為屬于該類(lèi)的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和操作兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z(yǔ)言中,類(lèi)是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類(lèi)名并包括屬性說(shuō)明和操作說(shuō)明兩個(gè)主要部分。下面是小編為大家?guī)?lái)的PHP中如何定義類(lèi)及其成員屬性與操作的知識(shí),歡迎閱讀。
1、類(lèi)的定義:
i. 類(lèi)的關(guān)鍵字定義使用class
1.定義一個(gè)空類(lèi)
Class Person{};
2.定義一個(gè)有成員屬性和操作的類(lèi)
Class Person{
成員屬性........
操 作........
}
3.定義一個(gè)不能被繼承的類(lèi),使用final關(guān)鍵字
Final class Person{
成員屬性........
操 作........
}
4.注意:final關(guān)鍵字不能用來(lái)修飾成員屬性 ,只能修飾類(lèi)和方法(final方法后面介紹)
5.這里舉一個(gè)帶有final的class
定義一個(gè)final的類(lèi)FinalClass,包含一個(gè)公共函數(shù)
final class FinalClass {
public function ffun() {
echo “本類(lèi)為final類(lèi)”;
}
}
定義一個(gè)類(lèi)ChildFinalClass 并繼承FinalClass 類(lèi)
class ChildFinalClass extends FinalClass {
public function fchildfun() {
echo ‘本類(lèi)繼承final類(lèi)FinalClass ’;
}
}
這樣當(dāng)執(zhí)行以上命令的時(shí)候系統(tǒng)會(huì)提示
Fatal error: Class ChildFinalClass may not inherit from final class (FinalClass)
證明由final關(guān)鍵字定義的class是不可以被子類(lèi)繼承的
2、類(lèi)中成員屬性的定義
i. 成員屬性就是對(duì)該類(lèi)定義的一些變量屬性,那人作為一個(gè)類(lèi)來(lái)說(shuō),人都有一對(duì)眼睛(正常的啊,二郎神除外),一張嘴,兩個(gè)耳朵,等這樣的一些固定的用來(lái)描述或表現(xiàn)某種事物的專(zhuān)有名詞稱(chēng)為成員屬性
ii. 類(lèi)中成員屬性的聲明使用的關(guān)鍵字
iii. 常見(jiàn)成員屬性聲明是由關(guān)以下鍵字
public,var,protected,private開(kāi)頭的,然后跟一個(gè)變量來(lái)組成的。還有一些成員屬性包括,靜態(tài)static,常量const.
Public: 表示全局的,類(lèi)內(nèi)部外部子類(lèi)都可以訪(fǎng)問(wèn)
Var: php 5 版本中會(huì)認(rèn)為這個(gè)成員屬性為public類(lèi)型的屬性
protected 表示受保護(hù)的,只有本類(lèi)或子類(lèi)或父類(lèi)中可以訪(fǎng)問(wèn)
private
表示私有的,只有本類(lèi)內(nèi)部可以使用
Static: 1)靜態(tài)的屬性,
2)用static修飾的成員屬性可以被同一個(gè)類(lèi)的所有對(duì)象共享
3) 靜態(tài)的數(shù)據(jù)是在類(lèi)第一次被加載的時(shí)候就存在了內(nèi)存中的數(shù)據(jù)段中(初始化靜態(tài)段)
4)類(lèi)中使用self::成員屬性名
5)類(lèi)外 類(lèi)名::成員屬性名
Const: 1)類(lèi)中常量屬性,在類(lèi)中聲明常量必須使用const
2)類(lèi)中使用 self::成員屬性名
3)類(lèi)外使用 類(lèi)名::成員屬性名
注意:屬性中的變量可以初始化,但是初始化的值必須是常數(shù),這里的常數(shù)是指php腳本在編譯階段時(shí)就為常數(shù),而不是在編譯階段之后在運(yùn)行階段運(yùn)算出的常數(shù)。例如,不能包含任何運(yùn)算符,不能是任何變量,不能是一個(gè)函數(shù)等。
iv. 成員屬性的調(diào)用方式:
在類(lèi)的成員方法里面,可以通過(guò) $this->property(property是屬性名字)這種方式來(lái)訪(fǎng)問(wèn)類(lèi)的屬性、 方法,但是要訪(fǎng)問(wèn)類(lèi)的靜態(tài)屬性或者在靜態(tài)方法里面卻不能使用,而是使用 self::$property。 在類(lèi)的非靜態(tài)方法里面可以使用偽變量 $this,這個(gè)偽變量是調(diào)用該方法的實(shí)例化對(duì)象引用。
接下來(lái)用代碼對(duì)上面的內(nèi)容做一下解釋?zhuān)?/p>
class FinalClass {
//static $a = strTolower();
//這種寫(xiě)法錯(cuò)誤
//const A = 1+2; //這種寫(xiě)法錯(cuò)誤
//public $name = 123+456;
//這種寫(xiě)法錯(cuò)誤
static $a = '$a';
const A = 'A';
public $name = '鳳姐';
protected $sex = '男+女';
private $age = 23;
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo 'ChildFinalClass類(lèi)中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>";
Echo 'ChildFinalClass類(lèi)中ChildFinalClass::A->'.ChildFinalClass::A."<hr>";
echo '大家好,我叫'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
//由于age是私有的成員屬性,所以在這里將不會(huì)被調(diào)用,將提示沒(méi)有定義此屬性在ChildFinalClass類(lèi)中。
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();
3、類(lèi)中操作的定義
i. 我本人一般喜歡叫操作為成員方法,以下我會(huì)叫操作為方法其實(shí)都是一樣的
ii. 成員方法的定義:成員方法就是對(duì)該類(lèi)定義的一些函數(shù)方法,比如拿這個(gè)類(lèi)來(lái)例句例子,人能吃飯,能跑步,能敲代碼,這就是成員方法。也就是可以做一些可執(zhí)行性的動(dòng)作我們理解為成員方法
iii. 成員方法的訪(fǎng)問(wèn)和成員屬性一樣可以參照上面成員屬性的訪(fǎng)問(wèn)介紹。
iv. 成員方法和成員屬性一樣也包括public,protected,private,static,final并且作用域也是一樣的,接下來(lái)舉一些例子供大家參考和理解。
v. 靜態(tài)的成員方法只能訪(fǎng)問(wèn)靜態(tài)的成員屬性和成員方法,并且類(lèi)內(nèi)部訪(fǎng)問(wèn)靜態(tài)方法可以使用self::靜態(tài)方法(), 類(lèi)外部訪(fǎng)問(wèn)使用類(lèi)名::靜態(tài)方法()
1. 自定義方法:
class FinalClass {
static $a = '$a';
const A = 'A';
public $name = '鳳姐';
protected $sex = '男+女';
private $age = 23;
//定義一個(gè)公共方法
public function publickfun(){
echo 'FinalClass類(lèi)中self::$a->'.self::$a."<hr>";
echo "FinalClass類(lèi)中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
//定義一個(gè)受保護(hù)的方法
protected function protectedfun(){
echo 'FinalClass類(lèi)中self::$a->'.self::$a."<hr>";
echo "FinalClass類(lèi)中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
//定義一個(gè)私用方法
private function privatefun(){
echo 'FinalClass類(lèi)中self::$a->'.self::$a."<hr>";
echo "FinalClass類(lèi)中self::A->".self::A."<hr>";
echo '大家好,我叫:'.$this->name."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
}
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo 'ChildFinalClass類(lèi)中ChildFinalClass::$a->'.ChildFinalClass::$a."<hr>";
Echo 'ChildFinalClass類(lèi)中ChildFinalClass::A->'.ChildFinalClass::A."<hr>";
echo '我是:'.$this->sex.'生<hr>';
echo '我今年:'.$this->age.'<hr>';
//由于age是私有的成員屬性,可以理解為我不想讓別人知道我的年齡,所以在這里將不會(huì)被調(diào)用,將提示沒(méi)有定義此屬性在ChildFinalClass類(lèi)中。
$this->publickfun();
$this->protectedfun();
$this->privatefun();
//由于privatefun是私有的成員方法,所以在這里將不會(huì)被調(diào)用。
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();
2.魔術(shù)方法
i. 魔術(shù)方法必須被定義為公共的,所有其他魔術(shù)方法都必須如此
ii. 從PHP 5以后的版本,PHP中的類(lèi)就可以使用魔術(shù)方法了。其規(guī)定以?xún)蓚(gè)下劃線(xiàn)(__)開(kāi)頭的方法都保留為魔術(shù)方法,所以建議大家函數(shù)名最好不用__開(kāi)頭,除非是為了重載已有的魔術(shù)方法,接下來(lái)列出一些魔術(shù)方法,如果大家想詳細(xì)了解可以針對(duì)某一個(gè)進(jìn)行查詢(xún)了解,這里就不大篇幅的介紹了。
1、__construct() 構(gòu)造方法
__destruct()
析構(gòu)方法
2、__clone()
如果想復(fù)制一個(gè)對(duì)象則需要使用clone方法
3、__toString()
方法在將一個(gè)對(duì)象轉(zhuǎn)化成字符串時(shí)自動(dòng)調(diào)用,比如使用echo打印對(duì)象時(shí)
4、__sleep() 串行化的時(shí)候用
__wakeup 反串行化的時(shí)候調(diào)用
5、 __set_state()
當(dāng)調(diào)用var_export()時(shí),這個(gè)靜態(tài) 方法會(huì)被調(diào)用(自PHP 5.1.0起有效)
6、__invoke(PHP 5.3.0以上版本有效)
當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí),__invoke 方法會(huì)被自動(dòng)調(diào)用。
7、__callStatic(PHP 5.3.0以上版本有效) 是為了處理靜態(tài)方法調(diào)用
8、__get() 當(dāng)調(diào)用一個(gè)未定義的屬性時(shí),此方法會(huì)被觸發(fā),傳遞的參數(shù)是被訪(fǎng)問(wèn)的屬性名。
__set() 給一個(gè)未定義的屬性賦值時(shí),此方法會(huì)被觸發(fā),傳遞的參數(shù)是被設(shè)置的屬性名和值。 這里的沒(méi)有聲明包括當(dāng)使用對(duì)象調(diào)用時(shí),訪(fǎng)問(wèn)控制為proteced,private的屬性(即沒(méi)有權(quán)限訪(fǎng)問(wèn)的屬性)。
9、__isset() 當(dāng)在一個(gè)未定義的屬性上調(diào)用isset()函數(shù)時(shí)調(diào)用此方法
__unset() 當(dāng)在一個(gè)未定義的屬性上調(diào)用unset()函數(shù)時(shí)調(diào)用此方法
10、__call( $method, $arg_array )
當(dāng)調(diào)用一個(gè)未定義的方法是調(diào)用此方法
這里的未定義的方法包括沒(méi)有權(quán)限訪(fǎng)問(wèn)的方法;如果方法不存在就去父類(lèi)中找這個(gè)方法,如果父類(lèi)中也不存在就去調(diào)用本類(lèi)的__call()方?法,如果本類(lèi)中不存在__call()方法就去找父類(lèi)中的__call()方法。
11、__autoload() 自動(dòng)加載魔術(shù)方法
【PHP中如何定義類(lèi)及其成員屬性與操作】相關(guān)文章:
PHP中FTP操作類(lèi)代碼09-25
php中數(shù)組的定義方法08-12
PHP中的Reload操作06-26
PHP操如何操作mysql09-19
PHP操如何操作mysql詳解05-12
php中目錄文件操作詳談09-20
PHP中MySql操作是什么07-24