JPHP Android Apps

Leute, die Code in PHP schreiben, werden alles tun, um nicht in andere Sprachen zu wechseln. Ja, ich bin mir bewusst, dass es früher in Habré bereits eine Möglichkeit gab , Android-Anwendungen in PHP zu schreiben, aber es wurde beschlossen, es schneller und kompatibler mit Java JPHP anzupassen.


Logo


Über JPHP


Ich nehme an, Sie könnten eine Frage haben. Was ist JPHP? Die Antwort ist genau dort auf Habré:



Nun, wir werden weitermachen. In den 4 Jahren, die seit dem Schreiben dieser Beiträge über JPHP vergangen sind, hat sich diese Sprache zum Besseren verändert. Zum Beispiel gab es unseren eigenen jppm- Paketmanager, über den wir heute auch sprechen müssen.


Wie alles begann


Alles begann, als mein Freund auf die Idee kam, Android-Apps auf JPHP zu erstellen. Ich habe ihm den Beitrag gegeben, über den wir am Anfang gesprochen haben, aber diese Methode hat ihm nicht gefallen, da sie normales PHP verwendet. Nun, wir Entwickler, die in einer unbekannten JPHP-Sprache schreiben, haben beschlossen, alles selbst zu machen.


Nach dem Surfen im Internet haben wir keinen anderen Weg gefunden, als JavaFXPorts zu verwenden. Und der Schöpfer dieser Sprache selbst wollte sie 2 Jahre lang als GUI-Engine für JPHP verwenden, ohne etwas getan zu haben.


Wie das Sprichwort sagt: "Wer außer dir?". Ich beeilte mich, die Arbeit der JPHP-Sprache weltweit zu studieren.


Die ersten Wochen waren erfolglos. Ich habe bereits die automatische Generierung eines Build-Skripts für gradle geschrieben und alles wäre in Ordnung, apk wollte, aber als ich anfing, war mir zu diesem Zeitpunkt ein Fehler unbekannt. Mir wurde sofort klar, dass sie JPHP zu verdanken war, aber ich hatte noch nie eine solche gesehen. Jetzt kann ich mit Sicherheit sagen, dass dieser Fehler auf den generierten Bytecode zurückzuführen ist. DalvikVM corny konnte den für die JVM generierten Bytecode nicht ausführen. Das ist ein großes Hindernis geworden. Da PHP-Dateien in JPHP-Anwendungen überhaupt nicht kompiliert werden. Es gab eine Option mit PHB-Dateien, aber dies löste unser Problem überhaupt nicht. Die einzige Möglichkeit bestand darin, einen eigenen Compiler zu schreiben, der wirklich funktionierte, aber eine Reihe von Einschränkungen in Bezug auf Include und Eval mit sich brachte, danke, Dalvik.


Nach vielen Versuchen und Irrtümern gelang es mir immer noch, die allererste Version zu erstellen. Seine Quellen sind hier . Diese Version war nicht sehr schnell. Ja, und die Verwendung von JavaFX unter Android ist ein Masazismus.


Deshalb habe ich beschlossen, alles von Grund auf neu zu schreiben. Ich habe diese Entscheidung vor relativ kurzer Zeit getroffen. Daher ist die Bibliothek für JPHP etwas feucht. Aber es funktioniert.


Wie funktioniert es?


Alles beginnt damit, dass jppm alle Ihre Quellen und Abhängigkeiten in einer einzigen JAR-Datei sammelt. Dann kompilieren Sie in ihnen alle php Dateien in class . Danach wird die resultierende JAR-Datei je nach Gradle hinzugefügt. Und er wiederum kompiliert diese Klassendateien zu Dex. Das ist das ganze Geheimnis.


Das Starten der Anwendung ist komplizierter. In AndroidManifest.xml gibt es zunächst nur eine BootstrapActivity die alle JPHP lädt. Nach dem Laden kann diese BootstrapActivity über JPHP geändert werden. Für Activity ich gleichnamige Klassen erstellt.


 <? use php\android\app\Application; $bootstrapActivity = Application::getMainActivity(); 

Mit diesem Code können Sie genau die BootstrapActivity abrufen, von der JPHP geladen wurde.


Ich denke, Sie haben die Arbeit des JPHP-Loaders bereits verstanden.


Ein kleines Beispiel


Um beispielsweise den primitivsten Clicker zu erstellen, müssen Sie diesen Code verwenden:


 <? use php\android\app\Application; use php\android\widget\Button; Application::setMainActivityHandler(fn => { //   jPHP $activity = Application::getMainActivity(); //  BootstrapActivity $activity->setTitle("test"); //   $activity->setContentView($button = new Button($activity)); //     $button->text = "Hello from JPHP!"; //     $button->on("click", function () use ($button) { //     ... $GLOBALS['clicks']++; $button->text = "Clicks: " . $GLOBALS['clicks']; }); }); 

Als Ergebnis haben wir eine einfache Anwendung mit einem Knopf bekommen:



Fazit


Ich glaube nicht, dass sich jemand für mein Projekt interessieren wird. Da es noch nicht 10% der Android API beschreibt. Und das Schreiben von Anwendungen für Android in PHP ist kein Kanon. Aber ich denke, das Projekt wird sein Publikum finden.


Github-Projekt
Github JPHP
Gruppe in VK

Source: https://habr.com/ru/post/de425223/


All Articles