Сколько всего уже успели понаписать в нашем мире, есть и большие навороченные галереи, есть и маленькие, есть прекрасные а есть не очень. Есть галереи с использованием БД, а есть нет. Казалось, выбирай и радуйся. Но это просто, а значит не интересно. Будем писать галерею с использованием ООП, на ПХП :), без БД, даже практически без файлов), все будет хранится в объектах, которые в промежутках между вызовами будут сериализованы и аккуратно записаны на жесткий диск.
Почему так?, потому, что такой вариант хранения данных я еще не использовал, практика 🙂

Так как создание галереи есть процесс настоящего времени, то логика и модель архитектуры еще весьма не однозначна, что-то будет добавлено, что-то убрано, а что-то изменено до неузнаваемости, отнеситесь с пониманием к этому факту 🙂

начнем пожалуй.
Класс в котором мы держим информацию о каждой загруженной фотографии: название, описание и так далее

class Img {
    private $file="";       #имя файла
    private $date="";       #дата загрузки/фотографии
    private $title="";      #название снимка
    private $description="";#описание
    private $visible=false; #показывать
    private $comment=false; #включены комментарии

    public function setFile($s){
        $this->file=$s;
    }
    public function setDate($date){
        $this->date=$date;
    }
    public function setTitle($s){
        $this->title=$s;
    }
    public function setDescription($s){
        $this->description=$s;
    }
    public function setVisible($b){
        $this->visible= $b == true ? true : false;
    }
    public function setComment($b){
        $this->comment= $b == true ? true : false;
    }

    public function getFile(){
        return $this->file;
    }
    public function getDate(){
        return $this->date;
    }
    public function getTitle(){
        return $this->title;
    }
    public function getDescription(){
        return $this->description;
    }
    public function getVisible(){
        return $this->visible;
    }
    public function getComment(){
        return $this->comment;
    }
}

класс хранилище для классов изображений, в нем реализованы методы добавления/удаления/изменения данных изображений (для работы с классом Img)

class ImgStorage {

    private $aImg=array();
    private $conf=null;
    private $func=null;
    public function __construct(SiteConfig $sc){
        $this->conf=$sc;
        $this->func=new Func();
    }
    public function addImg($file,$date,$title,$description,$visible,$comment){
        if ($this->func->isFile($this->conf->getPathToImg().'/'.$file==false)){print "Error, file $file not found";exit;}
        $i=array_push($this->aImg,new Img());
        $this->aImg[$i]->setFile($file);
        $this->aImg[$i]->setDate($this->func->isDate($date)==true ? $date : time());
        $this->aImg[$i]->setTitle($this->func->cutText($this->func->getText($title), 100));
        $this->aImg[$i]->setDescription($this->func->cutText($this->func->getText($title), 1000));
        $this->aImg[$i]->setVisible($this->func->isBool($visible));
        $this->aImg[$i]->setComment($this->func->isBool($comment));

    }
    public function deleteImg($id){
        if ($this->func->deleteFile($this->conf->getPathToImg().'/'.$this->aImg[$id]->getFile())){
            unset($this->aImg[$id]);
        }
    }
    public function updateImg($id,$date,$title,$description,$visible,$comment){
        $this->aImg[$id]->setDate($this->func->isDate($date)==true ? $date : time());
        $this->aImg[$id]->setTitle($this->func->cutText($this->func->getText($title), 100));
        $this->aImg[$id]->setDescription($this->func->cutText($this->func->getText($title), 1000));
        $this->aImg[$id]->setVisible($this->func->isBool($visible));
        $this->aImg[$id]->setComment($this->func->isBool($comment));
    }

    public function getImage($id){
        return array_key_exists($id, $this->aImg[$id]) ? $this->aImg[$id] : null;
    }    
}