标签:echo 二维 写代码 字节 面对对象 error close site case
拿一段PHP代码来说
<?php class Site { /* 成员变量 */ var $url; var $title; /* 成员函数 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url . PHP_EOL; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . PHP_EOL; } } ?>
这一段代码是比较基础的面对对象代码,成员变量和成员函数,我们可以看到成员函数中setUrl()和setTitle()分别负责的是给$url和$title进行赋值,这一切都没有什么问题,直到今天看到一段反序列化代码
<?php $x = new aclass(‘a‘,‘b‘); $vx = serialize($x);
代码实例化了aclass类,直接把字符串 a 和 b 作为参数传入了类中....就突然想,既然可以直接在类实例化的时候赋值,为什么一定要用赋值函数呢?岂不是多此一举了么?一直不解,就接着写代码,没写多久就发现了其实有这种需求
<?php //上传文件配置 $allowtype = array("gif", "png", "jpg"); $size = 2000000; $path = "./uploads/"; //判断文件是否上传到服务器 if($_FILES[‘myfile‘][‘error‘] > 0) { echo ‘上传错误:‘; switch ($_FILES[‘myfile‘][‘error‘]) { case 1: die(‘上传文件大小超出了PHP配置文件中约定值: upload_max_filesize‘); case 2: die(‘上传文件大小超出了表单中的约定值:max_file_size‘); case 3: die(‘文件只被部分上载‘); case 4: die(‘没有上传任何文件‘); default: die(‘未知错误‘); } } //获取文件后缀名 $hz = array_pop(explode(".", $_FILES[‘myfile‘][‘name‘])); //匹配后缀名 if(!in_array($hz, $allowtype)) { die("这个文件类型{$hz}不允许!"); } //文件大小判断 if($_FILES[‘myfile‘][‘size‘] > $size) { die("超过了允许的字节大小:{$size}"); } //文件名 $filename = date("YmdHis").rand(100,999).".".$hz; //判断是否为上传文件 if (is_uploaded_file($_FILES[‘myfile‘][‘tmp_name‘])) { if (!move_uploaded_file($_FILES[‘myfile‘][‘tmp_name‘], $path.‘/‘.$filename)) { die(‘问题:不能将文件移动到指定目录。‘); } }else{ die("问题:上传文件{$_FILES[‘myfile‘][‘name‘]}不是一个合法文件: "); } //序列化引用类 $v = new getImgnewcode($path.‘/‘.$filename,NULL,$_FILES[‘x‘],$_FILES[‘y‘]); $sv = serialize($v); $svWrite = fopen(‘./post.txt‘, ‘a+‘) or die(‘打开文件失败‘); fwrite ($svWrite, $sv.‘\n‘); fclose ($svWrite);
这是某个后台的片段代码,功能是管理员上传一张海报,然后设定好二维码的位置,在前台用户通过输入网址生成的二维码图片通过getImgnewcode类进行海报的合成。但是在这种情况下,用户的URL还为未知数,所以我提前传入的值为NULL
$v = new getImgnewcode($path.‘/‘.$filename,NULL,$_FILES[‘x‘],$_FILES[‘y‘]);
等到反序列化以后,我们就不可以修改实例化类的时候直接带入的参数了,必须通过类中定义的赋值函数来完成变量的重新赋值
标签:echo 二维 写代码 字节 面对对象 error close site case
原文地址:https://www.cnblogs.com/xsseng/p/9557764.html