元のリンク: http://hi.baidu.com/lostdays/blog/item/8d76c300ec4e3c15738b65fa.html
総合カタログ
何を、なぜ、どのよう
に
なぜ
PHP シリアル化構文の
仕組み
PHP シリアル化の例
JavaScript で JSON にシリアル化する — json2.js を使用する
JavaScript で JSON にシリアル化する — Prototype.js
PHP と JSON
json_decode 関数
を使用する
json_encode関数
json_decode 関数の例
json_encode 関数の例を
実践すると、真の
知識の背景説明
が得られます
フロントエンドJavaScript部分
バックエンドPHP部分
何を、なぜ、どのように わかり
まし
た、親愛なる皆さん、この新しい概念の旅を始めましょう。おそらく誰もがこれまでシリアル化というテーマにあまり注目したことがなかったでしょう。実際、それは私が何気なく PHP マニュアルをめくった日に始まりました。その後、暇になってWordPressのプラグインを作ってみたところ、ある場面では確かに便利であることが分かりました。
まずシリアル化について説明しましょう。簡単に言えば、シリアル化とは変数をバイト ストリームに変換するプロセスです。シリアル化の導入により、オブジェクトの保存と送信の問題が効果的に解決されます。たとえば、このオブジェクトをサーバー側のデータベースに保存するにはどうすればよいでしょうか。オブジェクトのことがよく使われます。 JavaScript のシリアル化では、JSON (JavaScript Object Notation) が軽量のデータ交換形式であることについて言及する必要があります。人間にとっては読み書きが簡単で、機械にとっては解析と生成が簡単です。これは、標準 ECMA-262 第 3 版 (1999 年 12 月) のサブセットである JavaScript プログラミング言語に基づいています。 JSON は完全に言語に依存しないテキスト形式を使用しますが、C 言語ファミリー (C、C++、C#、Java、JavaScript、Perl、Python など) に似た規則も使用します。これらの特性により、JSON は理想的なデータ交換言語になります。
通常、JSON と XML は比較されます。どちらもオブジェクトを平坦化する手段です (この「平坦化」については後で説明します)。一方、JSON はシンプルで読みやすいという特徴があります。このプログラムは、オブジェクトを次のコードのような文字ストリームの形式に簡単に変換できるため、
コード:
{"type":"human","name":"hanguofeng","age": 22 } は
オブジェクトを保存する JSON 式です。オブジェクトに復元するにはどうすればよいでしょうか。これは次のように非常に単純です。
コード:
var Animal_str = '{"type":"human","name":"hanguofeng","age":22}';
var Animal2=eval('(' + Animal_str + ')');
ここまでで、JavaScript の評価関数を使って JSON 式を操作し、値を返してオブジェクトを取得します。 JSON 形式の作成者の考え方に感心します。元々はシリアル化について話すつもりだったのですが、「うっかり」JSON について言及してしまい、話がそれてしまいました。いいえ、PHP シリアル化は JSON と非常に似ています。PHP シリアル化式は次のとおりです。
コード:
a:3:{s:4:"タイプ";s:5:"人間";s:4:"名前";s:10:"ハングオフェン";s:3:"年齢";s:2:" 20";}
その構造は JSON に似ています。実際、この式は次の配列のシリアル化された結果です。
コード:
$動物 =
配列
(
「タイプ」 => 「人間」、
"名前" => "ハングオフェン",
「年齢」 => 「20」
);
OK、上記の紹介は、シリアル化と JSON が何であるかを大まかに説明するためのものです。ここでコードをあまり複雑にする必要はありません。なぜそうすべきなのかについては後で説明します。シリアル化の変更を使用します。
理由
は、JavaScript でオブジェクトを作成したのですが、このオブジェクトをサーバー側のデータベースに保存するにはどうすればよいでしょうか。実際、これは「ブラウザからサーバーにオブジェクトをどのように送信するか」という問題ですが、この送信プロセス中に、実際に送信できるのは文字ストリームのみであることがわかっています。文字ストリームは 1 次元 (フラット) です。 、しかし、それは多次元です。転送されるオブジェクトが配列またはその他の構造体の場合、それを転送されたコンテンツとして直接使用できます。彼を説明するには文字を使う必要があります。たとえば、電話であなたの名前を尋ねると、張三または李四と答えるでしょう。また、私があなたに似ていると尋ねると、あなたは張三または李四と答えるでしょう。私たちがデータを送信する媒体は、多くの場合、文字ストリームのみを送信できるこの電話回線と同じであり、オブジェクトを記述するプロセスは実際にはシリアル化のプロセスであると説明されました。 。
さらに、シリアル化は、私と同じように、オブジェクトをデータベースの特定のフィールドに保存することを一度は考えたことがあるかもしれません。これを非常に簡単に行うことができ、データベース フィールドは必要ありません。特別な形式に設定するには、varchar に設定するだけです (もちろん、オブジェクトが大きい場合は、text に設定する必要があるかもしれません)。
PHP シリアル化構文の
仕組み さて
、「何を」と「なぜ」という質問は理解できたと思います。このセクションの最後では、より理論的なこと、つまり、PHP を使用してデータをシリアル化および逆シリアル化する方法、JavaScript をシリアル化する方法について説明します。オブジェクト (つまり、オブジェクトを JSON 形式に変更する) とそれらを逆シリアル化する方法、最後に、JSON と PHP シリアル化の間の関係を確立する方法。
PHP には、シリアル化および逆シリアル化操作用の 2 つの関数が用意されています。これらの 2 つの関数は、PHP4 および PHP5 に適しています。serialize
()
(PHP 4、PHP 5、PECL axis2) :0.1.0-0.1.1)
Serialize — 保存可能な表現値を取得する
string
Serialize (mixed $value )
保存可能な表現値を取得するこの関数は、PHP 変数の値と構造をロスレスに保存または転送するために使用されます。
シリアル化された値を PHP 変数に変換し直す必要がある場合は、unserialize() 関数を使用できます。
パラメータ
値
つまり、式はシリアル化されます。 serialize() はリソース ポインターを除くすべての型を処理し、それ自体を指す要素を含む配列をシリアル化することもできます。ループ ポインターを含むシリアル化した配列またはオブジェクトは引き続き保存されますが、他のポインターは失われます。
オブジェクトをシリアル化するとき、PHP は最初にそのメンバー関数 __sleep() を呼び出そうとします。これにより、オブジェクトがシリアル化される前の最終クリーンアップなどが可能になります。同様に、unserialize() 関数を使用してオブジェクトが復元されると、メンバー関数 __wakeup() が呼び出されます。
戻り値は、
どこにでも格納できるオブジェクトのバイト ストリーム表現を含む文字列を返します。
unserialize()
(PHP 4、PHP 5、PECL axis2:0.1.0-0.1.1)
格納された式から PHP 変数値
を取得する
mixed unserialize ( string $str )
unserialize() は、単純なタイプのシリアル化された変数を受け取り、それを PHP 変数値に変換して戻します。
パラメータ
str
シリアル化された文字列 逆シリアル化された変数がオブジェクトの場合、オブジェクトの構造が正常に復元された後、PHP はオブジェクトの __wakeup() メンバー関数 (存在する場合) を自動的に実行しようとします。
unserialize_callback_func ディレクティブ: 逆シリアル化中に未定義のクラスをインスタンス化する必要がある場合 (不完全なオブジェクト「__PHP_Incomplete_Class」の取得を避けるため)、このプロセス中に実行されるコールバック関数を設定できます。 php.ini、ini_set()、または .htaccess を使用して「unserialize_callback_func」を定義できます。未定義のクラスがインスタンス化されるときに呼び出されます。この機能を無効にするには、単に空に設定します。
戻り値は、
ブール変数、実数、浮動小数点数、文字列、配列、オブジェクトなどの変換された値を返します。
受信文字列を逆シリアル化できない場合は、FALSE が返され、NOTICE エラーがスローされます。
(上記は PHP マニュアルからの翻訳です)
PHP シリアル化インスタンス
配列のシリアル化と逆シリアル化
まず、sample1.php ファイルを作成してください。このファイル内で次のステートメントを使用します。配列:
コード:
<?php
$動物 =
配列
(
「タイプ」 => 「人間」、
"名前" => "ハングオフェン",
「年齢」 => 「20」
);
?>
この配列の値をテストするには、print_r() 関数を使用して配列を出力します。 出力結果は次のとおりです
。
配列
(
[タイプ] => 人間
[名前] => ハングオフェン
[年齢] => 20
)
次に、シリアル化しましょう。シリアル化コードは次のとおりです
。
<?php
$動物 =
配列
(
「タイプ」 => 「人間」、
"名前" => "ハングオフェン",
「年齢」 => 「20」
);
$animal_ser=シリアル化($animal);
エコー($animal_ser);
?>
ここでは、配列 $animal をシリアル化し、返されたシリアル化された文字列を変数 $animal_ser に保存し、出力します。 出力結果は
次のとおりです。
a:3:{s:4:"タイプ";s:5:"人間";s:4:"名前";s:10:"ハングオフェン";s:3:"年齢";s:2:" 20";}
この文字列を単純に解析してみましょう。
a:3 は、これが 3 つの組み込みオブジェクト (3) を持つ配列オブジェクト (a) であることを示します。
中括弧内の部分は、オブジェクト式のコンマ区切りのリストです。例として s:4:"type" を使用すると、長さが 4 桁 (4) で、値が "type" の文字列を表します。 、つまり、ハッシュ配列の最初の要素のキーです。
以下の部分では詳細には説明しません。さまざまなオブジェクトを自分でシリアル化して、シリアル化された文字列がどのように構築されるかを確認してください。
配列の逆シリアル化、つまり、上で生成したシリアル化された文字列を配列に復元することを見てみましょう。コードは次のとおりです
。
<?php
$animal_ser='a:3:{s:4:"タイプ";s:5:"人間";s:4:"名前";s:10:"ハングオフェン";s:3:"年齢";s :2:"20";}';
$animal = unserialize($animal_ser);
print_r($animal);
?>
1 行目では、$animal_ser の値が上記で取得したシリアル化された文字列であると仮定します。2 行目では、文字列が開始配列に復元され、$animal 配列が出力されます。 time 出力は、このセクションの冒頭にある元の配列出力と同じです。つまり、
コード:
配列
(
[タイプ] => 人間
[名前] => ハングオフェン
[年齢] => 20
)
このようにして、配列の逆シリアル化が完了しました。
知識を広げる - カスタム オブジェクトのシリアル化と逆シリアル化
配列のシリアル化は基本的な操作ですが、実際のプログラミングでは、カスタム オブジェクトがシリアル化されるなど、他の種類の変数をシリアル化することもよくあります。 .inc):
コード:
<?php
クラスA {
var $one = 1;
関数 show_one() {
$this->one をエコーします。
}
}
?>
クラスのインスタンスを作成し、次のコードでインスタンスをシリアル化します。
コード:
<?php
include("classa.inc");
$a=新しいA;
echo(シリアル化($a));
?>
このときの出力内容は
次のとおりです。
O:1:"A":1:{s:3:"1";i:1;}
全体として、このシリアル化された文字列はオブジェクトの現在の状態、つまり i の値が 1 を出力します。詳細を一つずつ分析してみましょう。 O:1: 現在の変数はカスタム オブジェクトであるため、特徴文字はオブジェクトを意味する「O」です。次の「A」は、変数がどのクラスのインスタンスであるかを識別します。ここではクラス A です。中括弧内は、インスタンスの各属性の名前と値です。次に、それを逆シリアル化します。
コード:
<?php
include("classa.inc");
$s = 'O:1:"A":1:{s:3:"one";i:1;}';
$a = アンシリアル化($s);
$a->show_one();
?>
このとき「1」が出力される、つまりクラスAのshow_one()メソッドが呼び出されます。インスタンスのシリアル化された文字列にはクラス メソッドが含まれていませんが、この機能は PHP4 以降でサポートされています (もちろん、クラス定義ファイルを含める必要があります)。株式会社クラッサ)。
注: PHP マニュアルの「言語リファレンス」->「クラスとオブジェクト」->「オブジェクトのシリアル化 - セッション内のオブジェクト」セクションを参照してください。
JavaScript での JSON へのシリアル化 — json2.js の使用
JavaScript にはオブジェクトを直接シリアル化するための組み込みメソッドはありません。もちろん、自分で作成することもできますが、ここでは手間をかけずに既製の JSON コンポーネントを使用することを強くお勧めします。公式 Web サイトwww.json.org では、 JavaScript オブジェクトの JSON シリアル化用のコード ライブラリ json2.js が提供されており、ここから入手できます。
json2.js ファイルを取得したら、このファイルを開くことができます。ファイルの最初の部分には、かなりの量のコメント情報が含まれています。英語が十分であれば、このセクションを省略して、ファイルのコメントだけを参照することができます。プログラマーとして、十分な文字を見てきて、私の漢字と文字を見たい場合は、下に進んでください。
このコメントを簡単に翻訳すると、http://www.JSON.org/js.html を参照してください。このファイルは、
次の 2 つのメソッドを含むグローバル オブジェクト JSON を作成します。
JSON.stringify(値, ホワイトリスト)
value 任意の JavaScript 値 (通常はオブジェクトまたは配列)
ホワイトリスト オブジェクト値をシリアル化する方法を決定するために使用されるオプションの配列パラメーター。このメソッドは JavaScript 値から JSON テキストを生成します。シリアル化する場合、オプションのパラメーター ホワイトリストに基づいて 3 つの可能性があります。
オブジェクトに toJSON メソッドがある場合、このメソッドを呼び出すと、toJSON メソッドの戻り値がシリアル化されます。
それ以外の場合、オプションのホワイトリスト パラメーターが配列の場合、配列内の要素はシリアル化するオブジェクトのメンバーを選択するために使用されます。
それ以外の場合、whitelist パラメーターが使用されない場合、オブジェクトのすべてのメンバーがシリアル化されます。
未定義や関数など、値に JSON 表現がない場合、値はシリアル化されません。オブジェクトではそのような値は無視され、配列では null に置き換えられます。
JSON.stringify(未定義) は未定義を返します。日付は引用された ISO 日付にシリアル化されます。
例:
コード:
var text = JSON.stringify(['e', {pluribus: 'unum'}]);
//テキストは '["e",{"pluribus":"unum"}]' です
JSON.parse(テキスト、フィルター)
このメソッドは JSON テキストを解析し、SyntaxError 例外をスローする可能性があるコンポーネントまたは配列を生成します。
オプションのフィルター パラメーターは、結果をフィルター処理して変換する関数であり、各キーと値を受け取り、その戻り値を使用してソース値を置き換えます。受信した値を返す場合、結果は変わりません。未定義が返された場合、メンバーは削除されます。
例:
コード:
//テキストを解析し、キーに文字列「date」が含まれている場合は、その値を日付に変換します
myData = JSON.parse(text, function (key, value) {
return key.indexOf('date') >= 0 ? 新しい日付(値) : 値;
});
上記の入門チュートリアルでは、json2.js の使用方法の基本を理解しました。ここではこのファイルについては詳しく説明しません。簡単に JSON テキストを解析したい場合は、eval を使用できます。 () 関数。この関数は JavaScript の組み込み関数です。たとえば、JSON.stringify の場合に生成された JSON テキストを解析するには、次の
コードを使用できます。
var myE = eval('["e",{"pluribus":"unum"}]');
オブジェクト myE を取得します。
JavaScript で JSON にシリアル化する — Prototype.js を使用する
あなたも私と同じで、プロジェクトでオープン ソースの JavaScript フレームワークを使用したい場合は、json2.js ファイルの使用をスキップできるかもしれません。ここでのprototype.js は、たとえば次のとおりです。ファイルはhttp://www.prototypejs.orgからダウンロードできます。この記事は JavaScript フレームワークに関するものではないため、ここでは、prototype.js の使用法をある程度理解していることを前提としています。
prototype.js は、Object オブジェクトの toJSON メソッドを提供します。 Object.toJSON() メソッドを使用して、オブジェクトのシリアル化を実現できます。次に例を示します
。
var cat=
{
名前:「ハローキティ」、
高さ:「リンゴ6個分」
}
アラート(Object.toJSON(cat));
//ダイアログ ボックスが表示され、内容 {"name": "hellokitty", "height": "6 apples"} が表示されます
さらに、prototype.js には追加の JSON サポートがあり、主に Ajax オブジェクトの Ajax リターン リクエスト内の JSON コンテンツの解析が行われます。当面は内容とは関係ないので改めて紹介することはありません。
PHP と JSON
上記では、PHP でオブジェクトをシリアル化する方法と、JavaScript でオブジェクトを JSON にシリアル化する方法について学びました。おそらく、これら 2 つの構文は実際にはまったく同じではないため、なぜこの 2 つを組み合わせたのか疑問に思われるでしょう。 PHP では、JSON テキストを逆シリアル化することができ、PHP オブジェクトを PHP スタイルのテキストではなく JSON にシリアル化することもできます。これは主に、json_decode と json_encode という 2 つの関数によって実現されます。これらの 2 つの関数は PHP 5 以降でのみサポートされていることに注意してください。PHP4 環境で実行されるプログラムを作成する場合は、これらの 2 つの関数を使用します。は使用できません。
json_decode 関数の
構文
mixed json_decode ( string $json [, bool $assoc] )
JSON エンコードされたテキストを取得し、PHP 変数
パラメーター
json
に変換します。
JSONエンコードされたテキスト
同僚
戻り値
は連想配列になります。
または、オプションの assoc パラメーターが TRUE の場合は、json_encode 関数の
構文文字
列 json_encode (mixed $value) が
返されます。
この関数は、値の JSON 式パラメータ
値
を
返します。
エンコードされる値は、リソースを除く任意のタイプのパラメーターです。この関数は
、
成功
時
にエンコードされた JSON テキストを返します。
つまり、「オブジェクト指向」の方法で動作するユーザー登録モジュールがあり、json_decode 関数インスタンスでユーザーの登録情報をフォアグラウンドのクラス属性に変更し、それをバックグラウンドに渡します。 php ファイル (簡単にするために、ここでは Ajax は使用しません)。 json_encode の例では、html ファイル内の js ファイルを参照し、アドレスは php ファイルを指し、json エンコードされたユーザー オブジェクトを php ファイルに出力します (これも簡単にするために、から情報を取得せずにオブジェクトを直接生成します)データベース)、html で出力します。
まず、フロントエンド ページ json_encode.htm を見てみましょう。このページには通常の登録ページがあり、送信されると JavaScript 関数がトリガーされ、ユーザー オブジェクト user が生成されます。をユーザー オブジェクトとして設定し、JSON テキストを生成し、POST モードでバックグラウンドの json_encode.php ファイルに渡します。 js_encode.php ファイルで、 json_decode 関数を使用して JSON テキストを PHP オブジェクトに解析し、出力します。
まず、json_encode.html ファイルを見てみましょう。ファイルのコードは次のとおりです
。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<頭>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>json_decode</title>
<script src="json2.js" type="text/javascript"></script>
<script type="text/javascript">
関数 JSON_test(o){
var ユーザー = {
名前:document.getElementById('txt_name').value,
電子メール:document.getElementById('txt_email').value,
パスワード:document.getElementById('txt_name').value
}
var json_string = JSON.stringify(user);
document.getElementById('txt_json').value=json_string;
alert("OK をクリックしてフォームを送信します");
o.submit();
}
</script>
</head>
<本文>
<form id="form1" name="form1" method="post" action="json_encode.php" onsubmit="JSON_test(this)">
<label for="txt_name">名前</label>
<p>
<input type="text" name="txt_name" id="txt_name" />
</p>
<label for="txt_email">メール</label>
<p>
<input type="text" name="txt_email" id="txt_email" />
</p>
<p>
<label for="txt_password">パスワード</label>
</p>
<p>
<input type="text" name="txt_password" id="txt_password" />
</p>
<p>
<input type="text" name="txt_json" id="txt_json" />
<label for="button"></label>
<input type="submit" name="button" id="button" value="JSON" />
</p>
</form>
</body>
</html>
フォームが送信されると、JavaScript 関数 JSON_text() がトリガーされます。この関数は、まず JavaScript オブジェクト ユーザーを作成し、その名前、電子メール、パスワードの属性を対応するフォームの値に設定してから、JSON.stringify を使用します。 json2.js ファイルのメソッドを JSON テキスト json_string に変換し、最後に隠しフィールドを設定します (ここではわかりやすくするために、この隠しフィールドをテキスト ボックスの形式で表示します) txt_json の値は json_string、そしてフォームが送信されます。
次に、次のように json_encode.php ファイルに移動します。
コード:
<?php
$json_string = $_POST["txt_json"];
if(ini_get("magic_quotes_gpc")=="1")
{
$json_string=ストリップスラッシュ($json_string);
}
$user = json_decode($json_string);
エコー var_dump($user);
?>
このファイルでは、まず json_encode.html ファイル内の POST フォーム フィールド txt_json の値を取得し、それを変数 $json_string に代入します。次に、現在の PHP 設定が magic_quotes_gpc=On であるかどうか、つまり受信した二重引用符がどうかを判断します。意味が変換されるため、 json_decode 関数が解析できないため、エスケープを解除する必要があります。
を
$user 変数に保存し、最後に echo var_dump($user); を使用してオブジェクトをダンプします。
オブジェクト(stdClass)#1 (3) {
["名前"]=>
string(10) "ハングオフェン"
["メール"]=>
文字列(18) " [email protected] "
["パスワード"]=>
string(10) "ハングオフェン"
}
json_encode 関数インスタンスは
、json_enode.html と json_encode.php という 2 つの部分で構成されています。 json_decode.html ファイルでは、フォームは基本的に json_decode.html ファイルと似ていますが、今回は、対応するユーザーの JSON テキストを json_encode.php ファイルから取得したいという点が異なります。この PHP ファイルを見てみましょう。最初:
コード:
<?php
クラスユーザー{
パブリック $name="";
パブリック $email="";
パブリック $パスワード="";
};
$myUser = 新しいユーザー;
$myUser->name="ハングオフェン";
$myUser->email=" [email protected] ";
$myUser->password="ハングオフェン";
$json_string = json_encode($myUser);
?>
var user = <?php echo($json_string)?>;
このファイルは、まずユーザー クラスを作成し、次にユーザー クラス myUser のインスタンスを取得し、そのユーザー名、電子メール、パスワードを設定します。次に、json_encode 関数を使用してそれを JSON テキストに変換し、変数 $json_string に保存します。 JavaScript でグローバル変数 user を作成するための JavaScript コードを出力します。
次に、次のように、json_encode.php ファイルを json_encode.html ファイルに導入し、ユーザー オブジェクトのさまざまな属性を取得する必要があります。
コード:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<頭>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>json_encode</title>
<script src="json_encode.php" type="text/javascript"></script>
</head>
<本文>
<form id="form1" name="form1" method="post">
<label for="txt_name">名前</label>
<p>
<input type="text" name="txt_name" id="txt_name" />
</p>
<label for="txt_email">メール</label>
<p>
<input type="text" name="txt_email" id="txt_email" />
</p>
<p>
<label for="txt_password">パスワード</label>
</p>
<p>
<input type="text" name="txt_password" id="txt_password" />
</p>
</form>
<script type="text/javascript" >
document.getElementById('txt_name').value=user.name;
document.getElementById('txt_email').value=user.email;
document.getElementById('txt_password').value=user.password;
</script>
</body>
</html>
このファイルでは、2 つの点に注意する必要があります。1 つ目は、次のコードを使用して json_encode.php ファイルを JavaScript ファイルとして導入していることです
。
<script src="json_encode.php" type="text/javascript"></script>
2 番目の点は次のとおりです。
テキスト ボックス コードの後に JavaScript コードを追加し、テキスト ボックスの value 属性を操作して、その値をユーザー オブジェクトの対応する値に設定します。