Установка ключа свойства объекта, являющегося массивом
-
14-10-2019 - |
Вопрос
Буквально сегодня я заметил странное поведение в объектной модели, которая раньше работала нормально (я проверил все возможное, и ничего в ее конфигурации не изменилось, поэтому я подозреваю изменение версии PHP и интересно, сталкивался ли кто-нибудь еще с чем-то подобным)
До недавнего времени я мог вручную задавать ключи свойств объектов, которые представляли собой массивы.Конкретная реализация этого в одной из моих моделей содержалась в классе галереи, который выглядел так:
public function __construct($gid){
parent::__construct($gid);
$this->Photos = $this->getPhotos();
$this->AlbumCover = $this->getCover();
}
public function getPhotos(){
$sql = 'SELECT GalleryPhotoID FROM GalleryPhoto WHERE GalleryID = ?';
$params = array($this->GalleryID);
$allids = DatabaseHandler::GetAll($sql, $params);
$output = array();
foreach($allids as $id){
$gp = new GalleryPhoto($id['GalleryPhotoID']);
$output[$gp->GalleryPhotoID] = $gp;
}
return $output;
}
Ненужные части опущены.
По сути, я мог бы установить ключи массива объекта «Фотографии галереи» на идентификатор отдельной фотографии в базе данных.Это просто облегчило кодирование отдельных итераций и сделало все более плавным.
Теперь, независимо от того, какое значение я установил для этого ключа, автоматические целые числа генерируются при выполнении foreach.Я даже пытался ввести туда буквальную строку, которая теоретически должна заменять каждую итерацию, но я все равно получал автоматические целые числа для ключей свойства Photos.
[Photos] => Array
(
[0] => GalleryPhoto Object
(
[GalleryID] => 9
[Caption] =>
[Orientation] => 0
[AlbumCover] =>
[DateAdded] => 2011-01-03 16:58:51
[GalleryPhotoID] => 63
[Thumbnail] =>
[Image] =>
[src] => http://..com/galleryImage/getImage/63
)
[1] => GalleryPhoto Object
(
[GalleryID] => 9
[Caption] =>
[Orientation] => 0
[AlbumCover] =>
[DateAdded] => 2011-01-03 16:58:51
[GalleryPhotoID] => 64
[Thumbnail] =>
[Image] =>
[src] => http://..com/galleryImage/getImage/64
)
)
Была ли удалена возможность вручную устанавливать ключи в свойстве объекта, которое представляет собой массив, в какой-то второстепенной версии, и я не знаю об этом?Я повсюду гуглил, просматривал сайт руководств по PHP и не нашел ответа.Кто-нибудь испытывал что-нибудь подобное?Есть ли лучший подход, который мне следует рассмотреть?Я действительно пошел на это только потому, что это значительно упростило реализацию следующей/предыдущей системы с помощью ajax-запросов обратно к следующему логическому идентификатору (имея в виду, что идентификаторы можно удалять между собой!)
Спасибо!
Решение
Я не вижу ничего плохого в том, что у вас есть, и никогда не сталкивался с поведением, которое вы описываете.Однако быстрым решением может быть замена строки назначения чем-то вроде этого:
$output[$id['GalleryPhotoID']] = $gp;
Вы также можете echo $gp->GalleryPhotoID;
чтобы гарантировать, что GalleryPhotoID
Собственность действительно может быть доступна таким образом.
Наконец, вы сказали, что заменили приведенную выше строку чем-то вроде:
$output['foobar'] = $gp;
и он по-прежнему создавал новую запись с целочисленными ключами для каждой записи?Если это так, то я думаю, что в коде, который вы пропустили, может быть что-то, вызывающее проблему.
Другие советы
Фейспалм вовсю.Новогодние испарения, должно быть, все еще живы в моем мозгу, иначе я бы заметил, что функция, которую я добавил для получения миниатюры обложки альбома, перетасовывала массив, если бы не было фотографии с установленным свойством AlbumCover!
private function getCover(){
foreach($this->Photos as $ind=>$p){
if($p->AlbumCover){
return $this->Photos[$ind];
}
}
shuffle($this->Photos); //this is the problem
return current($this->Photos);
}
Я исправил это, чтобы просто создать локальную копию переменной и перетасовать ее, если не установлена обложка.
private function getCover(){
foreach($this->Photos as $ind=>$p){
if($p->AlbumCover){
return $this->Photos[$ind];
}
}
$Photos = $this->Photos;
shuffle($Photos);
return current($Photos);
}
Я принял и проголосовал как за ответ, так и за опубликованный комментарий, поскольку ваши предостережения привели меня к моей ошибке.Спасибо ребята!