我正在阅读MeioUpload的源代码,以确保我理解它正在做什么,并且在大多数情况下代码很容易理解。然而,我遇到了一段我似乎无法弄清楚的代码,所以我试图确定这是作者的错误还是我错过了什么。
本质上,此函数传递默认图像的文件名,并将该文件名添加到保留字列表中(并为其生成替换字符串)。我在我无法弄清楚的代码行旁边放了一个箭头和问号(在注释中):
/**
* Include a pattern of reserved word based on a filename,
* and it's replacement.
* @author Vinicius Mendes
* @return null
* @param $default String
*/
function _includeDefaultReplacement($default){
$replacements = $this->replacements;
list($newPattern, $ext) = $this->splitFilenameAndExt($default);
if(!in_array($newPattern, $this->patterns)){
$this->patterns[] = $newPattern;
$newReplacement = $newPattern;
if(isset($newReplacement[1])){ // <--- ???
if($newReplacement[1] != '_'){
$newReplacement[1] = '_';
} else {
$newReplacement[1] = 'a';
}
} elseif($newReplacement != '_') {
$newReplacement = '_';
} else {
$newReplacement = 'a';
}
$this->replacements[] = $newReplacement;
}
}
据我所知,$ newReplacement应该始终是一个字符串,而不是一个数组。这是因为它最终从该函数返回的数组的第一个元素中获取其值:
function splitFilenameAndExt($filename){
$parts = explode('.',$filename);
$ext = $parts[count($parts)-1];
unset($parts[count($parts)-1]);
$filename = implode('.',$parts);
return array($filename,$ext);
}
所以if()语句对我没有意义。它似乎试图抓住一个永远不会发生的情况。或者我错了,那部分代码确实有用吗?
答案 0 :(得分:1)
好吧,我无法解释为什么会这样做的实际原因,但是当你在字符串值上使用特定索引时,你正在访问字符串的特定字符。也就是说,它检查文件名是否有第二个字符,然后用'_'或'a'替换。如果文件名只有一个字符长,则用“_”或“a”替换整个文件。
如果你愿意的话,我可以更详细地解释一下这个功能是做什么的,但我对它想要完成的事情并没有任何理解。
答案 1 :(得分:0)
Chad Birch已经回答了我的问题(我最初的困惑是因为不理解 $ var [n] 可以用来找到一个n th 字符。字符串。),但是为了防止其他人想知道,这里是对这些函数试图完成的解释:
MeioUpload是CakePHP的文件/图片上传行为。使用它,您可以将模型中的任何字段设置为上载字段,如下所示:
var $actsAs = array(
'MeioUpload' => array(
'picture' => array(
'dir' => 'img{DS}{model}{DS}{field}',
'create_directory' => true,
'allowed_mime' => array('image/jpeg', 'image/pjpeg', 'image/png'),
'allowed_ext' => array('.jpg', '.jpeg', '.png'),
'thumbsizes' => array(
'normal' => array('width'=>180, 'height'=>180),
'small' => array('width'=>72, 'height'=>72)
),
'default' => 'default.png'
)
)
);
在上面的示例中,MeioUpload会将名为“picture”的字段视为上传字段。此模型恰好命名为“产品”,因此上传目录将为“ / img / product / picture / ”。上述配置还指定应生成2个缩略图。因此,如果我要上传名为“ foo.png ”的图像,则以下文件将保存在服务器上:
/img/product/picture/foo.png /img/product/picture/thumb.foo.png * /img/product/picture/thumb.small.foo.png
* - 标记为“普通”的拇指标记没有将其密钥附加到其文件名
此外,默认图像也存储在同一目录中:
/img/product/picture/default.png /img/product/picture/thumb.default.png /img/product/picture/thumb.small.default.png
但是,由于我们不希望用户上传的图像,默认图像或自动生成的缩略图互相覆盖,因此作者创建了以下一对数组:
var $patterns = array(
"thumb",
"default"
);
var $replacements = array(
"t_umb",
"d_fault"
);
用于在保存上传文件时防止文件名冲突:
$filename = str_replace($this->patterns,$this->replacements,$filename);
_includeDefaultReplacement()用于在默认图像被命名为其他内容时添加新的保留字。