在PHP构造函数中将Array分配给Property

时间:2018-03-13 08:06:38

标签: php

是否可以在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();
           }
      }

1 个答案:

答案 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[]时,您将值推送到局部变量,而不是类属性。只要将局部变量的内容复制到属性中,它就不一定是错误的方法,但我强烈建议不要使用以属性命名的变量。它使您的代码难以维护,因为它可能会使开发人员感到困惑。