PHP赋值函数的利用需求

拿一段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']);

等到反序列化以后,我们就不可以修改实例化类的时候直接带入的参数了,必须通过类中定义的赋值函数来完成变量的重新赋值

猜你喜欢

转载自www.cnblogs.com/xsseng/p/9557764.html
今日推荐