ООП PHP — JSON-кодирование объекта

#php #json #oop

#php #json #ооп

Вопрос:

Я хочу создать простой класс, который я могу использовать и кодировать как json строку. Моя цель — закодировать объект json с информацией обо всех моих фотографиях на странице. Никогда раньше не использовал объектно-ориентированный php, но я попробовал:

 class Photo
{
public $file;
public $date;

function __construct($filename, $datetime) 
{
    $file = $filename;
    $date = $datetime;
}

}
  

Перебираю мои фотографии и создаю новый экземпляр класса для каждой фотографии:

 $photo = new Photo($filename, $date);
  

2 проблемы: echo json_encode($photo); показывает мне, что filename и datetime равны нулю. И когда я использую echo json_encode($photo); , я распечатаю только последнюю фотографию, верно?

Ответ №1:

Вам нужно использовать член класса, используя $this-> varName в вашем классе

Итак, ваш конструктор должен быть таким

 function __construct($filename, $datetime) 
{
    $this->file = $filename;
    $this->date = $datetime;
}
  

как сказал @code_burgar: нужно использовать массив

 $photo[] = new Photo($filename, $date);
  

Ответ №2:

Вы должны быть уверены, что ссылаетесь на переменные вашего экземпляра с помощью $this . Например:

 function __construct($filename, $datetime) 
{
    $this->file = $filename;
    $this->date = $datetime;
}
  

Я бы посоветовал вам прочитать ссылку на ООП PHP

Ответ №3:

Приведенные выше ответы верны, вам нужно использовать $this.

Попробуйте это:

 class Photos {
   private $photos = array();

   function add_photo($filename, $date) {
      $this->photos[] = array('filename' => $filename, 'date' => $date);
      return $this;
   }

   function get_all() {
      return json_encode($this->photos);
   }
}


$my_photos = new Photos();

$my_photos->add_photo('test.jpg', '2011-01-01');

echo $my_photos->get_all();
  

Редактировать:
Забыл упомянуть, вы также можете объединить метод add_photo в цепочку:

 $my_photos->add_photo('test.jpg', '2011-01-01')->add_photo('test.jpg', '2011-01-01');
  

Комментарии:

1. просто небольшая ошибка ' . Использовать $my_photos->add_photo('test.jpg', '2011-01-01');

Ответ №4:

Попробуйте с:

 class Photo
{
 public $file;
 public $date;

 function __construct($filename, $datetime) 
   {
       $this->file = $filename;
       $this->date = $datetime;
   }

}
  

И если вы хотите сохранить все ваши фотообъекты, вы можете сделать

 $photos[] = new Photo($file,$date);
  

а затем получить к ним доступ с помощью foreach() цикла

Ответ №5:

Другие ответили на вопрос о вашей первой проблеме. Чтобы обновить элементы объекта, вы должны использовать $this в контексте объекта. Извне используйте переменную, ссылающуюся на объект, поскольку ваши участники являются общедоступными:

 class Photo {
   public $file;
   public $date;
}
$photo = new Photo;
$photo->file = 'file';
$photo->date = time();
echo json_encode($photo);
  

При проектировании не рекомендуется публично раскрывать элементы объекта, но json_encode() в строку json не будут добавляться непубличные элементы, поэтому для прохождения этого маршрута вам понадобится собственный метод encode:

 class Photo {
   private $file;
   private $date;
   public function __construct($file, $date) {
      $this->file = $file;
      $this->date = $date;
   }
   public function __encode() {
      $json = new stdClass;
      foreach (get_object_vars($this) as $name => $value) {
         $this->$name = $value;
      }
      return json_encode($json);
   }
}
  

Ваш второй вопрос, похоже, подразумевает, что вы можете захотеть, чтобы несколько фотографий были сохранены как объект Photo. Вы можете просто поместить несколько Photo объектов в массив.