簡體   English   中英

PHP json_encode 編碼一個 function

[英]PHP json_encode encode a function

如何在 PHP 中編碼 Javascript function? 我想用數組編碼回調 function

$options = array(
'title' => 'Title',
'fnCallback' => someCallback);

等效 ini Javascript:

var options = {
'title': 'Title',
'fnCallback': someCallback };

我知道我的 PHP 代碼錯誤,我該如何解決?

Viola 我用 Zend_JSON 編碼器解決了我的問題

 $options = array(
     'title' => 'Title',
     'fnCallback' => new Zend_Json_Expr('someCallback')
 );      

 Zend_Json::encode(
     $options,
     false,
     array('enableJsonExprFinder' => true));

JSON 用於傳遞值,它們不適合傳遞代碼段。

相反,您可以傳遞 function 名稱或其他有意義的值並檢索正確的 function 以在 JavaScript 端調用它。

要在 PHP 中通知 go,只需將回調 function 寫在引號中:

$options = array(
   'title' => 'Title',
   'fnCallback' => "someCallback");

And then when you receive the JSON in Javascript, you can remap the callback function name to the actual JS function with eg:

json = $.getJSON(..);
json.fnCallback = window[json.fnCallback];   // for global callbacks

Voici le code que j'utilise pour faire cela:

//~ [FUNCTION]
function __json_encode($mVar,$fnCallback="stripcslashes") {
    return preg_replace_callback('#"[ ]{0,}function[ ]{0,}\([^)$]{0,}\)[ ]{0,}\{[ ]{0,}(?(?![ ]{0,}}[ ]{0,}").){0,}[ ]{0,}\}[ ]{0,}"([(?,")|(?\}{0,}$)]{0,})#si', 
        function ($aRes) use ($fnCallback) { 
            for($aRes[0]=substr($aRes[0],1),$sOut="",$i=0,$iOpen=0,$iClose=0;$i<= strlen($aRes[0]) && $sOut.= substr($aRes[0],$i,1);$i++) 
                if (substr($aRes[0],$i,1) == "{") $iOpen++;
                else if (substr($aRes[0],$i,1) == "}" AND $iOpen == ++$iClose) break;
            return is_callable($fnCallback) ? $fnCallback($sOut).$aRes[1] : $sOut.$aRes[1]; 
        },json_encode($mVar)
    );
}



//~ [TEST]
print "<script>\n";
print sprintf(
    "\tvar oTest = %s;",
    __json_encode(
        array( 
            "Numeric"=>1,
            "string"=>"hello world !",
            "myFunction"=>"function(test) {  if (test==1) { alert('myFunction(1)'); return true; } else return false; }",
            "myObject"=>array(
                "Numeric"=>1,
                "string"=>"hello world !",
                "myFunction"=>"function(test) {  alert('myFunction(1)'); return true; }")
        )
    )
);
print "\n\tif (oTest.myFunction(1) == false) alert('myFunction(0)');";
print "\n\tif (oTest.myObject.myFunction(0) == false) alert('myFunction(0)');";
print "\n</script>";

結果的聲音:

    <script>
        var oTest = {
            "Numeric":1,
            "string":"hello world !",
            "myFunction":function(test) {  if (test==1) { alert('myFunction(1)'); return true; } else return false; },
            "myObject":{
                "Numeric":1,
                "string":"hello world !",
                "myFunction":function(test) {  alert('myFunction(1)'); return true; }
            }
        };
        if (oTest.myFunction(0) == false) alert('myFunction(0)');
        if (oTest.myObject.myFunction(1) == false) alert('myFunction(0)');
    </script>

鎘。

不要將 JSON 與實際的、本機的 Javascript object 表示法語法(無論名稱如何)混淆。 Javascript 對象可以包含 function 引用; JSON 不能。

如果不考慮約定並自己實施,這是不可能的。

說,你有這個 JSON

'{"title": "Title", "fnCallback": "someCallback" }'

然后你可以在客戶端做

function wireupCallbacks(jsonObject) {
  if (typeof jsonObject === "object") {
    for (var prop in jsonObject) {
      var callbackName = jsonObject[prop];
      if (/Callback$/.test(prop) && typeof callbackName === "string") {
        if (typeof this[callbackName] === "function") {
          jsonObject[prop] = this[callbackName];
        }
      }
    }
  }
  return jsonObject;
}

並在提供回調函數的 object 的上下文中調用它

var someObject = {
  someCallback: function() { alert("It works!"); }
}

var jsonObject = {"title": "Title", "fnCallback": "someCallback" };

wireupCallbacks.call(someObject, jsonObject);

jsonObject.fnCallback(); // alerts "It works!"

少了什么東西:

  • 目前 function 僅查找名為"*Callback"的屬性。
  • 沒有回退到全局函數(這些將是window對象的屬性)
  • 沒有遞歸(不訪問嵌套對象)
  • 沒有 JSON 陣列處理

自己添加這些功能,這些都應該不難實現。

我喜歡這個評論中的想法,所以我擴展了它。

這使用唯一 ID 進行替換,因此不太可能出現任何字符沖突或意外替換。 您也可以使用GUID

  $callback_uuid = uniqid();
  $config = [
    'foo' => 'bar',
    'callback' => $callback_uuid,
  ];

  $json = json_encode($config, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);

  // Replace UUID with JS function, and remove the surrounding quotations.
  // Note: This avoids putting '$0' in the string, because regexes replace that.
  $callback_js = "function(value){return'$'+value+(value?'K':'');}";
  $json = preg_replace("/\"$callback_uuid\"/", $callback_js, $json);

作為替代方案,如果您需要將 JSON 放入 URL 並且只需要一種在編碼之前定義 JS 的好方法,您可以使用Heredoc 字符串

  $config = <<<EOF
    {
      foo: "bar",
      callback: function(value){return'$'+value+(value?'K':'');}
    }
  EOF;

您忘記了“title”和“fnCallback”之間的逗號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM