Zgadzam się, że należy unikać za wszelką cenę, ale są pewne przypadki, w których może to być przydatne.
W większości przypadków spowoduje to, że twój kod stanie się nieczytelny i nie będzie można nim zarządzać.
Uwierz mi, byłem na tej ścieżce.
Oto przykład scenariusza użycia, w którym może być nadal praktyczny.
Rozszerzam klasę pliku CakePHP 3.0 jako moją domyślną klasę obsługi plików.
Chciałem umieścić nieruchomy typ mime.
W niektórych przypadkach mam nazwę pliku zamiast rzeczywistego pliku, a niektóre założenia muszą być wykonane w tym przypadku.(jeśli plik istnieje, spróbuj uzyskać mim od niego, użyj rozszerzonej nazwy pliku)
Innym razem, gdy faktycznie zainicjowałem obiekt, domyślna metoda mime() powinna działać, ale jeśli się nie powiedzie, nazwa pliku musi zostać wyodrębniona z obiektu, a zamiast tego powinna zostać wywołana metoda statyczna.
Aby uniknąć nieporozumień moim celem było uzyskać typ MIME przez wywołanie tej samej metody:
Static:
NS\File::type('path/to/file.txt')
jako przedmiot
$f = new NS\File('path/to/file.txt');
$f->type();
Oto mój przykład rozszerzona klasa:
<?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',
// images
'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',
// archives
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',
// audio/video
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
// ms office
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
// open office
'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;
}
}
Dlaczego chcesz to zrobić, jeśli mogę zapytać? – PeeHaa
[może statycznych członków użyć niestatycznych członków i na odwrót?] (Http://stackoverflow.com/questions/2204128/could-static-members-use-nonstatic-members-and-vice-versa) –
Odpowiedź brzmi nie btw , ale jestem naprawdę ciekawy, dlaczego myślisz, że chcesz to zrobić. – PeeHaa