關於php存取控制的介紹

2020-07-16 10:06:08
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存取控制的介紹的詳細內容,更多請關注TW511.COM其它相關文章!