Php 类设计-图像上载-调整大小(无裁剪)

Php 类设计-图像上载-调整大小(无裁剪),php,class,Php,Class,以下是已编辑的类,其中包含答案: 编辑:包括答案 <?php class Upload { private $originalWidth, $originalHeight, $newWidth, $newHeight, $maxMedium = 50, $maxSmall = 20; private $src = NULL; pri

以下是已编辑的类,其中包含答案:

编辑:包括答案

<?php

class Upload
{
    private $originalWidth, 
            $originalHeight, 
            $newWidth, 
            $newHeight, 
            $maxMedium = 50, 
            $maxSmall = 20;

    private $src = NULL;

    private 
            $fileType,
            $fileName,
            $sessionId,
            $path_medium,
            $path_small;

    function __construct($fileType, $fileName)
    {
        if(1)
        {
            Session::start();
            Session::activate(0, 1000, 'Test Account A', 'bookmarks');
        }

        /**
         *    Initialize the Object
         */

        $this->sessionId = Session::get('id');
        $this->path_medium = PICTURES . "/$this->sessionId.jpg";
        $this->path_small = PICTURES . "/$this->sessionId-1.jpg";
        $this->fileType = $fileType;
        $this->fileName = $fileName;

        /**
         *    Instantiate the Object
         */

        $this->instantiate();
    }

    private function instantiate()
    {
        $this->createImages();
        $this->updateSessionAndDb();
    }

    private function createImages()
    {
        if(move_uploaded_file($this->fileName, $this->path_medium))
        {
            if($this->get_image($this->path_medium))
            {
                list($this->originalWidth,$this->originalHeight)=getimagesize($this->path_medium);
                $this->newWidth = $this->originalWidth;
                $this->newHeight = $this->originalHeight;
                // these could each be another class instead of two functions..but no time to refactor further
                $this->resize_move($this->maxMedium,$this->path_medium);
                $this->resize_move($this->maxSmall,$this->path_small);
                imagedestroy($this->src);
            }
        }
    }
    private function updateSessionAndDb()
    {
        $db = new Database();
        $result = $db->_pdoQuery('none', 'update_picture', array($this->sessionId));
        Session::set('picture',1);
    }
    private function resize_move($max, $path)
    {
        $this->makeProportions($max);
        $image_true_color = imagecreatetruecolor($this->newWidth, $this->newHeight);
        imagecopyresampled($image_true_color, $this->src, 0, 0, 0, 0, $this->newWidth, $this->newHeight, $this->
        originalWidth, $this->originalHeight);
        imagejpeg($image_true_color, $path);
        imagedestroy($image_true_color);
    }
    private function makeProportions($max)
    {
        $this->newWidth=$this->originalWidth; 
        $this->newHeight=$this->originalHeight;
        if(($this->originalWidth > $this->originalHeight) && ($this->originalWidth > $max))
        {
            $this->newWidth = $max;
            $this->newHeight = ($max / $this->originalWidth) * $this->originalHeight;
        }
        elseif($this->originalHeight > $this->originalWidth && $this->originalHeight > $max)
        {
            $this->newHeight = $max;
            $this->newWidth = ($max / $this->originalHeight) * $this->originalWidth;
        } 
        elseif ($this->originalWidth > $max)
        {
            $this->newWidth = $this->newHeight = $max;
        }
    }
    private function get_image($path)
    {
        $type_creators = array( 
            'image/gif' => 'imagecreatefromgif', 
            'image/pjpeg' => 'imagecreatefromjpeg', 
            'image/jpeg' => 'imagecreatefromjpeg', 
            'image/png' => 'imagecreatefrompng'); 
        if(array_key_exists($this->fileType, $type_creators)) 
        { 
            $this->src = $type_creators[$this->fileType]($path); 
            return true; 
        }
    return false; 
    }
}
sessionId=Session::get('id');
$this->path\u medium=图片。“/$this->sessionId.jpg”;
$this->path\u small=图片。“/$this->sessionId-1.jpg”;
$this->fileType=$fileType;
$this->fileName=$fileName;
/**
*实例化对象
*/
$this->instantiate();
}
私有函数实例化()
{
$this->createImages();
$this->updateSessionAndDb();
}
私有函数createImages()
{
如果(移动上传的文件($this->fileName,$this->path\u medium))
{
如果($this->get_image($this->path_medium))
{
列表($this->originalWidth,$this->originalHeight)=getimagesize($this->path\u medium);
$this->newWidth=$this->originalWidth;
$this->newHeight=$this->originalHeight;
//它们可以是另一个类,而不是两个函数。但是没有时间进一步重构
$this->resize\u move($this->maxMedium,$this->path\u medium);
$this->resize\u move($this->maxsall,$this->path\u small);
imagedestroy($this->src);
}
}
}
私有函数updateSessionAndDb()
{
$db=新数据库();
$result=$db->_pdoQuery('none','update_picture',数组($this->sessionId));
会话::set('picture',1);
}
私有函数调整大小\u移动($max,$path)
{
$this->makecomportions($max);
$image\u true\u color=imagecreatetruecolor($this->newWidth,$this->newHeight);
imagecopyresampled($image\u true\u color,$this->src,0,0,0,$this->newWidth,$this->newHeight,$this->
原始宽度,$this->originalHeight);
imagejpeg($image\u true\u color,$path);
imagedestroy($image\u true\u color);
}
私有函数最大比例($max)
{
$this->newWidth=$this->originalWidth;
$this->newHeight=$this->originalHeight;
如果($this->originalWidth>$this->originalHeight)&($this->originalWidth>$max))
{
$this->newWidth=$max;
$this->newHeight=($max/$this->originalWidth)*$this->originalHeight;
}
elseif($this->originalHeight>$this->originalWidth&&$this->originalHeight>$max)
{
$this->newHeight=$max;
$this->newWidth=($max/$this->originalHeight)*$this->originalWidth;
} 
elseif($this->originalWidth>$max)
{
$this->newWidth=$this->newHeight=$max;
}
}
私有函数get_image($path)
{
$type_creators=数组(
'image/gif'=>'imagecreatefromformgif',
'image/pjpeg'=>'imagecreatefromjpeg',
'image/jpeg'=>'imagecreatefromjpeg',
'image/png'=>'imagecreatefrompng');
如果(数组\键\存在($this->fileType,$type\创建者))
{ 
$this->src=$type\u创建者[$this->fileType]($path);
返回true;
}
返回false;
}
}
我注意到了几件事:

  • 您的方法和变量名应该更清晰。具体来说,
    rmove
    应该重命名为更具描述性的名称,以及您的每个私有成员变量。函数名和变量名力求清晰,而不是简洁

  • 从类中删除对$\u文件和$\u会话的引用,并将该信息传递给构造函数。不需要将此类与周围客户机代码的实现细节耦合。如果电子邮件不在会话变量中,或者文件信息不在$\u文件中,您可能希望在其他情况下重用它

  • 您可以按如下方式重写
    get_image()
    方法,使其更简洁。请注意,使用此方法,添加对新图像类型的支持只需要在方法开始时将它们添加到数组中。您甚至可以将该数组移出方法,并将其作为静态成员变量提供

    function get_image($path)
    {
    $type_creators = array(
        'image/gif' => 'imagecreatefromgif',
        'image/jpeg' => 'imagecreatefromjpeg',
        'image/png' => 'imagecreatefrompng',
    );
    
    $img_type = $_FILES['ufile']['type'];
    
    if (array_key_exists($img_type, $type_creators)) {
        $this->src = $type_creators[$img_type]($path);
        return true;
    }
    return false;
    }
    
  • 不要将成员变量作为参数传递给方法。记住,它们已经自动可用了。因此,不是
    $this->rmove($this->max1,$path3)
    ,只需从
    rmove
    中访问
    $this->max1

  • 考虑将
    rmove
    分解为更小的私有函数,这些函数的名称清楚地描述了if语句的每种情况

  • 另外,
    rmove
    现在正在执行两个不同的操作:1)重新计算真实宽度和高度,2)基于这些尺寸创建图像的新版本。我会将其分解为两种方法,分别执行这些任务

  • 最后,需要考虑一个更大的问题:这个类没有任何公共API。它的任何方法现在都不需要公开,因为客户端代码永远不会使用它们。现在,该类只是充当容器代码来执行一系列任务,这些任务应该在文件上载后触发。因此,您应该考虑重新考虑客户端代码在其他情况下如何使用这个类。


“公共函数获取图像($path)”不是“函数获取图像($path)”。虽然,正如你们所知,混合静态和非静态函数是可以做到的,但我尽量不这样做。正如您看到的,您正在传递一个属于类属性的变量,而静态函数无法访问它。您的上载类实际上是resizer(或类似的东西),请执行:)只是好奇,您怎么会有329个从未注册过的声誉?我猜它会跟踪我的IP或会话变量,我不确定。哦,是的,函数式编程很有趣。这里有一个简单的概念证明:我在新的类中添加了你所有的更新。。。