8:self、parent、單例模式
阿新 • • 發佈:2018-11-03
self和parent的用法
self:本類,自身
parent:父類
使用場景:
- 首先請明確區分類和物件;
- 在使用本類/父類的,靜態屬性、方法時,會用到;
- self 在本類中使用,用於引用自身的靜態屬性和方法;
- parent 在子類中使用,用於引用父類的靜態屬性和方法(包括普通的方法,但是私有的不可被訪問);
用法:
- self::$staticProperty;
- self::staticMethods();
- parent::$staticProperty;
- parent::Methods();
使用規範:
- 在本類中就用self
- 在子類中就用parent
- 如果是子類繼承過來的屬性或者方法,最好是使用 this更符合面向物件;
單例模式
單例模式就是一個類不能使用new
關鍵字進行例項化物件,通過呼叫類的靜態方法建立一個例項物件,並且只能建立一個;符合這個條件的,都是單例模式,單例單例,就是隻有一個例項。逢面必問!
- 示例:
//單例模式
class D{
final protected function __construct(){
echo '單例模式';
}
static $obj = null;
static public function init(){
if (self::$obj instanceof self) {
return self::$obj;
}
self::$obj = new self();
return self::$obj;
}
}
$a = D::init();
class C extends E{}//這一行報錯
instanceof
關鍵字是專門用來判斷某個例項物件是不是某個類的例項,是返回true,否則返回false;final
關鍵詞:如果類用final來修飾,則不能被繼承,如果是方法用final來修飾,則被繼承之後,只讀不可寫,不能被子類覆蓋重寫;- 如果類的建構函式可以被重寫,那麼單利模式的意義則不存在了;他依舊可以有很多個例項;
__clone()方法
- 在上面實現的單例模式中存在一個問題:當使用類的唯一例項物件進行克隆之後,得到了另一個一模一樣的物件,但在記憶體中並不指向同一個類,這樣就很不單例;
- 解決辦法:在類中使用
__clone
函式, - 示例:
class A {
public function __clone(){
return false;
}
}
$a = new A();
$b = clone $a;
- 在上述例子中,
$b
克隆了$a
物件,則,$b
的值為false
; - 也就是說
__clone
方法會在類的例項物件被被控時執行一個函式,你可以做一些操作,比如為當前例項物件增加一些新屬性,新方法等; - 那麼,上面單例模式中,類例項會被克隆的問題就解決了,在
__clone
方法中進行判斷,如果自身的$obj
屬性是類例項,則返回這個物件;