3

我已经很好地阅读了有关重载的 PHP 规范,并且大多数示例似乎旨在简单地允许定义自定义字段(类似于 stdClass)。

但是我的类中定义的私有字段呢?应该如何检索/分配这些?我可以对可能的值进行切换并对某些值采取行动:

class A
{
    private $name;
    private $age;

    public function __get( $var )
    {
        switch ( $var )
        {
            case 'name':
                return $this->name;
                break;
            case 'age':
                return $this->age+10; // just to do something different ;)
                break;
            default:
                break;
        }
    }
}

这是最好的方法,还是有另一种普遍接受的最佳做法?(我不知道是否可以在类中循环类变量,但无论如何这在大多数情况下都不合适,因为您不想返回所有内容。)

4

3 回答 3

11

我广泛使用__get()and__set()我已经声明了我的属性public。我想要两全其美,所以当我键入类实例的名称时,我的 IDE 可以为我列出公共属性。即使属性是公共的并且在类外可见,我是如何让 PHP 拦截器方法工作的?

unset()我想要__get()__set()在类中使用的属性__construct()

弄清楚这种方法花了几个晚上的挫败感:-)

于 2009-07-26T22:54:11.960 回答
2

这将有效地使它们公开,并且通常这比简单地使用公共属性没有任何好处(但是您会付出性能损失并且必须编写更多代码,冒着错误的风险)。

仅当您有使用公共属性的现有代码并且您突然需要 getter/setter 时才使用它(例如您的示例age)。

如果您需要在读取/写入属性时执行一些代码(例如,使其只读或从数据库中延迟获取),那么您应该使用普通的 getter/setter ( getAge()/ setAge())。

于 2009-07-25T02:05:37.990 回答
1

我没有看到很多人使用它们,但这是我的想法。

为了检索私有变量,您可能希望提供一个能够被外部访问的已定义变量的列表。然后,检查请求的变量是否在该数组中。如果是,请允许更改/获取它。如果不是,则错误或返回 null。

老实说,对此的实现确实是逐案的。如果您有一个将所有信息存储在单个数组中的用户类,则可以从 $user->account['name'] 或类似的东西中提取 $user->name。

此外,在更具体的情况下,您可以在给它们值之前进行一些修改,例如散列密码。

于 2009-07-25T01:50:02.613 回答