php存取控制的介紹
1.屬性的存取控制
php中,類別的屬性必須被定義為公有( public),受保護(protected),私有(private)三個中的一個。 PHP4中可以用var關鍵字定義屬性,預設未公有。被定義為公有的類別成員可以在任何地方被存取。被定義為受保護的類別成員則可以被其本身以及其子類別和父類別存取。被定義為私有的類別成員則只能被其定義所在的類別存取。
對var關鍵字有興趣的可以看一下http://stackoverflow.com/ques...
class Foo() { $name = "hello world" # 这么写是错误的。属性必须定义访问控制 }
2. 方法的存取控制
同樣,類別中的方法也可以被定義為公有(public),受保護(protected),私有(private)三個中的一個。但如果是公有,方法前的關鍵字public可以不寫。即不寫關鍵次,預設為公有。
例如:
class Bar() { function hello() # 此时该方法默认为公有 { print("hello"); } }
那麼如果把類別中的建構子私有話了會發生什麼事?例如:
class Demo() { private function __construct() { print("I'm a private construct function"); } }
很顯然,我們就不能直接用new Demo()來建立實例了,因為建立實例的時候會在外部呼叫__construct()方法。怎麼辦?我們或許可以在類別裡寫一個靜態方法來取得實例物件。這樣就就是在本類別中呼叫__construct()方法,也不用在外部實例化,簡直完美!
class Demo() { private function __construct() { print("I'm a private construct function"); } public static function getInstance() { return new Demo();#这是Demo类内部,可以用new Demo()实例化调用私有的__construct()方法 } } #在类外面,我们就可以这么玩了 Demo::getInstance();
但是話又說回來,我們先把__construct私有化,又千方百計用靜態方法取得到實例。這是折騰什麼鬼?
其實在設計模式中會經常使用這樣的方法來控制物件的創建,例如單例模式只允許有一個全域唯一的物件。
如果我們需要在全域中只有一個唯一的對象,上面的程式碼還不夠。因為只要有人呼叫了兩次getInstance(),那麼就產生了兩個了。所以我們再把上面的程式碼改一下
class Demo() { private function __construct() { print("I'm a private construct function"); } # 先定义一个空成员装对象 public $_object = null; public static function getInstance() { if(empty(self::$_object)) { # 如果没有创建过,那么就new一个 return new Demo(); } #否则(即以及创建过),我们只要放回已经存在的那个即可 return $_object } }
以上是關於php存取控制的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!