再探面向對象補充

面向對象擴展

面向對象:一直把對象放在心上,實質上就是把生活中的要解決的問題都用對象的方式進行存儲,對象之間是可以互動的
對象的組成:屬性與方法
對象的特點:獨一無二的特定事物,可以重複使用
面向對象基本思路:識別對象,識別對象的屬性,識別對象的行爲
面向對象的基本原則:對內是高內聚,對外是低耦合
面向對象的目的達到代碼的重用性 靈活性 擴展性
類常量是屬於類的
類 接口 函數 常量都會受命名空間影響
命名空間分爲局部空間和全局空間
use關鍵字不僅能引用類,也可以引用常量和函數,use const,use function
如果在局部空間的文件裏調用全局空間的類,需要在類名前面帶上反斜槓,而如果調用函數或者常量,則不用,因爲php會嘗試在指定域名空間下尋找函數或者常量,如果找不到就會去全局空間下尋找
類的自動加載function __autoload(){}以及spl_autoload_register{}支持匿名函數和數組方式
static關鍵字定義的屬性和方法是屬於類的,所以在靜態方法中不要使用$this(屬於對象),調用的時候不需要實例化,調用屬性的時候不要忘記帶$符號,方法不需要帶
self,parent代表類的本身,而不是對象
後期靜態綁定static::會根據上下文決定靜態方法到底屬於哪個類,而slef,__CLASS__表示定義時的類
trait是可以嵌套的
接口是類的模板,類是對象的模板,接口是可以被繼承的,一個類可以實現多個接口,用逗號分割

屬性重載

在給不可訪問屬性賦值時,__set() 會被調用。
讀取不可訪問屬性的值時,__get() 會被調用。
當對不可訪問屬性調用 isset() 或 empty() 時,__isset() 會被調用。
當對不可訪問屬性調用 unset() 時,__unset() 會被調用

方法重載

在對象中調用一個不可訪問方法時,__call() 會被調用
在靜態上下文中調用一個不可訪問方法時,__callStatic() 會被調用
__toString() 方法用於一個類被當成字符串時應怎樣迴應
當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用
serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在,該方法會先被調用,然後才執行序列化操作
unserialize() 會檢查是否存在一個 __wakeup() 方法。如果存在,則會先調用 __wakeup 方法,預先準備對象需要的資源,__wakeup() 經常用在反序列化操作中,例如重新建立數據庫連接,或執行其它初始化操作

對象複製

淺拷貝:變量之間地址傳遞,節省內存
深拷貝:變量之間值傳遞
對象的賦值默認淺拷貝,怎讓做才能深拷貝?使用clone關鍵字
只要是對象賦值就是淺拷貝,所以,儘管該對象使用clone關鍵字,如果該對象的屬性也是對象的話,該屬性仍然是淺拷貝

class A {
    public $name = '';
    public $age = 0;
    public $obj = null;

    public function __clone()
    {
    	//深拷貝
        $this->obj = clone $this->obj;
    }
}
class B {
    public $summary = 100;
}
$a = new A;
$a->obj = new B;
$b = clone $a;
$b->obj->summary = 10;
var_dump($a->obj->summary);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章