如何在我的类中使用PHP的__get()和__set()来定义字段?

时间:2009-07-25 01:45:24

标签: php overloading setter getter

我已经很好地阅读了PHP specs on overloading,并且大多数示例似乎只是为了允许定义自定义字段(类似于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;
        }
    }
}

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

3 个答案:

答案 0 :(得分:9)

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

unset()属性 I希望在__get()课程中使用__set()__construct()

想出这种方法需要几个晚上的挫折: - )

答案 1 :(得分:2)

这将有效地使它们公开,并且通常只使用公共属性就可以获得任何好处(但是你需要支付性能损失并且必须编写更多代码,存在风险错误)。

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

如果您需要在读取/写入属性时执行某些代码(例如,将其设置为只读或从数据库中进行延迟获取),那么您应该使用普通的getter / setters(getAge() / {{1} })。

答案 2 :(得分:1)

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

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

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

此外,在更多情况下,您可以在为其提供值之前进行一些修改,例如哈希密码。