JSONを介して関数を渡す

このトピックから、PHPを使用してJSON経由でJavaScript関数を送信する方法を学習します(概念自体は他の言語に適用できます)。

PHPには、バージョン5.2.0以降、json_encode()およびjson_decode()関数が含まれています。 これらの関数は、データをJSON形式でエンコードし、JSONを連想配列にデコードします。 json_encode()では、関数をエンコードできません。 場合によっては、これは非常に不便です。
  1. Zend Frameworkに実装例を追加しました。
  2. karmavampiresへの質問-ハンドラーを渡してオブジェクトを異なる方法で作成する方法を知っていますか?
  3. 理由と誰がそれを必要とするかについての解説

問題

//
$foo = array(
'number' => 1,
'float' => 1.5,
'array' => array(1,2),
'string' => 'bar' ,
'function' => 'function(){return "foo bar";}'
);
// JSON
$json = json_encode($foo);
//
echo $json;


* This source code was highlighted with Source Code Highlighter .

結果

{
"number" :1,
"float" :1.5,
"array" :[1,2],
"string" : "bar" ,
"function" : "function(){return \"foo bar\";}"
}

* This source code was highlighted with Source Code Highlighter .


関数の定義を引用符で囲まない場合、つまり文字列として定義しない場合、コードは実行されないためです。 したがって、基本的にjscon_encode()はこの機能の実装には適していません。

解決策

  1. エンコードする配列を通過します。
  2. 関数定義のエンコードされた値を確認してください。
  3. 値を記憶し、一意のラベルに置き換えます。
  4. json_encode()を使用して、変更された配列をエンコードします。
  5. 一意のラベルを元の値に置き換えます。
  6. クライアントにJSONを渡します。
// .
$foo = array(
'number' => 1,
'float' => 1.5,
'array' => array(1,2),
'string' => 'bar' ,
'function' => 'function(){return "foo bar";}'
);

$value_arr = array();
$replace_keys = array();
foreach ($foo as $key => &$ value ){
//
if (strpos($ value , 'function(' )===0){
// .
$value_arr[] = $ value ;
// '' ..
$ value = '%' . $key . '%' ;
// .
$replace_keys[] = '"' . $ value . '"' ;
}
}

// JSON
$json = json_encode($foo);

// $json :
{
"number" :1,
"float" :1.5,
"array" :[1,2],
"string" : "bar" ,
"function" : "%function%"
}

// .
$json = str_replace($replace_keys, $value_arr, $json);

// .
echo $json;

// JSON :
{
"number" :1,
"float" :1.5,
"array" :[1,2],
"string" : "bar" ,
"function" :function(){ return "foo bar" ;}
}


* This source code was highlighted with Source Code Highlighter .
受信したオブジェクトでは、「関数」は文字列ではなく関数です。 実際に問題は解決しました。 このソリューションをPrototypeと併用すると、次のようになります。
new Ajax.Request( 'json_server.php' , {
method: 'get' ,
onSuccess: function(transport){
var json = transport.responseText.evalJSON();
alert(json.function()); // => alert 'foo bar'
}
});


* This source code was highlighted with Source Code Highlighter .


Zend Frameworkでの実装:


$foo = array(
'integer' =>9,
'string' => 'test string' ,
'function' => Zend_Json_Expr(
'function(){ window.alert("javascript function encoded by Zend_Json") }'
),
);

Zend_Json::encode($foo, false , array( 'enableJsonExprFinder' => true ));
// it will returns json encoded string:
{
"integer" :9,
"string" : "test string" ,
"function" :function(){
window.alert( "javascript function encoded by Zend_Json" )
}
}


* This source code was highlighted with Source Code Highlighter .

Source: https://habr.com/ru/post/J63057/


All Articles