我最近遇到了 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/