1. 程式人生 > >8:self、parent、單例模式

8:self、parent、單例模式

self和parent的用法

self:本類,自身
parent:父類

使用場景:

  • 首先請明確區分類和物件;
  • 在使用本類/父類的,靜態屬性、方法時,會用到;
  • self 在本類中使用,用於引用自身的靜態屬性和方法;
  • parent 在子類中使用,用於引用父類的靜態屬性和方法(包括普通的方法,但是私有的不可被訪問);

用法:

  • self::$staticProperty;
  • self::staticMethods();
  • parent::$staticProperty;
  • parent::Methods();

使用規範:

  • 在本類中就用self
  • 在子類中就用parent
  • 如果是子類繼承過來的屬性或者方法,最好是使用 t h i s ,
    使 p a r e n t , p a r e n t this,除非有特殊需要,指名道姓的要用父類的時候,可以使用parent,理論上說,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屬性是類例項,則返回這個物件;