【问题标题】:Can a property of a PHP object be an array? And if so how do I add to it from within the object?PHP 对象的属性可以是数组吗?如果是这样,我如何从对象中添加它?
【发布时间】:2021-03-25 12:27:37
【问题描述】:

我有一个对象来表示三个表中数据的组合,我试图使这个对象尽可能通用,这样数据库结构中的更改就不必反映在对象中并允许对象分别编辑这 3 个表,而不是编写冗长复杂的 SQL 连接语句。

由于该对象代表一个数据库表,因此需要/可接受公共属性,我试图在构造函数中动态生成它们,但为信息所属的不同数据库表保持属性分开。(所以当我去要更新一个表,必须检查更改然后发送到更新的信息不会与其他表的属性混合)

我的第一个想法是将每个表保存在每个表的对象属性内的数组中......但是向数组添加数据的几次尝试都是空白的,所以这要么是不可能的,我只是偷偷过去了错误以某种方式有意义的语法,或者我做错了。

有什么帮助吗?

class MemberObject
{
  private $dbc;
  private $memberID;
  private $membersTable;
  private $affiliatesTable;
  private $clientsTable;

// Each DB held in own array
  public $member = array();
  public $affiliate = array();
  public $client = array();

  public function __construct(PDO $dbc, $memberID)
  {
    $this->dbc = $dbc;
    $this->memberID = $memberID;
    $this->membersTable = new DatabaseTable($dbc, 'member', 'memberID');
    $this->affiliatesTable = new DatabaseTable($dbc, 'memberAffiliated', 'memberID');
    $this->clientsTable = new DatabaseTable($dbc, 'memberClient', 'memberID');
    $thisMember = $this->membersTable->findById($this->memberID);
    $this->populateData($thisMember, $this->member);

    if ($thisMember = $this->affiliatesTable->findById($this->memberID))
    { // IF get member from affiliatesTable
      $this->populateData($thisMember, $this->affiliate);
    }

    if ($thisMember = $this->clientsTable->findById($this->memberID))
    { // IF get member from clientsTable
      $this->populateData($thisMember, $this->client);
    }
  }

  private function populateData($dataArray, $targetTable)
  {
    foreach ($dataArray as $key => $value)
    {
      $targetTable[$key] = $value;
    }
  }

  public function saveEdit()
  {
    $membersTable->save($this->member);
    if (isset($this->affiliate['affiliateID']))
    {
      $affiliatesTable->save($this->member);
    }
    if (isset($this->client['clientID']))
    {
      $clientsTable->save($this->member);
    }
  }
}```

【问题讨论】:

  • 我看不到你在哪里填充数组
  • populateData 函数中的 foreach 应该基于可用数组和提供给它的对象属性来执行此操作。这个版本是我在该函数中尝试过的第 6 种语法。
  • $dataArray 的示例是什么?可能想要$this->$targetTable[] = $value; 或列名$this->$targetTable[$key] = $value;
  • 我知道花括号与它有关!好的,我会尝试一下,但是当我把你带到这里时,我将 $this->member 作为 $targetTable 发送到该函数,所以它不会像你一样使它成为 $this->$this->member写在那里?这种语法让我很容易迷失方向……
  • 您并不真的需要我删除它们的花括号,但是您发送的任何内容都不会是该变量的内容,bobmary 或其他任何内容。但这不是一个很好的模式,也许看看 ORM。

标签: php mysql arrays database object


【解决方案1】:

我不知道为什么,但是使用 $this->member 将对象属性发送到对象函数不起作用,因此将函数中的参数更改为字符串并在函数中使用 this 实际上按预期针对数组:

$this->{$targetTable}[$key] = $value;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 2019-10-21
    • 2015-12-23
    • 2010-10-26
    相关资源
    最近更新 更多