2011-06-02 56 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

相关问题