是否可以在PHP中将数组存储为对象属性?
我正在构建一个文章类,它提取有关研究文章的各种信息,并将它们存储为对象中的属性。由于每篇研究文章的作者数量各不相同,我想将它们作为数组存储在$ authors属性中,而不是将每个作者存储为单独的属性。在这个代码示例中,我意识到这个问题是由于使用设计不佳的表而导致的,但是,我希望看到这个代码如何用于将数组存储为对象属性。
<?php
Class Article {
public $id;
public $authors;
public $article_name;
public $journal;
public $volume_number;
public $issue_number;
public $article_location;
public function __construct($id, array $authors, $article_name, $journal,
$volume_number, $issue_number, $article_location)
{
$this->$id = $id;
$this->$authors = $authors;
$this->$article_name = $article_name;
$this->$journal = $journal;
$this->$volume_number = $volume_number;
$this->$issue_number = $issue_number;
$this->$article_location = $article_location;
}
}
//function to pull Article information from Articles Table
function getArticle($id){
try {
$query = "SELECT * FROM articles WHERE ID = :ID";
$db = Db::getInstance();
$results = $db->prepare($query);
$results->execute([':ID'=>$id]);
$row = $results->fetch();
$authors = array();
if(!empty($row['author'])){
$authors[] = $row['author'];
}
if(!empty($row['author2'])){
$authors[] = $row['author2'];
}
if(!empty($row['author3'])){
$authors[] = $row['author3'];
}
//This repeats for a while.
return new article($row['ID'],
$authorList,
$row['article_name'],
$row['journals'],
$row['volume_number'],
$row['issue_number'],
$row['article_location']);
} catch (PDOException $e) {
return "Unable to pull articles from the Articles table.";
echo $e->getMessage();
}
}
答案 0 :(得分:1)
是的,可以将数组存储为属性。
问题是您使用了错误的属性。
$this->$authorList
错了,你应该使用:
$this->authorList
您的代码目前会根据原始属性的值为您的类创建属性 - 如果$article_name
的值为&#39; ABCD&#39;,$this->$article_name
创建并填充财产&#39; ABCD&#39; - 相当于$this->ABCD = $article_name;
,意味着您无法访问原始属性中的值。它与$this->$authors = $authors;
相同 - 如果您将数组作为$authors
传递,您的代码将尝试将其存储为字符串,从而使情况更糟。在$
之前移除$authors
也可以解决此问题。
此外,当您使用$authorList[]
时,您将值推送到局部变量,而不是类属性。只要将局部变量的内容复制到属性中,它就不一定是错误的方法,但我强烈建议不要使用以属性命名的变量。它使您的代码难以维护,因为它可能会使开发人员感到困惑。