2016-07-24 68 views
2

比方說,我們有一類這樣的:如何在動態分配成員時設置成員的可見性?

class X { 
    public static function create ($a, $b) { 
     $x = new X(); 
     $x->$a = $b; 
     return $x; 
    } 
} 

create()動態分配的成員。然而,這個成員是公開的:

>>> X::create("name", "Robert") 
=> X {#93 
    +"name": "Robert", 
    } 
>>> $x->name 
=> "Robert" 

有沒有辦法讓這個成員有保護或私人知名度?

(在我的使用情況下,成員後來被指定爲在上述情況下,所以,頂部將不利於宣告protected $some_var;

+1

您不能。解釋你爲什麼想要(即你在做什麼,而不是你如何試圖解決問題)可能會指向一個不同的解決方案。 – AD7six

回答

1

號沒有辦法。在這裏看到相關的問題:Is there any way to set a private/protected static property using reflection classes?

唯一可能的是另一種方式 - 公開私人成員。

我不明白你想實現,因爲這完全是不好的做法是什麼,但你可以使用數組去:

<?php 

class Foo 
{ 

    private $data; 

    function __get($name) 
    { 
     if (isset($this->data[$name])) { 
      return $this->data[$name]; 
     } 

     return null; 
    } 

    function __set($name, $value) 
    { 
     $this->data[$name] = $value; 
    } 

} 

$foo = new Foo(); 
$foo->var = 123; 
var_dump($foo->var); 
var_dump($foo); 

將輸出,如:

int(123) 
object(Foo)#1 (1) { 
["data":"Foo":private]=> 
    array(1) { 
     ["var"]=> 
    int(123) 
    } 
} 

所以您可以動態地爲該類添加屬性。然後將「屬性」值存儲在數組中,該數組本身是私有的。如果不存在(或私有)屬性是從外部訪問的,則調用魔術函數__get和__set。然後他們處理值的檢索和設置。

請參閱php.net上的文檔:http://php.net/manual/en/language.oop5.magic.php