1

ちょうど今日、以前は正常に機能していたオブジェクトモデルの奇妙な動作に気づきました(可能な限りすべてをチェックし、その構成については何も変更されていないため、PHPバージョンへの変更を疑っており、他の誰かが同様の経験をしたかどうか疑問に思っています)

最近まで、配列であるオブジェクトプロパティのキーを手動で設定できました。私のモデルの1つでのこれの特定の実装は、次のようなギャラリークラスに含まれていました。

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
                )

        )

配列であるオブジェクトプロパティ内のキーを手動で設定する機能は、いくつかのマイナーリリースで削除されましたが、私はそれを認識していませんか?私はいたるところをグーグルで検索し、PHPマニュアルサイトを調べましたが、答えが見つかりませんでした。誰かが似たようなことを経験したことがありますか?私が考慮すべきより良いアプローチはありますか?次の論理IDに戻るajaxリクエストを介して次/前のシステムを実装するのが非常に簡単になったので、私はこれを実際に使用しました(IDは間で削除できることに注意してください!)

ありがとう!

4

2 に答える 2

0

私はあなたが持っているものに何も悪いことは見ていません、そして私はあなたが説明する行動を経験したことがありません。ただし、簡単な解決策は、割り当て行を次のようなものに置き換えることです。

$output[$id['GalleryPhotoID']] = $gp;

また、プロパティに実際にその方法でアクセスできることecho $gp->GalleryPhotoID;を確認することもできます。GalleryPhotoID

最後に、上記の行を次のようなものに置き換えたとのことです。

$output['foobar'] = $gp;

それでも、エントリごとに整数キーを使用して新しいエントリを作成しましたか?その場合は、省略したコードに問題の原因となっている可能性があると思います。

于 2011-01-03T22:45:52.773 に答える
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);

    }

あなたの警告が私の間違いにつながるので、私は答えと投稿されたコメントの両方を受け入れて賛成しました。みんなありがとう!

于 2011-01-03T22:58:44.220 に答える