为代表一行的 class 中的每个 属性 设置一个 getter 是好的做法,还是我应该研究另一种方法?

Is it good practice to have a getter for every property in a class representing a row, or should I investigate another approach?

我有一个 NoteEntity class 用来 代表我的 notes table 中的一行 。我的框架 strictly 中的“(数据)实体”表示 stored/storable 数据条目 - 数据库行,如果您愿意的话。创建这样一个对象就像用 mysqli_fetch_array() 返回的数组初始化它一样简单,这需要我 将对象属性与我的 table 的列名称 匹配.

从父类继承的构造函数DataEntityclass:

PHP代码

public function __construct($row_array)
{
    foreach ($row_array as $column => $value)
    {
        if (property_exists($this, $column))
        {
            $this->$column = $value;
        }
        else
        {
            trigger_error(get_class($this) . " has no attribute called '$column'.", E_USER_NOTICE);
        }
    }
}

如您所见,它所做的只是将相应的列映射到它们相应的对象属性。

这对我来说很好,因为 NoteEntity class 仅定义一次,因此如果 table 列发生变化,很容易更改其内部工作方式。但这也需要我对 eachevery 属性 使用 getter 方法,如果我不想我的整个代码取决于给定的 table 的列名。

问题如下:每个 属性 都有一个 getter 是好的做法,还是我应该研究另一种方法? 我在问这是从性能角度来看的,但我也希望尽可能保持我的代码可维护性。

我担心性能的原因是,如果它变得有点忙,快速获取属性会变成:

PHP代码

foreach ($notes as $note_entity)
{
    $template->Process(array(
        'note_name' => $note_entity->GetName(),
        'note_ext' => array_pop(explode('.', $note_entity->GetFilename())),
        'subject_id' => $note_entity->GetSubjectID(),
        'subject_name' => $note_entity->GetSubject(),
        'institute_id' => $note_entity->GetInstituteID(),
        'institute_nick' => $note_entity->GetInstitute(),
        // ...
    ));
}

... 对于几十个音符来说可能没问题,但预计每个请求的数量甚至会达到 ,这增加了 显着 函数调用开销。目前的版本使用起来非常方便,因为在代码的任何部分都不需要记住列名。


我想出的可能解决方案包括一种方法,即关联数组中每个 returns 或每个 属性 的子集。这有以下小缺点:

我认为这更多是一种设计偏好,但使用 getters/setters 有很多优点。

封装和隐藏内部结构通常是很好的做法。互操作性是使用 getter 和 setter 是一个好主意的另一个原因(即模拟变得容易得多)。

是否要对基元执行此操作尚有争议,但通常您不想通过直接引用它们来更新属性,尤其是不希望在外部引用它们。所以 getters/setters 是隔离它们的好方法。

您获得的优势远大于您即将失去的性能。