PHP getter / setter to array

时间:2010-07-10 08:06:37

标签: php oop

关注“问题”

具有大量属性的PHP类。很多Getters / Setter。

有没有什么好的解决方案可以将所有属性转换为数组?

protected $name;
protected $date;

public function getName();
public function getDate();
public function asArray(); // call all getters?

6 个答案:

答案 0 :(得分:10)

您的API是否已定义,是否仍然遇到getX和setX方法?我更喜欢物业。减少输入,更好地区分属性和方法,结果代码看起来更像PHP,而不像Java。但暴露属性并不意味着你失去了封装并使你的所有内部公开。使用__get和__set魔术方法,您可以对所呈现的内容进行非常精细的控制。另外,将属性转储为数组会非常简单:

class Foo
{
    protected $properties;

    public function __construct() {
        $this->properties = array();
    }

    public function __set($prop, $value) {
        $this->properties[$prop] = $value;
    }

    public function __get($prop) {
        return $this->properties[$prop];
    }

    public function toArray() {
        return $this->properties;
    }
}

唉,如果你因为胡思乱想的老板或者对OOP 必须的误解而坚持使用setter / getter,为什么不把对象强制转换为数组呢?

class Bar
{
    public $x;
    public $y;
    public $z;
    protected $a;
    protected $b;
    protected $c;
    private $q;
    private $r;
    private $s;

    public function __construct() {
    }

    public function setA($value) {
        $this->a = $value;
    }

    public function getA() {
        return $this->a;
    }

    public function setB($value) {
        $this->b = $value;
    }

    public function getB() {
        return $this->b;
    }

    public function setC($value) {
        $this->c = $value;
    }

    public function getC() {
        return $this->c;
    }

    public function toArray() {
        return (array)$this;
    }
}

注意如何投射公共,受保护和私有属性:

$bar = new Bar();
print_r($bar->toArray());

array(9) {
  ["x"]=>
  NULL
  ["y"]=>
  NULL
  ["z"]=>
  NULL
  [" * a"]=>
  NULL
  [" * b"]=>
  NULL
  [" * c"]=>
  NULL
  [" Foo q"]=>
  NULL
  [" Foo r"]=>
  NULL
  [" Foo s"]=>
  NULL
}

请注意,protected / private的数组键不以空格开头,它是null。您可以重新键入它们,甚至可以根据需要过滤掉受保护/私有属性:

public function toArray() {
    $props = array();
    foreach ((array)$this as $key => $value) {
        if ($key[0] != "\0") {
            $props[$key] = $value;
        }
    }
    return $props;
}

你正在使用动态语言;利用它,享受它!

答案 1 :(得分:3)

如何使用ReflectionClass和ReflectionMethod,如下所示:

class PropertyHolder
{
    private $name;
    private $date;
    private $anotherProperty;

    public function __construct($name, $date)
    {
        $this->name = $name;
        $this->date = $date;
    }

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

    public function getDate()
    {
        return $this->date;
    }

    public function asArray()
    {
        $result = array();

        $clazz = new ReflectionClass(__CLASS__);
        foreach ($clazz->getMethods() as $method) {
            if (substr($method->name, 0, 3) == 'get') {
                $propName = strtolower(substr($method->name, 3, 1)) . substr($method->name, 4);

                $result[$propName] = $method->invoke($this);
            }
        }

        return $result;
    }

答案 2 :(得分:2)

您可以使用PHP的reflection功能。这是一个例子:

答案 3 :(得分:2)

尝试查看同一类别中的get_object_vars()get_class_vars和其他人。这里显示的例子几乎就像你需要的那样。检查那里的评论(例如http://www.php.net/manual/en/function.get-class-vars.php#87772)他们已经提供了适合您需求的方法。

答案 4 :(得分:2)

(array)上的简单$this广告就足够了:

(array) $this;

如果您有其他属性(例如私有属性,不应该是toArray()ed),您可以在以后取消设置:

public function toArray() {
    $array = (array) $this;
    unset($array['private'], $array['privateagain']);
    return $array;
}

答案 5 :(得分:0)

一种选择是在构造函数中创建一个数组。 你将有一个吸气剂和一个二传手.. 当您想要设置或获取某些内容时,请执行以下操作:

$foo->get( 'UID' ); //(to get user id)
or
$foo->set( 'UID', 5 ); // to set something)