ООП PHP - JSON-кодирование объекта - PullRequest
2 голосов
/ 23 апреля 2011

Я хочу создать простой класс, который я могу использовать и кодировать как строку 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); показывает мне, что имя файла и дата и время равны нулю.И когда я использую echo json_encode($photo);, я получу только последнюю напечатанную фотографию, верно?

Ответы [ 5 ]

4 голосов
/ 23 апреля 2011

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

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

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

, как @code_burgar сказал: необходимо использовать массив

$photo[] = new Photo($filename, $date);
3 голосов
/ 23 апреля 2011

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

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

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

2 голосов
/ 23 апреля 2011

Попробуйте с помощью:

class Photo
{
 public $file;
 public $date;

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

}

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

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

и затем получить к ним доступ, используя foreach() loop

1 голос
/ 23 апреля 2011

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

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

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

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 объектов в массив.

1 голос
/ 23 апреля 2011

Ответы выше верны, вам нужно использовать $ 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();

Edit: Забыл упомянуть, вы также можете связать метод add_photo:

$my_photos->add_photo('test.jpg', '2011-01-01')->add_photo('test.jpg', '2011-01-01');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...