Sử dụng hàm gán giá trị trong PHP và nhu cầu thực tế

Ví dụ về đoạn mã PHP sau:

<?php
class Website {
  /* Biến thành viên */
  var $link;
  var $ten;

  /* Hàm thành viên */
  function setLink($thamso){
     $this->link = $thamso;
  }
  
  function getLink(){
     echo $this->link . PHP_EOL;
  }
  
  function setTen($thamso){
     $this->ten = $thamso;
  }
  
  function getTen(){
     echo $this->ten . PHP_EOL;
  }
}
?>

Đoạn mã này thể hiện cơ bản cấu trúc lập trình hướng đối tượng, với biến thành viên và hàm thành viên. Có thể thấy các hàm setLink() và setTen() đảm nhận nhiệm vụ gán giá trị cho $link và $ten. Tuy nhiên điều này thay đổi khi gặp trường hợp mã hóa ngược (unserialize).

<?php
$obj = new LopA('a','b');
$duLieu = serialize($obj);

Trong ví dụ này, lớp LopA được khởi tạo trực tiếp với hai chuỗi 'a' và 'b' làm tham số. Điều này khiến ta đặt câu hỏi: tại sao lại cần sử dụng các hàm gán giá trị khi có thể truyền tham số ngay lúc khởi tạo? Việc này dường như thừa thãi. Tuy nhiên, trải nghiệm lập trình cho thấy có những trường hợp bắt buộc phải dùng đến các hàm gán giá trị.

<?php

// Cấu hình upload
$mangLoai = array("gif", "png", "jpg");
$kichThuoc = 2000000;
$duongDan = "./uploads/";

// Kiểm tra trạng thái upload
if($_FILES['file']['error'] > 0) {
    echo 'Lỗi upload:';
    switch ($_FILES['file']['error']) {
        case 1:
            die('Kích thước file vượt quá giới hạn cấu hình upload_max_filesize');
        case 2:
            die('Kích thước file vượt quá giới hạn trong form max_file_size');
        case 3:
            die('File chỉ được tải lên một phần');
        case 4:
            die('Không có file nào được tải lên');
        default:
            die('Lỗi không xác định');
    }
} 

// Xác định đuôi file
$duoi = end(explode(".", $_FILES['file']['name']));

// Kiểm tra định dạng
if(!in_array($duoi, $mangLoai)) {
    die("Định dạng {$duoi} không được phép!");
}

// Kiểm tra kích thước
if($_FILES['file']['size'] > $kichThuoc) {
    die("Kích thước vượt quá giới hạn: {$kichThuoc}");
}

// Tên file
$tenFile = date("YmdHis").rand(100,999).".".$duoi;

// Kiểm tra tính hợp lệ của file
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
    if (!move_uploaded_file($_FILES['file']['tmp_name'], $duongDan.'/'.$tenFile)) {
        die('Không thể di chuyển file sang thư mục đích.');
    }
}else{
    die("File {$_FILES['file']['name']} không hợp lệ: ");
}

// Mã hóa ngược lớp
$doiTuong = new LopTaoAnh($duongDan.'/'.$tenFile,NULL,$_POST['x'],$_POST['y']);
$duLieuMãHóa = serialize($doiTuong);
$tệpMãHóa = fopen('./ghi.txt', 'a+') or die('Không thể mở tệp');
fwrite ($tệpMãHóa, $duLieuMãHóa.'\n');
fclose ($tệpMãHóa);

Đoạn mã này xử lý chức năng quản trị viên tải ảnh nền và thiết lập vị trí mã QR. Trong trường hợp URL chưa biết, giá trị NULL được truyền vào tham số thứ hai.

$doiTuong = new LopTaoAnh($duongDan.'/'.$tenFile,NULL,$_POST['x'],$_POST['y']);

Khi tiến hành giải mã ngược, không thể thay đổi các tham số ban đầu đã truyền vào. Phải thông qua các hàm gán giá trị trong lớp để cập nhật biến. Điều này yêu cầu đặt các hàm gán trong phương thức __construct.

Thẻ: php unserialize Lập trình hướng đối tượng Bảo mật ứng dụng

Đăng vào ngày 3 tháng 10 lúc 22:05