PHP2JS
translator
BETA

Компиляция Apache Cordova приложений для Android онлайн

Зачем это

Чтобы транслировать код php класса в код js класса. Если ваше приложение работает с небольшим списком (я считаю такими списками содержащие менее чем 1000 элементов) вы можете получить их на страницу в json формате и все сортировки, фильтрации по тем или иным параметрам выполнять на клиенте, изменяя url в адресной строке браузера посредством historyApi.

Зачем? Чтобы не беспокоить ваш сервер излишними запросами.

Но при этом вы наверняка захотите, чтобы пользователи вашего веб-приложения могли делиться ссылками на отсортированный и отфильтрованный результат. Если вы реализуете сортировку и фильтрацию средствами php (оставив на совести сервера баз данных только выборку неупорядоченных элементов) вы можете транслировать эти алгоритмы сортировки и фильтрации в js код и использовать его на клиенте.

Реализация на php будет работать на сервере при переходе по ссылке на отсортированный и отфильтрованный результат.

Как подключить

Помимо транслированного в js код php кода вам понадобится файл php.js из архива. Файл содержит код аналога некоторых стандартных функций php. Недостающие напишите сами - я считаю что для программиста это не проблема. Исключение составляют может быть preg_* функции. О стандартных функциях php, работающих с системными процессами, файловой системой, удаленными базами данных и прочим недоступным на js в принципе речь по понятным причинам не идет. Хотя... всему свое время.

Если вы используете node.js или другие интерпретаторы js для работы не в браузере вы вполне можете создать свою реализацию и этих функций обеспечив работу транислированного кода. Я использую в таких случаях решение основанное на Qt WebView (это по сути веб-браузер, но умеющий работать с локальной файловой системой и кое-что ещё), но поделиться им время еще не пришло.

Краткая справка

Вы можете транслировать код класса php или код php функции.

На зеленом фоне плюшки, на красном - баги и недоработки.

Конструкции классов php

Меняет в коде 'extends ParentClass' на вызов 'extend(ParentClass, YourClass)'. Функция extend определена в php.js

Меняет 'static function foo' на 'YourClass.foo = function'

Меняет 'private/public/protected function foo' на 'YourClass.prototype.foo = function ...'

Меняет 'parent::foo(arg1, arg2, arg3)' на 'YourClass.superclass.__constructor.call(this, $a, $b, $c);'

Меняет 'self' на 'YourClass'

Пока не обрабатывает use

Вы можете транслировать за один раз код только одного php класса

Пока не обрабатывает магические методы такие как '__get, __set' вы можете перенести ваш алгоритм сами, используя defineProperty

Пока нет поддержки трансляции комбинированных массивов, таких как array(1,2'foo' => 'bar'), старайтесь использовать в своем коде отдельно array('foo' => 'bar', 'one' => 'two', ['co' => 'kigo']), и array('s','k','d')

Лучше избегать использования конструкции array вообще, используйте []

Конструкции php

Собирает все переменные php и выносит их в начало функции, предваряя ключевым словом var

Меняет в коде '->', '::' на '.';

Извлекает из строки переменные, например "Hello, $name {$user['surname']}!" меняется на "Hello " + $name + $user['surname'] + "!";

Меняет в коде соединения строк с '.' на '+'.

Меняет переносы в одной строковой переменной на соединение нескольких строковых переменных.

Меняет в коде определения ассоциативного массива, такие как "['key' => 'value']" на "{'key':'value'}". Не очень хорошо поддерживает 'array()' construction. Все массивы лучше определять с помощью конструкции '[]'.

Вы можете использовать '$arr = [];//{}' если знаете, что $arr будет ассоциативным массивом. Тогда на выходе вы получите '$arr = {push:__php2js_push__};'. Функция __php2js_push__ определена в php.js

Меняет в коде код '$arr[] = $val;' на '$arr.push($val);'

Меняет в коде 'foreach ($array as $key => $item) {' на 'for ($key in $array) { $item = $array[$key];'.

Меняет в коде 'foreach ($array as $item) {' на 'for (i100500 in $array) { $item = $array[i100500];'.

Если аргумент типа массив не передается функции в оригинальном php коде по ссылке, в транслированном js коде добавляется конструкция '$b = __php2js_clone_argument__($b);' Зачем?

В javascript все массивы однозначно передаются по ссылке. То есть они ведут себя так, как если бы в php вы все функции, принимающие аргументом массив определяли 'function foo(array &$arr){...}'

(В скобках замечу, что и в php5 и в javascript аргументы типа object или StdClass всегда ведут себя точно так же: если вы измените поле класса внутри функции, оно изменится и во внешнем коде, вызвавшем функцию и передавшему ей этот аргумент.)

Если аргумент функции содержит значение по умолчанию в оригинальном php коде, в транслированном js коде добавляется конструкция '$b = String($b) == "undefined" ? 10 : $b;'

Файл php.js содержит несколько аналогов стандартных php функций и будет пополняться новыми.

Функции php, принимающие аргументы по ссылке и имеющие аргументы по умолчанию корректно транслируются только при трансляции кода всего класса php (а не одной функции)

Функции php, принимающие аргументы типа, отличного от array и object (StdClass)по ссылке, работают некорректно. Если вы любите писать 'function foo(&$a = 1, &$b = 'bar', &$c = 10.2, &$d)' ваш код не будет корректно транслирован. Вы можете вручную заменить передачу таких аргументов на передачу объектов {val:null} и в коде функций присваивать значения свойству объекта val. Вы вызвавшем коде также придется использовать значение .val объекта.