一、文件上传功能的实现:
(一)、准备工作,对php.ini文件进行设置
* 1、file_uploads = on 开启文件上传功能
*2、max_file_uploads 大致意思为:一个表单最多只能上传多少个附件
* 3、upload_tmp_dir 设置临时目录
* 4、upload_max_filesize 设置上传文件的最大大小
* (二)、$_FILES函数 和 move_uploaded_file() 函数
* 1、$_FILES函数:当客户端提交后,我们获得了一个$_FILES 数组,
* $_FILES数组内容如下:
* $_FILES['myFile']['name'] 客户端文件的原名称。
* $_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
* $_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
* $_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
* $_FILES['myFile']['error'] 和该文件上传相关的错误代码。
* 2、move_uploaded_file() 函数:将上传的文件移动到新位置,若成功,则返回 true,否则返回 false。
* 语法:move_uploaded_file(file,newloc) :file,必需,规定要移动的文件。newloc,必需,规定文件的新位置。
代码如下:
<?php /** * 文件上传 */ error_reporting(E_ALL ^ E_NOTICE); //不显示notice信息 //第一步:上传文件 if ($_SERVER['REQUEST_METHOD'] == 'POST'){ //检查一下文件是否要上传 if (isset($_FILES['upload'])) { //设置允许上传的文件类型 $allowed = ['image/jpeg','image/JPG','image/X-PNG','image/PNG','image/x-png','image/gif']; //检查要上传的文件,在不在这个列表中 if (in_array($_FILES['upload']['type'],$allowed)){ //将文件存入到临时文件夹中,并进行判断 $tmpFile = $_FILES['upload']['tmp_name']; if (move_uploaded_file($tmpFile,__DIR__.'/uploads'.$_FILES['upload']['name'])){ echo '<h3>上传成功</h3>'; }else{ echo '<h3>上传失败</h3>'; } } } } //第二步:输出错误信息 //检测上传过程中的错误,$_FIFLES['upload']['error'] == 0 ,没有错误,只要大于0则输出错误信息 if ($_FILES['upload']['error'] > 0){ switch ($_FILES['upload']['error']){ case 1: print '文件超过了php.ini规定的大小'; break; case 2: print '文件超过了表单规定的大小'; break; case 3: print '文件只上传了一部分'; break; default: print '文件只上传了一部分'; break; } } //第三步:删除临时文件 if (file_exists($tmpFile) && is_file($tmpFile)){ unlink($tmpFile); } ?> <!--1、form标签必须设置:enctype="multipart/form-data",固定写法。--> <!--2、input的类型必须是file,并且推荐前面添加隐藏域,设置一下允许上传的文件大小。--> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h3>文件上传</h3> <form action="" method="post" enctype="multipart/form-data"> <!-- 添加一个隐藏域,限制文件大小--> <div><input type="hidden" name="MAX_FILE_SIZE" value="100000"></div> <div><input type="file" name="upload"></div> <div><input type="submit" value="上传"></div> </form> </body> </html>
二、单例模式
单例模式确保某一个类只有一个实例,单例类不能在其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,不能被克隆,而是会向单例类内部存储的实例返回一个引用。
单例模式至少拥有以下三种公共元素:
1. 它们必须拥有一个私有的构造函数:private function __construct(){}
2. 它们拥有一个保存类的实例的静态成员变量,如:private static $instance
3. 它们拥有一个访问这个实例的公共的静态方法,如:public static function getInstance(){}
代码如下:
<?php /** * 单例模式:一个类只允许实例化一次 */ class Demo { private static $instance = null; //创建一个私有静态属性,用于在创建实例和类外调用 //把构造方法私有化 private function __construct() { } //禁止克隆 private function __clone() { // TODO: Implement __clone() method. } //生成当前类的唯一实例 public static function getInstance() { //判断当前的$instance 是不是当前类的实例,如果不是,则new一个实例 if (!self::$instance instanceof self) { self::$instance = new self(); } //如果是当前类的实例,则返回当前类的instance实例 return self::$instance; } } $obj1 = Demo::getInstance(); $obj2 = Demo::getInstance(); $obj3 = Demo::getInstance(); $obj4 = Demo::getInstance(); $obj5 = Demo::getInstance(); echo '<pre>'; var_dump($obj1,$obj2,$obj3,$obj4,$obj5);
执行结果如下图: