gpt4 book ai didi

php - 在 PHP 中合并类成员

转载 作者:可可西里 更新时间:2023-10-31 23:26:01 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com