就在今天,我注意到一个对象模型中的一个奇怪的行为,以前工作得很好(我已经检查了一切可能,但其配置没有任何改变,所以我怀疑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;
}
省略了不相关的部分。
基本上,我可以将Gallery的Photos对象的数组键设置为数据库中单个照片的id。这使得对单个迭代进行编码变得更加容易,并使整个过程更顺畅。
现在,无论我将该键设置为什么,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
)
)
在某个次要版本中删除了在一个对象属性中手动设置键的能力是否已被删除,我不知道它?我已经google了一遍,浏览了PHP手册网站,没有找到答案。有没有人经历过类似的事?我应该考虑更好的方法吗?我只是真的使用了这个,因为它通过ajax请求实现下一个/上一个系统更容易实现回到下一个逻辑ID(请记住,可以删除之间的ID!)
谢谢!
答案 0 :(得分:0)
我没有看到你所拥有的任何错误,我从未体验过你所描述的行为。但是,一个快速的解决方案可能是用这样的方式替换赋值行:
$output[$id['GalleryPhotoID']] = $gp;
您还可以echo $gp->GalleryPhotoID;
确保实际可以通过这种方式访问GalleryPhotoID
属性。
最后,你说你用类似于:
的东西替换了上面一行$output['foobar'] = $gp;
它仍然为每个条目创建了一个带有整数键的新条目?如果是这种情况,那么我认为您遗漏的代码中可能存在导致问题的原因。
答案 1 :(得分:0)
Facepalm一路走来。新年的臭味仍然在我的大脑中,否则我会注意到,如果没有设置了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);
}
我接受并赞同了答案和评论,因为您的警告导致我的错误。谢谢你们!