こんばんは。本を読みながらPHPの勉強をしている者です。
今オブジェクトの章をやっているんですが、オブジェクトのシリアライズの説明があったので、そこでシリアライズの説明が軽くあったのですが、いまひとつ理解できません。サンプルコードが載っていたのでまる写しし、コードが動かなかったので一部訂正して動くようにして、あらためて動作を確認しても何をしているのかよくわかりませんでした。
以下がそのサンプルコードです。
//Log.inc
<?php
class Log {
var $filename;
var $fp;
function Log($filename){
$this->filename=$filename;
$this->open();
}
function open(){
$this->fp=fopen($this->filename,"a") or die("{$this->filename}を開けません。");
}
function write($note){
fwrite($this->fp,"$note\n");
}
function read(){
return join('',file($this->filename));
}
function __wakeup(){
$this->open();
}
function __sleep(){
fclose($this->fp);
return array('filename');
}
}
?>
//front.php
<?php
include_once('Log.inc');
session_start();
extract($_SESSION);
?>
<html><head><title>フロントページ</title></head>
<body>
<?php
$now=strftime("%c");
if(!session_is_registered('l')){
$l=new Log("/tmp/persistent_log");
session_register('l');
$l->write("作成時刻 $now");
echo ("<p>セッションおよびログオブジェクトを作成しました。</p>");
}
$l->write("最初のページの読み込み時刻 $now");
echo "<p>ログの内容</p>";
echo nl2br($l->read());
?>
<a href="next.php">次のページへ</a>
</body>
</html>
//next.php
<?php
include_once('Log.inc');
session_start();
extract($_SESSION);
?>
<html><head><title>次のページ</title></head>
<body>
<?php
$now=strftime("%c");
$l->write("2ページ目の表示時刻 $now");
echo "<p>ログの内容</p>";
echo nl2br($l->read());
?>
</body>
</html>
このサンプルコードはたぶん、front.phpで宣言した$lが、セッション情報により保たれ、改めてnext.phpで$l=new Log(‘ファイルパス’)のように書かなくてもよい、ということを教えるためのものだと解釈しました。わからなかったのは__wakeup()メソッドと__sleep()メソッドのところなんですが、シリアライズするする直前と直後に呼び出すものだと本には書かれていましたが、呼び出し元もありませんし、勝手にタイミングを計って呼び出されるのなら、そのタイミングはどこでわかるのでしょうか?
function __wakeup(){
$this->open();
}
でいうと、$this->open();が__wakeup()メソッドを呼び出すタイミングなのでしょうか?これならなんとなくつじつまが合いますが…
また
function __sleep(){
fclose($this->fp);
return array('filename');
}
の、return array('filename')とはどこに対してプロパティの配列を返しているのでしょうか?本には「この関数の返り値は、バイトストリームに書き出す必要のあるメンバー名の配列です」と書いてありますが、「書き出す必要」は何を基準にしているのかもよくわかりません。
/tmp/persistent_logにバイトストリームを書き出すから、array('filename')になっているのですか?
また、persistent_logをテキストエディタで開いたら、内容は単なるログファイルの内容ですが、本には「永続オブジェクト$l」と書かれています。目に見えませんが、persistent_logの中にはオブジェクトも埋め込まれている(つまりただfopen()とfwrite()とfclose()の作業だけだと本当にただのログファイルですが、__wakeup()や__sleep()やセッションによってシリアライズされたオブジェクトの中にfopen()やfwrite()やfclose()を混ぜることによってログファイル兼オブジェクトになっていると)いう事ですか?
よくわからなくて自分なりに推測したことを書いたので、質問の意味がわかりづらいかもしれませんが、どなたか教えていただけませんか。
No.1ベストアンサー
- 回答日時:
シリアライズとは、PHPの値を型などの情報も含めて、文字で表現することです。
たとえば、
echo serialize("abcdefg");
を実行すると、
s:7:"abcdefg";
となります。
s は文字列、7は長さ、そして内容になっています。
もっと、複雑な構造もシリアライズできます。
たとえば、
echo serialize(array(1, 2, array('abc', 'def')));
a:3:{i:0;i:1;i:1;i:2;i:2;a:2:{i:0;s:3:"abc";i:1;s:3:"def";}}
オブジェクトも、シリアライズできます。
アンシリアライズは、この文字表現から値を復元します。
で、セッションですが、セッション情報はシリアライズされて、サーバー側に保存されます。
セッションからの取出しには、アンシリアライズが行われます。
このときに __wakeup, __sleepが呼ばれます。
つまり、extractで、セッションから取り出されるときに、__wakeupが呼ばれ、ログファイルをオープンします。
__sleepは、オブジェクトの中で、シリアライズの対象としたいものだけを、配列で返します。複雑で、プロパティの多いオブジェクトの場合には、これは有効です。
ここでは、ファイル名だけをシリアライズするように設定していますね。
参考URL:http://search.net-newbie.com/php/language.oop5.m …
返事が遅れましてすいません。ご丁寧な解説を頂いたにもかかわらずまだ完全には理解できませんが、それでも少し進歩できました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php ログイン 1 2022/11/01 00:24
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP session_destroyとsession...
-
PHPの引数を含んだURLについて
-
セッションが変数が取得できません
-
PHPからリアルタイムにデータを...
-
セッションのクッキー有効期間...
-
phpでのログアウトについて
-
onedrive にexcelファイルをア...
-
PHP8を使うと、大量のWarningが...
-
phpでget_headers()が使えない?
-
PHPのif文でその処理を途中で抜...
-
Apacheでhttp://localhost/が表...
-
バッチを用いたフォルダの自動移動
-
フォルダーに入った画像名の取...
-
Struts2 ファイルアップロード
-
cakephpのサブタイトルはどこで...
-
初心者で数当てゲームを作って...
-
送信日時を指定してメールを送...
-
openCVの超解像処理
-
FTPClientで転送結果(OKかFAIL)
-
.htaccessにphp_valueが使用できな
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
$_SESSION 有効期限をブラウザ...
-
PHP session_destroyとsession...
-
セッションのクッキー有効期間...
-
さくらサーバーでsessionが使え...
-
jqueryの$.ajaxでPHPに値を渡し...
-
session_start();について
-
IE11でページ遷移時にセッショ...
-
fsockopenを使った証明書付きの...
-
session_set_save_handler の実...
-
リロード・ページビューの判定
-
PHPのセッション変数 絞り込み...
-
セッションの利用
-
PHPからリアルタイムにデータを...
-
セッションが変数が取得できません
-
ブラウザの戻る ページ遷移PHP...
-
DoCoMo FOMAでセッション管理が...
-
phpのセッションについて
-
PHP4.3.9+smartyのsessionについて
-
ログインしたページで、ある処...
-
onedrive にexcelファイルをア...
おすすめ情報