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