2

我想知道哪种方式更好。在控制器类中使用私有属性,或仅使用一个私有属性作为属性数组。

代替:

class User{

    private $id;
    private $firstName;
    private $surname;
    private $age;
    private $gender;
    private $city;
    ...
    ...
}


class User{

    private $data;
}

然后能够做这样的事情:

function __construct(){
     //this would contain id, firstName, username, age, gender...
    $data = $model->getData();
}

谢谢

4

3 回答 3

2

使用数组在类上编写代码时,您将失去任何自动完成工具。您将失去检测属性语法错误的能力。事实上,你会让你的代码更混乱,更少描述性。

对于将与多个开发人员共享的东西,或者在您编写它几个月或几年后与您自己共享的东西,使用对象通常是一件好事,可以提供更好的可维护性。在我看来,您应该保留属性。一个更令人困惑的代码可能会被“优化”,或者更短的阅读,但如果你想要,只需编写汇编代码。如果您想制作目标代码,请以干净的方式进行,您总会发现它可以挽救您未来的生活。

您的问题是,您可能认为在对象属性和模型层列之间保持干净的映射真的很痛苦。但无论您尝试什么,这是您在所有应用程序中始终必须编写的最少代码,如果未在此处完成,您在使用对象时仍需了解这些属性。很有可能这是一种失败模式

我们大多数开发人员都信奉“不要重复自己/重复是邪恶的”原则,并且我们尽可能将其应用于我们创建的软件。但是我们可以犯的最致命的陷阱之一就是挥舞抽象的魔杖太快太宽泛,我们经常忘记不必要的重复的后果远小于不必要的合并的后果。

通过您的 DataModel 加载示例,我可以看到例如两个潜在的未来问题:

  • 让我们想象一下,将来您将拥有一个二进制属性,并且该属性需要延迟加载,无论您做什么,您肯定会以围绕 __construct 的肮脏解决方案结束。
  • 您现在正在构建您的类对象的一些实例,您需要为这些对象的数据提供一些不是来自模型的数据(可能是一种缓存),并且您有数千个这些对象。但是每次你构造这样的对象时,所有的属性都是从模型中填充的。

事实上,如果你想做一些基于对象相关模型来填充对象属性的东西,你真的应该认为它是一个更通用的东西,可能意味着其他对象、接口、工厂、几种方法。至少不在构造中。

对数组使用数组,对属性使用属性,让 PHP 引擎优化属性管理,我相信代码优化器使用属性会比使用字符串索引的数组做出更好的事情。

于 2012-06-20T12:23:26.397 回答
0

如果您有许多属性,请使用数组。这样你就可以使用魔法方法的力量,比如:

public function __set($name, $value)
    {
        echo "Setting '$name' to '$value'\n";
        $this->data[$name] = $value;
    }

参考:http ://www.php.net/manual/en/language.oop5.overloading.php#object.set

于 2012-06-20T11:47:36.307 回答
0

取决于您真正需要对它们做什么,但通常数组可以更轻松地进行操作。

PS:它们被称为属性,而不是属性。

于 2012-06-20T11:44:28.120 回答