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,$_POST['x'],$_POST['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,$_POST['x'],$_POST['y']);

等到反序列化以后,我們就不可以修改實例化類的時候直接帶入的參數了,必須通過類中定義的賦值函數來完成變量的重新賦值,不過這得把賦值函數寫在構造函數中__construct

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM