PHP json_encode кодирует функцию - PullRequest
6 голосов
/ 29 мая 2011

Как кодировать функцию JavaScript в PHP? Я хочу закодировать функцию обратного вызова с массивом

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

эквивалент ini javascript

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

Я знаю, что мой php-код неверен, как я могу это исправить? Спасибо за продвинутый.

Ответы [ 7 ]

7 голосов
/ 30 мая 2011

Альт Я решил мою проблему с кодером Zend_JSON

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

 Zend_Json::encode(
     $options,
     false,
     array('enableJsonExprFinder' => true));
5 голосов
/ 29 мая 2011

JSON предназначен для передачи значений, они не подходят для передачи фрагментов кода.

Вместо этого вы можете передать имя функции или другое значимое значение и извлечь из него подходящую функцию для вызова на стороне JavaScript.

1 голос
/ 29 мая 2011

Это невозможно без размышления о соглашении и его реализации.

Скажи, у тебя есть этот 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;
}

и вызовите это в контексте объекта, который обеспечивает ваши функции обратного вызова

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

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

wireupCallbacks.call(someObject, jsonObject);

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

Чего не хватает:

  • В настоящее время функция ищет только свойства с именем "*Callback".
  • нет возврата к глобальным функциям (это будут свойства объекта window)
  • рекурсии нет (вложенные объекты не посещаются)
  • нет обработки массива JSON

Добавьте эти функции по своему усмотрению, ни одна из них не должна быть сложной для реализации.

1 голос
/ 29 мая 2011

Чтобы уведомление исчезло в PHP, просто напишите свою функцию обратного вызова в кавычках:

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

И затем, когда вы получаете JSON в Javascript, вы можете переназначить имя функции обратного вызова в фактическую функцию JS с помощью, например ::

json = $.getJSON(..);
json.fnCallback = window[json.fnCallback];   // for global callbacks
0 голосов
/ 21 ноября 2014

Voici le code que j'uisise for 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>";

Voici le résultat:

    <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>

Cdt.

0 голосов
/ 29 мая 2011

Не путайте JSON с фактическим, нативным синтаксисом нотации объектов Javascript (независимо от имени).Объекты Javascript могут содержать ссылки на функции;JSON не может.

0 голосов
/ 29 мая 2011

Вы забыли запятую между 'title' и 'fnCallback.'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...