【问题标题】:Re create as objects and classes PHP重新创建为对象和类 PHP
【发布时间】:2014-11-23 18:16:09
【问题描述】:

我有点难过。我从来没有在 PHP 中过多地处理对象和类,但有人建议我用它重新编写一些代码。
我要做的是使 $auctions 成为对象属性,同时将所有行数据保存到其中。

现在,我使用 echo $auctions[1]['title']; 来回显 id=1 标题的列表。 我希望重新创建它,使它成为一个对象。

这是我当前的代码,

$sqlquery = "SELECT * FROM auctions";
if ($result = $db->query($sqlquery)) {
    while ($row = $result->fetch_assoc()) {
        $auctions[$row['id']]['id'] = $row['id'];
        $auctions[$row['id']]['title'] = $row['title'];
        $auctions[$row['id']]['featured_image'] = $row['featured_image'];
        $auctions[$row['id']]['description'] = $row['description'];
        $auctions[$row['id']]['date'] = $row['date'];
        $auctions[$row['id']]['location'] = $row['location'];
        $auctions[$row['id']]['highlights'] = $row['highlights'];
        $auctions[$row['id']]['catagories'] = $row['catagories'];
        $auctions[$row['id']]['notes'] = $row['notes'];
        $auctions[$row['id']]['terms'] = $row['terms'];
        $auctions[$row['id']]['contact'] = $row['contact'];
    }
}

我不知道如何做到这一点,但如果有人能给我一点提示以指出我的方向,我将不胜感激! :)

【问题讨论】:

  • 为什么不$auctions[$row['id']] = $row
  • 虽然你不知道类是什么,但不要尝试使用它。您无法从无法使用的功能中获得一些利润。学习,了解它是什么,了解它为什么,然后使用。
  • 你应该考虑使用ORM
  • 您可能希望查看诸如 MaphperPHPDataMapper 之类的 ORM 以减少大量代码。
  • @vp_arth 我从阅读代码中学到了最好的东西,并且知道它会做什么。这将有助于我理解它。

标签: php class variables object


【解决方案1】:

使用上面列出的所有必需成员变量创建一个类auctions(例如idtitlefeature_image 等)。接下来在可以接受$row的类中创建一个setter方法(例如setValues())。

$sqlquery = "SELECT * FROM auctions";
$auction = new Auctions();
if ($result = $db->query($sqlquery)) {
    while ($row = $result->fetch_assoc()) {

       $auction->setValues( $row );
       // do something with $auction...
    }
}

除了显式的setter方法,你也可以使用魔术方法__set()

【讨论】:

    【解决方案2】:

    我现在在这里写一个最小的sn-p:

    首先让我们为所有模型创建一个基类:

    abstract class Model() {
      public $fields = array();
      private $data = array();
      public function setValues(array $vals) {
        foreach($vals as $key=>$value) {
          if (in_array($key, static::$fields)) {
            $this->data[$key] = $value;
          }
        }
      }
      public function get($key) {
          if (in_array($key, static::$fields) && isset($this->data[$key])) {
            return $this->data[$key];
          }
          return null; // or throw Exception)
      }
    }
    

    接下来,创建一些具体的模型:

    class Users extends Model {
      public static $fields = array('id', 'name');
    }
    

    我们现在可以使用它了:

    $users = array();
    $sqlquery = "SELECT * FROM Users";
    if ($result = $db->query($sqlquery)) {
        while ($row = $result->fetch_assoc()) {
          $user = new User();
          $user->setValues($row);
          $users[] = $user;
        }
    }
    

    您可以直接向用户模型添加一些特定于用户的方法(也称为登录)..

    另外你应该实现其他Model方法,比如getByIdgetByQuerysave等,不要使用直接sql查询,因为模型可以自己做

    【讨论】:

    • 也要小心。不推荐像这里那样在循环中创建模型,因为它非常重。伙计们通常会为这种情况创建一个Collection 实体。它可以存储数据列表,并使用模型对其进行迭代。
    【解决方案3】:

    您可以将值存储在类似的对象中

    $obj = new stdClass; //create new standard class object
    
    $obj->id = $row['id']; //assign property value
    $obj->title = $row['title'];
    //further properties
    

    ...等等

    【讨论】:

      【解决方案4】:

      您确实是在尝试创建一组对象(包含一次拍卖信息的类型的实例。像这样:

      class Auction
      {
          var $id = null;
          var $title = null;
          var $featured_image = null;
          var $description = null;
          var $date = null;
          var $location = null;
          var $highlights = null;
          var $catagories = null;
          var $notes = null;
          var $terms = null;
          var $contact = null;
      }
      
      $sqlquery = "SELECT * FROM auctions";
      if ($result = $db->query($sqlquery)) {
          while ($row = $result->fetch_assoc()) {
              $newAuction = new Auction();
              $newAuction->id = $row['id'];
              $newAuction->title = $row['title'];
              $newAuction->featured_image = $row['featured_image'];
              $newAuction->description = $row['description'];
              $newAuction->date = $row['date'];
              $newAuction->location = $row['location'];
              $newAuction->highlights = $row['highlights'];
              $newAuction->catagories = $row['catagories'];
              $newAuction->notes = $row['notes'];
              $newAuction->terms = $row['terms'];
              $newAuction->contact = $row['contact'];
              $auctions[$row['id']] = $newAuction;
          }
      }
      

      请注意,您拼错了“类别”(您有“类别”)。

      【讨论】:

      • 这门课有什么好处?你能添加setValues(array $row) 方法吗?
      • @vp_arth 我不确定我知道你在问什么。
      • 我问的是What make this object different from the array used before? -> 而不是[]
      • 不同,因为它是一个对象,而不是一个数组。我建议 OP 构建一个对象数组,而不是多维关联数组。我认为这很明显,所以我不确定你的问题的重点是什么。我也不明白你为什么要问setValues 方法。这不是问题的一部分,并且我在答案中定义的类中没有这样的方法,所以不,你不能使用那个方法。
      【解决方案5】:

      我建议你使用PDO

      class Auction
      {
          public $id;
          public $title;
          public $featured_image;
          public $description;
          public $date;
          public $location;
          public $highlights;
          public $catagories;
          public $notes;
          public $terms;
          public $contact;
      
          // This will return $all being an array of objects of class Auction
          public static function getAll() {
              $query = "SELECT * FROM auctions";
      
              $statement = $db->prepare($query);
              if (!$statement->execute())
                  return false;
              $all = $statement->fetchAll(PDO::FETCH_CLASS, "Auction");
              return $all;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-08-29
        • 2013-01-01
        • 2019-08-03
        • 2021-07-23
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多