Если бы каж­дый раз, когда я слы­шу во­прос "как из JS вы­звать функ­цию PHP" от оче­ред­но­го на­чи­на­ю­ще­го быд­ло­ко­де­ра, де­ла­ю­ще­го свою супер-пу­пер брау­зер­ную иг­ру или чат, мне да­ва­ли один дол­лар, то я бы дав­но ско­пил на хо­ро­шую FullHD плаз­мен­ную па­нель. Объ­еди­нить не­объеде­ня­е­мое - кри­сталь­ная меч­та маль­чи­ков, ко­то­рые с го­рем по­по­лам вы­учи­ли php, а на JS про­сто не хва­та­ет ум­ствен­ных ре­сур­сов, поэто­му эти лен­тяи посы­ла­лись нахуй с фор­му­ли­ров­кой "не еби се­бе и дру­гим мозг". Но вот ведь чу­де­са, сам столк­нул­ся в про­цес­се од­ной ша­баш­ки с подоб­ной за­да­чей: для ва­ли­да­ции фор­мы су­ще­ство­вал класс ров­но на 25-ть ме­то­дов, ко­то­рые про­ве­ря­ли вся­кую ми­шу­ру, вро­де на­личия де­нег на сче­ту кли­ен­та, пра­виль­ность вве­де­ных дан­ных и так да­лее. Пробле­ма со­сто­я­ла в том, что к про­верке нуж­но бы­ло до­ба­вить client-side на осно­ве JS. Пе­ре­пи­сы­вать все бы­ло очень тру­до­ем­ким про­цес­сом, да и не пред­став­ля­лось воз­мож­ным - про­цесс не огра­ни­чи­ва­лась ре­гу­ляр­ка­ми для мы­ла и ко­ли­че­ства ци­фе­рок в но­ме­ре кре­дит­ки. Имен­но поэто­му я на­пи­сал ма­лень­кий класс, ко­то­рый превра­ща­ет PHP в JS объект. Все очень про­сто: по­лу­ча­ем public ме­то­ды клас­са или огра­ни­чи­ва­ем­ся списком из мас­си­ва, ко­то­рый пере­да­ем вто­рым па­ра­мет­ром при ини­ци­а­ли­за­ции по­сле име­ни или инстан­са необ­хо­ди­мо­го нам клас­са, со­зда­ем JS объект с пре­фик­сом jsphp_ и со­от­вет­ству­ю­щи­ми ме­то­да­ми, каж­дый из ко­то­рых со­зда­ет ajax запрос к backend, ко­то­рый в свою оче­редь об­ра­ба­ты­ва­ет запрос (вы­зы­ва­ет со­от­вет­ству­ю­щий ме­тод PHP объек­та) и воз­вра­ща­ет ре­зультат. Ко­му ин­терес­но, то мож­но до­ба­вить еще и экс­порт гло­баль­ных пере­мен­ных, ана­лог __construct, хра­нить со­здан­ный php объект в сес­сион­ной гло­баль­ной пере­мен­ной, лич­но мне и так хва­та­ет.При­мер ра­бо­ты мож­но по­смот­реть по ссыл­ке, ис­ход­ный код до­сту­пен в ко­пи­па­стере, javascript немного об­фус­ци­ру­ет­ся для при­ми­тив­ной за­щи­ты от де­би­лов. Для ajax запро­са ис­поль­зу­ет­ся jquery.