>  기사  >  백엔드 개발  >  thinkphp3.2.3 버전의 Upload 클래스에 대한 질문이 있으신가요?

thinkphp3.2.3 버전의 Upload 클래스에 대한 질문이 있으신가요?

WBOY
WBOY원래의
2016-08-04 09:22:051123검색

<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>

이 클래스는 초기화 중에 이 배열 속성에 모든 구성을 넣지만 공식 문서를 읽을 때 다음과 같은 클래스 속성을 호출하여 이러한 구성을 설정할 수 있습니다.

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

    </code>

이것을 보면 이해가 되지 않습니다. 이 maxSize는 논리적으로 말하면 $upload->config['maxSize']와 같이 할당되어야 합니다. 속성으로 직접? ?

답글 내용:

<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>

이 클래스는 초기화 중에 이 배열 속성에 모든 구성을 넣지만 공식 문서를 읽을 때 다음과 같은 클래스 속성을 호출하여 이러한 구성을 설정할 수 있습니다.

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

    </code>

이것을 보면 이해가 되지 않습니다. 이 maxSize는 논리적으로 말하면 $upload->config['maxSize']와 같이 할당되어야 합니다. 속성으로 직접? ?

액세스할 수 없는 속성에 값을 할당할 때 마법 메서드 __set(), __set()가 호출됩니다.

클래스의 __set() 메소드를 보세요...

<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>

보세요, 이 두 가지 매직 메소드는 클래스 속성의 액세스와 연산을 다시 구현합니다.
이렇게 하면 클래스 속성 $config가 배열인 것처럼 보이지만 실제로는 배열의 클래스 속성 $config가 type은 이 두 가지 매직 메소드를 통해 사용할 수 있습니다. 각 요소는 클래스 속성 이름인 KEY와 클래스 속성 값인 VALUE를 사용하여 직접 작동됩니다.

이 두 가지 매직 메서드를 다시 작성하지 않고 다른 방식으로 작성하면 한눈에 알 수 있습니다.

<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>

이것은 $driverConfig 클래스 속성의 특수성과도 관련이 있으며 이에 대해서는 별도로 논의됩니다. 귀하의 질문 범위를 벗어나기 때문입니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.