<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只是config數組屬性裡的一個下標按理說應該$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只是config數組屬性裡的一個下標按理說應該$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內每一個元素當作以各自的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類屬性的特殊性,這個另說了。因該不在你的問題討論範圍。