Ich bin damit einverstanden, dass dies um jeden Preis vermieden werden sollte, aber es gibt einige Fälle, in denen es nützlich sein könnte.
In den meisten Fällen wird Ihr Code nur unlesbar und nicht verwaltbar.
Glauben Sie mir, ich bin diesen Weg gegangen.
Hier ist ein Beispiel mit einem Anwendungsszenario, in dem es möglicherweise noch praktikabel ist.
Ich erweitere die Dateiklasse von CakePHP 3.0 als meine Standardklasse für die Dateiverwaltung.
Ich wollte einen statischen Mime-Guesser einsetzen.
In einigen Fällen habe ich einen Dateinamen anstelle einer tatsächlichen Datei, und in diesem Fall müssen einige Annahmen getroffen werden. (Wenn die Datei vorhanden ist, versuchen Sie, die MIME daraus abzurufen. Andernfalls verwenden Sie die Erweiterung des angegebenen Dateinamens.)
In anderen Fällen sollte die Standardmethode mime () funktionieren, wenn ich ein Objekt tatsächlich instanziiert habe. Wenn dies jedoch fehlschlägt, muss der Dateiname aus dem Objekt extrahiert und stattdessen die statische Methode aufgerufen werden.
Um Verwirrung zu vermeiden, war es mein Ziel, den MIME-Typ durch Aufrufen derselben Methode zu ermitteln:
Statisch:
NS\File::type('path/to/file.txt')
Als Objekt
$f = new NS\File('path/to/file.txt');
$f->type();
Hier ist mein Beispiel für eine erweiterte Klasse:
<?php
namespace NS;
class File extends \Cake\Utility\File
{
public function __call($method, $args) {
return call_user_func_array([get_called_class(), 'obj'.ucfirst($method)], $args);
}
public static function __callStatic($method, $args) {
return call_user_func_array([get_called_class(), 'static'.ucfirst($method)], $args);
}
public function objType($filename=null){
$mime = false;
if(!$filename){
$mime = $this->mime();
$filename = $this->path;
}
if(!$mime){
$mime = static::getMime($filename);
}
return $mime;
}
public static function staticType($filename=null){
return static::getMime($filename);
}
public static function getMime($filename = null)
{
$mimes = [
'txt' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'php' => 'text/html',
'ctp' => 'text/html',
'twig' => 'text/html',
'css' => 'text/css',
'js' => 'application/javascript',
'json' => 'application/json',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
'png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
];
$e = explode('.', $filename);
$ext = strtolower(array_pop($e));
if (array_key_exists($ext, $mimes)) {
$mime = $mimes[$ext];
} elseif (function_exists('finfo_open') && is_file($filename)) {
$finfo = finfo_open(FILEINFO_MIME);
$mime = finfo_file($finfo, $filename);
finfo_close($finfo);
} else {
$mime = 'application/octet-stream';
}
return $mime;
}
}