php - 在 PHP 中合并类成员

标签 php oop magic-methods

我最近遇到了 an article由 Matthew Weier O'Phinney(ZF 项目负责人)提供,其中包含与此类似的示例代码:

class User
{
    protected $_data = array(
        'username' => null,
        'email'    => null,
        'fullname' => '',
        'role'     => 'guest',
    );

    /* ... */
}

请注意传统上四个不同的成员变量是如何合并到一个数组中的。我可以看到干净的构造函数(只有一个参数)的好处,但我怀疑 IDE 能否在 $_data 数组上很好地完成自动完成。

我能想到的一个替代方法是使用魔术方法来构造一个带有单个参数四个成员的构造函数。

class User
{
    protected $_username = null;
    protected $_email = null;
    protected $_fullname = '';
    protected $_role = 'guest';

    public function __construct($data)
    {
        foreach ($data as $key => $value) {
            $this->$key = $value;
        }
    }

    public function __set($name, $value) {
        $member = "_$name";
        $this->$member = $value;
    }
}

第二个代码块似乎更好...但是我怀疑我能写出比 O'Phinney 先生更好的代码。处理类成员的最佳方式是什么,同时仍保持与构造函数的干净接口(interface)?

最佳答案

文章中显示的数组中的所有内容方法背后的主要目的是让 __set 方法可以通过首先检查数组来控制设置什么和不设置什么。您当前的 __set 不会这样做,但这是一个简单的添加:

public function __set($name, $value) {
    $member = "_$name";
    if(property_exists($member, $this)) // <- New magic.
        $this->$member = $value;
}

你会想在你的构造函数中做同样的事情。

但是,您仍然会遇到自动完成问题。知道足以显示实例方法和变量的现代 IDE 通常也足够聪明,可以根据列表中的内容是公共(public)的、 protected 还是私有(private)的来显示或隐藏它们。就 IDE 而言,声明所有内容 protected 基本上与将它们隐藏在数组中具有相同的效果。这是使用 protected 实例变量和 __set 的主要缺点。

关于php - 在 PHP 中合并类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3089859/

相关文章:

javascript - 通过 PHP、JSON 和 Javascript 将用户特定数据插入 HTML

php - Mysql查询使用同一个表中的其他列值分组获得第二和第三最小值

javascript - 与 Closure Compiler 一起工作的 JavaScript 类的实现

PHP:修改多维数组的最干净方法?

php - 我应该将用户注册协议(protocol)复选框存储在数据库中吗

php - 在PHP中解析XSD文件并显示XSD中的元素

java - Java中隐藏的方法是什么?甚至 JavaDoc 的解释也令人困惑

php - __get/__set/__call PHP性能问题

python - 使用 __hash__ 函数设置包含用户定义的类

PHP:5.2.x 的 __callStatic 替代方案