Heim >Backend-Entwicklung >PHP-Tutorial >Eine Frage zur Upload-Klasse in der Version thinkphp3.2.3?

Eine Frage zur Upload-Klasse in der Version thinkphp3.2.3?

WBOY
WBOYOriginal
2016-08-04 09:22:051135Durchsuche

<code>private $config = array(
        'mimes'         =>  array(), //允许上传的文件MiMe类型
        'maxSize'       =>  0, //上传的文件大小限制 (0-不做限制)
        'exts'          =>  array(), //允许上传的文件后缀
        'autoSub'       =>  true, //自动子目录保存文件
        'subName'       =>  array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
        'rootPath'      =>  './Uploads/', //保存根路径
        'savePath'      =>  '', //保存路径
        'saveName'      =>  array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
        'saveExt'       =>  '', //文件保存后缀,空则使用原后缀
        'replace'       =>  false, //存在同名是否覆盖
        'hash'          =>  true, //是否生成hash编码
        'callback'      =>  false, //检测文件是否存在回调,如果存在返回文件信息数组
        'driver'        =>  '', // 文件上传驱动
        'driverConfig'  =>  array(), // 上传驱动配置
    );
     public function __construct($config = array(), $driver = '', $driverConfig = null){
        /* 获取配置 */
        $this->config   =   array_merge($this->config, $config);
        
     }</code>

Diese Klasse fügt während der Initialisierung alle Konfigurationen in dieses Array-Attribut ein, aber wenn ich die offizielle Dokumentation lese, kann ich diese Konfigurationen festlegen, indem ich Klassenattribute aufrufe, wie zum Beispiel:

<code>$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize   =     3145728 ;// 设置附件上传大小

    </code>

Ich verstehe nicht, wenn ich das sehe. Dieses maxSize ist nur ein Index im Config-Array-Attribut. Logischerweise sollte es wie $upload->config['maxSize'] zugewiesen werden direkt als Attribut? ?

Antwortinhalt:

<code>private $config = array(
        'mimes'         =>  array(), //允许上传的文件MiMe类型
        'maxSize'       =>  0, //上传的文件大小限制 (0-不做限制)
        'exts'          =>  array(), //允许上传的文件后缀
        'autoSub'       =>  true, //自动子目录保存文件
        'subName'       =>  array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
        'rootPath'      =>  './Uploads/', //保存根路径
        'savePath'      =>  '', //保存路径
        'saveName'      =>  array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
        'saveExt'       =>  '', //文件保存后缀,空则使用原后缀
        'replace'       =>  false, //存在同名是否覆盖
        'hash'          =>  true, //是否生成hash编码
        'callback'      =>  false, //检测文件是否存在回调,如果存在返回文件信息数组
        'driver'        =>  '', // 文件上传驱动
        'driverConfig'  =>  array(), // 上传驱动配置
    );
     public function __construct($config = array(), $driver = '', $driverConfig = null){
        /* 获取配置 */
        $this->config   =   array_merge($this->config, $config);
        
     }</code>

Diese Klasse fügt während der Initialisierung alle Konfigurationen in dieses Array-Attribut ein, aber wenn ich die offizielle Dokumentation lese, kann ich diese Konfigurationen festlegen, indem ich Klassenattribute aufrufe, wie zum Beispiel:

<code>$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize   =     3145728 ;// 设置附件上传大小

    </code>

Ich verstehe nicht, wenn ich das sehe. Dieses maxSize ist nur ein Index im Config-Array-Attribut. Logischerweise sollte es wie $upload->config['maxSize'] zugewiesen werden direkt als Attribut? ?

Die magischen Methoden __set(), __set() werden aufgerufen, wenn unzugänglichen Eigenschaften Werte zugewiesen werden.

Sehen Sie sich die __set()-Methode in der Klasse an...

<code>/**
 * 使用 $this->name 获取配置
 * @param  string $name 配置名称
 * @return multitype    配置值
 */
public function __get($name)
{
    return $this->config[$name];
}

public function __set($name, $value)
{
    if (isset($this->config[$name])) {
        $this->config[$name] = $value;
        if ('driverConfig' == $name) {
            //改变驱动配置后重置上传驱动
            //注意:必须选改变驱动然后再改变驱动配置
            $this->setDriver();
        }
    }
}</code>

Sehen Sie, diese beiden magischen Methoden implementieren den Zugriff und die Operation von Klassenattributen neu.
Auf diese Weise scheint das Klassenattribut $config ein Array zu sein, aber tatsächlich ist das Klassenattribut $config ein Array Der Typ kann über diese beiden magischen Methoden verwendet werden, wobei sein KEY als Klassenattributname und VALUE als Klassenattributwert verwendet werden.

Wenn Sie diese beiden magischen Methoden nicht umschreiben, ist es möglicherweise auf einen Blick klar, wenn Sie es anders schreiben:

<code>/**
 * 默认上传配置
 * @var array
 */
$mimes = array(); //允许上传的文件MiMe类型
$maxSize = 0; //上传的文件大小限制 (0-不做限制)
$exts = array(); //允许上传的文件后缀
$autoSub = true; //自动子目录保存文件
$subName = array('date', 'Y-m-d'); //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
$rootPath = './Uploads/'; //保存根路径
$savePath = ''; //保存路径
$saveName = array('uniqid', ''); //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
$saveExt = ''; //文件保存后缀,空则使用原后缀
$replace = false; //存在同名是否覆盖
$hash = true; //是否生成hash编码
$callback = false; //检测文件是否存在回调,如果存在返回文件信息数组
$driver = ''; // 文件上传驱动
$driverConfig = array(); // 上传驱动配置</code>

Dazu gehört aber auch die Besonderheit des Klassenattributs $driverConfig, die an anderer Stelle besprochen wird. Weil es außerhalb des Rahmens Ihrer Frage liegt.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn