標籤:echo 二維 寫代碼 位元組 面對對象 error close site case
拿一段PHP代碼來說
<?phpclass 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‘]);
等到還原序列化以後,我們就不可以修改執行個體化類的時候直接帶入的參數了,必須通過類中定義的賦值函數來完成變數的重新賦值
PHP賦值函數的利用需求