私は数年前からPHPを扱ってきましたが、これまで明示的にシリアライズを扱う必要はなく、$_SESSION
しか使用していませんでした。今私は、特定のデータに対してシリアル化メカニズムを手動で実装する必要があるプロジェクトがあります。この問題は$_SESSION
にも当てはまると認識しています。PHPクラスの "Transient"プロパティ?
私はいくつかのプロパティを含むクラスを持っています。しかし、クラスにはいくつかのプロパティが含まれています。これらのプロパティには、大規模な配列が含まれている可能性があります(例:データベーステーブルのダンプ全体:100,000行、それぞれ100個のフィールド)。これが起こると、これはシリアライズ/デシリアライズする必要のあるクラスの1つです。大規模な配列を含むプロパティは、本質的に一時的な作業であり、必要に応じて再構築されるため、シリアル化する必要はありません。
Javaのこのような状況では、単にプロパティーをと宣言します。これはserialisaionから省略されます。残念ながら、PHPはそのような修飾子をサポートしていません。私はserialize
方法私は別の過渡プロパティを追加するたびに更新する必要があるだろうとして、
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;
}
}
}
は、しかし、これはかなり厄介です:に対処する
一つの方法は、それがこのようなものを持っていることです。また、継承が始まると、一時的なプロパティはサブクラスと親の両方にある可能性があるため、これはさらに複雑になります。私は知っている、それはまだ実行可能ですが、私は車輪を再発明するのではなく、可能な限り言語に委任することを好むでしょう。
したがって、一時的なプロパティを処理する最も良い方法は何ですか?それとも、PHPがこれをサポートしていますか?
'__sleep'は親クラスのプライベートプロパティでは機能しません。したがって、継承が関与していない限り、唯一役に立ちます。 –
@AleksGha!私は解決策を持っている!見てください:) – Vyktor
ありがとう、それは実行可能なアプローチのように見えます。どのように動作するかを見るためにもう少し実験します。 –