拿一段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