Tôi đã làm việc với PHP vài năm nay, nhưng cho đến bây giờ chưa bao giờ cần phải xử lý tuần tự một cách rõ ràng, chỉ sử dụng $_SESSION
. Bây giờ tôi có một dự án yêu cầu tôi thực hiện thủ công cơ chế tuần tự hóa cho một số dữ liệu nhất định - và tôi nhận thấy rằng vấn đề cũng có thể áp dụng cho $_SESSION
.Thuộc tính "Tạm thời" trong lớp PHP?
Tôi có một lớp học có chứa một số thuộc tính. Hầu hết các thuộc tính này là nhỏ (như trong bộ nhớ tiêu thụ): số, chuỗi tương đối ngắn, vv Tuy nhiên, lớp này cũng chứa một số thuộc tính, có thể chứa các mảng HUGE (ví dụ: toàn bộ kết xuất của bảng cơ sở dữ liệu: 100.000 hàng với 100 trường). Khi nó xảy ra, đây là một trong các lớp cần được tuần tự hóa/deserialised - và, may mắn thay, các thuộc tính chứa các mảng lớn không cần phải được tuần tự hóa, vì chúng chủ yếu là các tác phẩm tạm thời và được xây dựng lại khi cần thiết.
Trong những trường hợp như vậy trong Java, tôi chỉ cần khai báo thuộc tính là transient
- và nó sẽ bị bỏ qua khỏi serialisaion. Thật không may, PHP không hỗ trợ các vòng loại như vậy.
Một cách để đối phó với nó là có một cái gì đó như thế này:
class A implements Serializable
{
private $var_small = 1234;
private $var_big = array(...); //huge array, of course, not init in this way
public function serialize()
{
$vars = get_object_vars($this);
unset($vars['var_big']);
return serialize($vars);
}
public function unserialize($data)
{
$vars = unserialize($data);
foreach ($vars as $var => $value) {
$this->$var = $value;
}
}
}
Tuy nhiên điều này là khá cồng kềnh, như tôi sẽ cần phải cập nhật serialize
phương pháp mỗi khi tôi thêm một bất động sản thoáng qua. Ngoài ra, một khi thừa kế được đưa vào chơi, điều này trở nên phức tạp hơn - để giải quyết, vì các thuộc tính tạm thời có thể nằm trong cả lớp con và cấp độ gốc. Tôi biết, nó vẫn có thể thực hiện được, tuy nhiên tôi muốn đại biểu càng nhiều càng tốt cho ngôn ngữ thay vì sáng tạo lại bánh xe.
Vì vậy, cách tốt nhất để giải quyết các thuộc tính tạm thời là gì? Hoặc tôi thiếu một cái gì đó và PHP hỗ trợ này ra khỏi hộp?
'__sleep' sẽ không hoạt động với các thuộc tính riêng tư trong lớp cha, vì vậy nó chỉ hữu ích miễn là thừa kế không liên quan. –
@AleksG ha! Tôi đã có giải pháp hoạt động! Hãy xem :) – Vyktor
Cảm ơn, nó trông giống như một cách tiếp cận khả thi. Tôi sẽ thử nghiệm nhiều hơn một chút với điều này để xem nó hoạt động như thế nào. –