使用魔术方法的OOP PHP,getter和setter

Sta*_*bie 5 php oop

有哪些策略可用于为PHP类的私有成员创建访问器和更改器?这个建议是否合适:http://cormacscode.wordpress.com/2009/01/22/read-only-object-variables-in-php-using-magic-methods/

<?php
class classWithReadOnlyVar
{
    private $readOnlyVar;

    public function __get($varName)
    {
        return $this->$varName;
    }

    public function __set($varName,$varValue)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果某些成员需要私有,公共或受保护的财产方法怎么办?

Yan*_*hon 6

首先__get,__set等被定义public,你不能让他们并非如此.应该明智地使用魔术方法,因为调用魔法方法所需的时间大约是调用类方法的三倍.

class A {
   public function __get($name) { ... }

   public function __getValue() { ... }     // <== is faster

}
Run Code Online (Sandbox Code Playgroud)

通常(通常,最好),您将拥有您的类成员privateprotected(从不public)并具有访问器和更改器来封装它们.这些访问者和增变器可以具有任何可见性,这取决于用户可以对成员做什么.您也可以通过仅为成员声明访问器来创建不可变类,这些访问器仅在构造函数中初始化.

因此,您的示例类应该阅读

class classWithReadOnlyVar {
   private $readOnlyVar;

   public function getReadonlyVar() {
     return $this->readOnlyVar;
   }

}
Run Code Online (Sandbox Code Playgroud)

而且不应该使用魔法.

可能有很多理由要避免使用魔术方法:

  1. 他们打破了代码完成
  2. 它们在运行时速度较慢
  3. 它们使重构和维护变得更加困难/复杂
  4. 你不能有一个protected神奇的方法
  5. 等等

班级成员

他们的知名度应该是,private或者protected,这取决于你是否希望通过继承来访问它们.他们永远不应该public因为这打破了OO范式.

受保护成员的示例:

class A {
    protected $_name = 'A';

    public function getName() { return $this->_name; }
}

class B {
    protected $_name = 'B';   // getName() will not return 'B'
}
Run Code Online (Sandbox Code Playgroud)

(不$_nameprotected,这将是不可能的,也没有必要重新确定存取器)

访问器

他们应该是protectedpublic.拥有一个private访问者毫无意义; 一个类应该直接访问它的成员.如果该成员需要处理,则该类将知道何时调用访问者.

存取器

他们应该是protectedpublic.对于访问者来说,拥有一个privatemutator 是没有意义的...除非在处理需要在内部完成时非常罕见.如果一个类成员没有访问,它应该不会有突变.如果没有能够以某种方式获得值,则设置值也没有意义.