2011-06-02 55 views
0

我想給受保護的屬性授予另一個類。我一直試圖想出一個聰明的方式來做到這一點。我想授予訪問受保護的屬性給另一個類

我有一類

abstract class Form_Abstract { 
    protected $formAttributes = array(); 
    protected $fields = array(); 
} 

與$域和$ formAttributes setter方法。爲了使它更加複雜,字段設置器方法創建一個單獨的Field類和它自己的受保護屬性,並將其添加到字段列表中。我想強制使用setter來管理進入這個類的數據。

但是,我希望能夠通過這個類到各種其他類,這將抓取數據並以不同的方式使用它。其他類將使用這些數據的方式非常不同,因此很難執行命令類型模式。

事情我已經考慮:

使用__get方法從類的外部訪問受保護的特性,從而使得基本上只讀類。然而,這要花費大約350%的時間來訪問這些變量。

有一個方法可以輸出多維數組中的所有類變量。雖然這似乎是隱藏類內部的最好方法,但對於每個腳本實例可能多次生成這些數組,似乎並不是非常有效。

做某種繼承技巧,允許訪問擴展特定基類或類的類。這似乎是一個很酷的選擇,但是以我想避免的方式創建依賴關係。它也需要特殊的方法來獲取變量。

我當然可以讓所有的公共屬性,但是這並不讓我來控制雲中的數據。

知道的任何意見或想法。

+0

試試看看這個問題:http://stackoverflow.com/questions/317835/php-equivalent-of-friend-or-internal – 2011-06-02 23:29:13

+0

@AdrianMar是的,這是類似的,我已經考慮過,但正如在原始帖子,__get非常慢。 – dqhendricks 2011-06-02 23:38:54

+0

對不起,閱讀時必須跳過那一行。那麼,除了按照下面的建議擴展主類外,我沒有看到其他直接的選擇。祝你好運! – 2011-06-02 23:41:20

回答

1

我可能失去了一些東西,但在我看來,所有你想要做的是延長Form_Abstract類...

abstract class Form_Abstract { 
    protected $formAttributes = array('apple', 'orange'); 
    protected $fields = array(); 
} 

class My_Form extends Form_Abstract 
{ 
    function __construct() { } 

    function displayFormAttribute($num) 
    { 
     return $this->formAttributes[$num]; 
    } 
} 

$x = new My_Form; 

echo $x->displayFormAttribute(0); // apple 
echo $x->displayFormAttribute(1); // orange 

擴展,您可以訪問所有的publicprotected變量,功能,但不是private的。

+0

是的,不完全是我在找什麼。會有一大堆擴展這個抽象類的類,我希望能夠通過其他幾個類運行它們中的任何一個,而不必將它們耦合起來。例如,請求驗證類不一定需要運行表單,但可以使用表單自動生成驗證。我不想在請求驗證器類中包含表單的所有大部分內容,以便它可以訪問其他表單中的可變參數。 – dqhendricks 2011-06-02 23:27:27

+0

我決定最好讓所有的東西都公開。感謝您的幫助! – dqhendricks 2011-06-03 21:39:33

相關問題