Dobre praktyki programistyczne

Hybrydowa klasa z JavaScript i PHP

09.01.2011

JavaScript i PHP są bardzo często wykorzystywane razem w jednym projekcie. Mając na celu ułatwienie programowania z wykorzystaniem obu tych języków stworzyłem bibliotekę, pozwalającą na zaimplementowanie części klasy w JavaScript, a pozostałej w PHP. W ten sposób można wywołać w JavaScript metodę napisaną w PHP. Programista może się skupić na tworzeniu kodu, a synchronizacją zajmuje się biblioteka.

Zastosowanie

Obiekty w JavaScript pozostają po stronie klienta, co pozwala na interakcję z użytkownikiem. Warstwa logiczna pozostaje po stronie serwera.

  • Tworzenie i modyfikowanie obiektów w GUI, które zapisywane są przez PHP, np. w badzie danych.
  • Walidacja wprowadzonych przez użytkownika danych.
  • Ukrycie części implementacji przed użytkownikiem.
  • Użycie funkcji niedostępnych w JavaScript.

Przykład

Prosta implementacja konta bankowego. Operacje na koncie wywoływane są przez JavaScript, jednak wykonuje je PHP. Obiekt w przeglądarce ma prawidłowy stan zarówno przed jak i po operacji. Skrypt PHP zapisuje stan konta. Aby uprościć przykład, pominięto tutaj walidację danych.

PHP   
  1. include_once 'phpjs/phpjs.php';//path to file
  2.  
  3. class BankAccount extends PhpJs {//must extends PhpJs
  4. private $amount; //private - will not be send to JS
  5. protected $number; //protected - will be send to JS
  6.  
  7. function init(){ //executed when JS object is created
  8. if($this->number) {
  9. $this->amount = $this->getAmount();
  10. }
  11. }
  12.  
  13. function widthdraw($amount){
  14. $this->amount = $this->getAmount() - $amount;
  15. $this->save();
  16. }
  17.  
  18. function deposit($amount){
  19. $this->amount = $this->getAmount() + $amount;
  20. $this->save();
  21. }
  22.  
  23. function getAmount(){
  24. return @file_get_contents($this->number);
  25. }
  26.  
  27. private function save(){ //private - will not be send to JS
  28. $fp = fopen($this->number, "w");
  29. fwrite($fp, $this->amount);
  30. fclose($fp);
  31. }
  32. }
  33.  
  34. $account = new BankAccount(); //make general instance
  35. echo $account->phpJs(); //communicate with JS
  1. function BankAccount(number) {//constructor
  2. this.number = number; //assign variable
  3. this.phpFile = 'phpjs/bankaccount.php'; //set file with your PHP class
  4. BankAccount.inherit(PhpJs.call(this)); //inherit the PhpJs
  5. }
  6.  
  7. var account = new BankAccount(1234);
  8. document.writeln("Begin="+account.getAmount());
  9. account.deposit(220);
  10.  
  11. var accountProxy = new BankAccount(1234); //the same number
  12. document.writeln("+220="+accountProxy.getAmount());
  13.  
  14. account.widthdraw(70);
  15. document.writeln("-70="+account.getAmount());
  16.  
  17. document.writeln("Proxy="+accountProxy.getAmount());

Wynikiem działania powyższego kodu jest:

Wynik   
  1. Begin=false
  2. +220=220
  3. -70=150
  4. Proxy=150

Przykład ten znajduje się wraz z biblioteką w pliku na dole.

Technologie

Projekt wykorzystuje kilka technologii:

  • Synchroniczne (w przeciwieństwie do AJAX) wywołania XMLHttpRequest.
  • JSON – format wymiany danych.
  • Refleksje PHP.

Modyfikacje

Jest to bardzo wczesna wersja projektu, dlatego sposób jej użycia może się jeszcze zmienić. Do zrobienia jest m.in:

  • optymalizacja liczby zapytań przy tworzeniu wielu obiektów,
  • metody statyczne,
  • lepsza obsługa błędów.

Podsumowanie

Biblioteka ta zwiększa czytelność kodu i odciąża od konieczności ręcznej synchronizacji obiektów pomiędzy serwerem a klientem. Jest przy tym bardzo niewielka, po 3kB w pliku JS i PHP. Wadą biblioteki jest synchroniczna komunikacja z serwerem i odwołanie się do niego przy każdym wywołaniu metody napisanej w PHP.

Pobierz

Projekt i przykład PhpJs Hybrid Class 0.1

Leave a Response