首頁  >  文章  >  後端開發  >  如何定義PHP中的類別及其成員屬性

如何定義PHP中的類別及其成員屬性

怪我咯
怪我咯原創
2017-06-28 13:32:422771瀏覽

類別的概念:類別是具有相同屬性和操作的一組物件的集合。它為屬於該類別的所有物件提供了統一的抽象描述,其內部包括屬性和操作兩個主要部分。在物件導向程式語言中,類別是一個獨立的程式單位,它應該有一個類別名稱並包括屬性說明和操作說明兩個主要部分。

1、類別的定義:

i. 類別的關鍵字定義使用class

1.定義一個空類別

Class Person{};

2.定義一個有成員屬性和操作的類別

Class Person{
成员属性........
操    作........
}

3.定義一個不能被繼承的類,使用final關鍵字

Final class Person{
成员属性........
操    作........
}

4.注意:final關鍵字不能用來修飾成員屬性,只能修飾類別與方法(final方法後面介紹)

5.這裡舉一個帶有final的class

定義一個final的類別FinalClass,包含一個公共函數

final class FinalClass {
public function ffun() {
echo “本类为final类”;
}
}

定義一個類別ChildFinalClass 並繼承FinalClass 類別

class ChildFinalClass extends FinalClass {
public function fchildfun() {
echo ‘本类继承final类FinalClass ’;
}
}

這樣當執行以上指令的時候系統會提示

Fatal error: Class ChildFinalClass may not inherit from final class (FinalClass)

證明由final關鍵字定義的class是不可以被子類別繼承的

2、類別中成員屬性的定義

i. 成員屬性就是對該類別定義的一些變數屬性,那人作為一個類別來說,人都有一對眼睛(正常的啊,二郎神除外),一張嘴,兩個耳朵,等這樣的一些固定的用來描述或表現某種事物的專有名詞稱為成員屬性

ii. 類中成員屬性的聲明使用的關鍵字

iii. 常見成員屬性宣告是由關以下鍵字

public,var,protected,private開頭的,然後跟一個變數來組成的。還有一些成員屬性包括,靜態static,常數const.

Public: 表示全域的,類別內部外部子類別都可以存取

Var:     php 5 版本中會認為這個成員屬性為public型別的屬性

protected 表示受保護的,只有在本類別或子類別或父類別中可以存取

private     表示私有的,只有本類別內部可以使用

Static:    1)靜態的屬性,

2)用static修飾的成員屬性可以被同一個類別的所有物件共享

3) 靜態的數據是在類別第一次載入的時候就存在了記憶體中的資料段中(初始化靜態段)

4)類別中使用self::成員屬性名稱

                                 外 類別名稱::成員屬性名稱

Const:   1)類別中常數屬性,在類別中宣告常數必須使用const

                 

#                                         3中使用 類別時中使用 類別名稱::成員屬性名稱

注意:屬性中的變數可初始化,但是初始化的值必須為常數,這裡的常數是指php階段是指php階段時是指php階段時就為常數,而不是在編譯階段之後運行階段運算出的常數。例如,不能包含任何運算符,不能是任何變量,不能是一個函數等。

iv. 成員屬性的呼叫方式:

在類別的

成員方法裡面,可以透過$this->property(property是屬性名稱)這種方式來存取類別的屬性、 方法,但是要存取類別的靜態屬性或是在靜態方法裡面卻不能使用,而是使用self::$property。 在類別的非靜態方法裡面可以使用偽變數 $this,這個偽變數就是呼叫該方法的實例化物件參考。

接下來用程式碼對上面的內容做一下解釋:

class FinalClass {
//static $a = strTolower();   
//这种写法错误
//const  A = 1+2;              //这种写法错误
//public $name = 123+456;     
//这种写法错误
static $a = '$a';
const  A = 'A';
public $name = '凤姐';
protected $sex = '男+女';
private $age = 23;
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo &#39;ChildFinalClass类中ChildFinalClass::$a->&#39;.ChildFinalClass::$a."<hr>";
Echo &#39;ChildFinalClass类中ChildFinalClass::A->&#39;.ChildFinalClass::A."<hr>";
echo &#39;大家好,我叫&#39;.$this->name."<hr>";
echo &#39;我是:&#39;.$this->sex.&#39;生<hr>&#39;;
echo &#39;我今年:&#39;.$this->age.&#39;<hr>&#39;;   
//由于age是私有的成员属性,所以在这里将不会被调用,将提示没有定义此属性在ChildFinalClass类中。
 
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();

3、類別中操作的定義

i. 我自己一般喜歡叫操作作為成員方法,以下我會叫操作為方法其實都是一樣的

ii. 成員方法的定義:成員方法就是對該類別定義的一些函數方法,例如拿這個類別來例句例子,人能吃飯,能跑步,能敲程式碼,這就是成員方法。也就是可以做一些可執行性的動作我們理解為成員方法

iii. 成員方法的存取和成員屬性一樣可以參考上面成員屬性的存取介紹。

iv. 成員方法和成員屬性一樣也包括public,protected,private,static,final並且作用域也是一樣的,接下來舉一些例子供大家參考和理解。

v. 靜態的成員方法只能存取靜態的成員屬性和成員方法,且類別內部存取靜態方法可以使用self::靜態方法(),  類別外部存取使用類別名稱::靜態方法( )

1. 自訂方法:

class FinalClass {
static $a = &#39;$a&#39;;
const  A = &#39;A&#39;;
public $name = &#39;凤姐&#39;;
protected $sex = &#39;男+女&#39;;
private $age = 23;
 
    //定义一个公共方法
public function publickfun(){
echo &#39;FinalClass类中self::$a->&#39;.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo &#39;大家好,我叫:&#39;.$this->name."<hr>";
echo &#39;我是:&#39;.$this->sex.&#39;生<hr>&#39;;
echo &#39;我今年:&#39;.$this->age.&#39;<hr>&#39;;
}
 
//定义一个受保护的方法
protected function protectedfun(){
echo &#39;FinalClass类中self::$a->&#39;.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo &#39;大家好,我叫:&#39;.$this->name."<hr>";
echo &#39;我是:&#39;.$this->sex.&#39;生<hr>&#39;;
echo &#39;我今年:&#39;.$this->age.&#39;<hr>&#39;;
}
    //定义一个私用方法
private function privatefun(){
echo &#39;FinalClass类中self::$a->&#39;.self::$a."<hr>";
echo "FinalClass类中self::A->".self::A."<hr>";
echo &#39;大家好,我叫:&#39;.$this->name."<hr>";
echo &#39;我是:&#39;.$this->sex.&#39;生<hr>&#39;;
echo &#39;我今年:&#39;.$this->age.&#39;<hr>&#39;;
}
}
class ChildFinalClass extends FinalClass{
public function fchildfun(){
echo &#39;ChildFinalClass类中ChildFinalClass::$a->&#39;.ChildFinalClass::$a."<hr>";
 
Echo &#39;ChildFinalClass类中ChildFinalClass::A->&#39;.ChildFinalClass::A."<hr>";
 
echo &#39;我是:&#39;.$this->sex.&#39;生<hr>&#39;;
 
echo &#39;我今年:&#39;.$this->age.&#39;<hr>&#39;;   
//由于age是私有的成员属性,可以理解为我不想让别人知道我的年龄,所以在这里将不会被调用,将提示没有定义此属性在ChildFinalClass类中。
 
$this->publickfun();
 
$this->protectedfun();
 
$this->privatefun();            
//由于privatefun是私有的成员方法,所以在这里将不会被调用。
}
}
$obj = new ChildFinalClass();
$obj->fchildfun();

2.魔術方法

i. 魔術方法必須被定義為公共的,所有其他魔術方法都必須如此

ii. 從PHP 5以後的版本,PHP中的類別就可以使用魔術方法了。其規定以兩個底線()開頭的方法都保留為魔術方法,所以建議大家函數名最好不用開頭,除非是為了重載已有的魔術方法,接下來列出一些魔術方法,如果大家想詳細了解可以針對某一個查詢了解,這裡就不大篇幅的介紹了。

1、construct() 建構方法

destruct()

析構方法

2 、clone()

如果想複製一個物件則需要使用clone方法

3、toString()

#方法在將物件轉換成字串時自動調用,例如使用echo列印物件時

4、sleep()  串列化的時候用

wakeup 反串行化的時候呼叫

#5、set_state()

當呼叫var_export()時,這個靜態方法會被呼叫(自PHP 5.1.0起有效)

6、invoke(PHP 5.3.0以上版本有效)

當嘗試以呼叫函數的方式呼叫一個物件時,invoke 方法會被自動呼叫。

7、callStatic(PHP 5.3.0以上版本有效) 是為了處理靜態方法呼叫

8、get()  當呼叫一個未定義的屬性時,此方法會被觸發,傳遞的參數是被存取的屬性名。

set()  給予一個未定義的屬性賦值時,此方法會被觸發,傳遞的參數是被設定的屬性名稱和值。 這裡的沒有聲明包括當使用物件呼叫時,存取控制為proteced,private的屬性(即沒有權限存取的屬性)。

9、isset() 當在一個未定義的屬性上呼叫isset()函數時呼叫此方法

unset() 當在一個未定義的屬性上呼叫unset()函數時呼叫此方法

10、call( $method, $arg_array )

當呼叫未定義的方法是呼叫此方法

這裡的未定義的方法包括沒有權限存取的方法;如果方法不存在就去父類別中找這個方法,如果父類別中也不存在就去呼叫本類別的call()方法,如果本類別中不存在call()方法就去找父類別中的call()方法。

11、autoload() 自動載入魔術方法


以上是如何定義PHP中的類別及其成員屬性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn