以下是编辑过的课程,其中包括答案:
编辑:包含的答案
<?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;
}
}
答案 0 :(得分:3)
我注意到的一些事情:
您的方法和变量名称应该更清晰。具体来说,rmove
应该重命名为更具描述性的内容,以及每个私有成员变量。使用函数和变量名称进行清晰而不是简洁的拍摄。
从您的类中删除对$ _FILES和$ _SESSION的引用,并将该信息传递给构造函数。没有必要将此类与周围客户端代码的实现细节相结合。您可能希望在电子邮件不在会话变量中的其他情况下重用它,或者文件信息不在$ _FILES中。
您可以按如下方式重写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);
,只需从$this->max1
内访问rmove
。
考虑将rmove
分解为较小的私有函数,其名称清楚地描述了if语句的每种情况。
此外,rmove
目前正在执行两项不同的操作:1)重新计算真实的宽度和高度,以及2)根据这些尺寸创建新版本的图像。我将其分解为两种方法,分别对这些任务进行处理。
最后,需要考虑一个更大的问题:此类没有任何公共API。没有理由现在任何方法都需要公开,因为客户端代码永远不会使用它们。现在,该类只是作为容器代码来执行一系列应该在文件上载后触发的任务。因此,您应该考虑重新考虑客户端代码在其他情况下如何使用此类。