Diese Bibliothek wird verwendet, um die Geschäftslogik in einer einfachen und dennoch leistungsstarken Definition zu speichern.
Eine Mini -Skriptsprache für PHP. Es erledigt drei einfache Aufgaben.
Zum Beispiel :
when var1>5 and var2>20 then var3=20 // when and then
init var5=20 when var1>5 and var2>20 then var3=var5 // init, when and then
init var5=20 when var1>5 and var2>20 then var3=var5 else var3=var20 // init, when, then and else
when var1>$abc then var3=var5 // $abc is a PHP variable.
Manchmal müssen wir einen beliebigen Code in der Grundlage von "Wenn ein Wert entspricht, setzen wir einen anderen Code fest oder führen wir aus."
In PHP konnten wir den nächsten Code erstellen.
if ( $ condition ) {
$ variable = 1 ;
}Dieser Code wird jedoch zur Laufzeit ausgeführt. Was ist, wenn wir diesen Code zu einem bestimmten Zeitpunkt ausführen müssen?
Wir könnten den nächsten Code machen:
$ script = ' if($condition) {
$variable=1;
} ' ;
// and later..
eval ( $ script );Diese Lösung funktioniert (und es wird nur ausgeführt, wenn wir den Befehls -Eval aufrufen). Aber es ist ausführlich, fehleranfällig und gefährlich.
Unsere Bibliothek macht das Gleiche, aber sicher und sauber.
$ mini -> separate ( " when condition then variable=1 " );Installieren Sie es mit Composer:
Der Komponist benötigt EFTEC/Minilang
Erstellen eines neuen Projekts
use eftec minilang MiniLang ;
include " ../lib/MiniLang.php " ; // or the right path to MiniLang.php
$ mini = new MiniLang ();
$ mini -> separate ( " when field1=1 then field2=2 " ); // we set the logic of the language but we are not executed it yet.
$ mini -> separate ( " when field1=2 then field2=4 " ); // we set more logic.
$ result =[ ' field1 ' => 1 , ' field2 ' => 0 ]; // used for variables.
$ callback = new stdClass (); // used for callbacks if any
$ mini -> evalAllLogic ( $ callback , $ result );
var_dump ( $ result );Ein weiteres Beispiel:
use eftec minilang MiniLang ;
include " ../lib/MiniLang.php " ;
$ result =[ ' var1 ' => ' hello ' ];
$ global1 = " hello " ;
$ mini = new MiniLang ( null , $ result );
$ mini -> throwError = false ; // if error then we store the errors in $mini->errorLog;
$ mini -> separate ( ' when var1="hello" then var2="world" ' ); // if var1 is equals "hello" then var2 is set "world"
$ mini -> separate ( ' when $global1="hello" then $global2="world" ' ); // we can also use php variables (global)
$ mini -> evalAllLogic ( false ); // false means it continues to evaluate more expressions if any
// (true means that it only evaluates the first expression where "when" is valid)
var_dump ( $ result ); // array(2) { ["var1"]=> string(5) "hello" ["var2"]=> string(5) "world" }
var_dump ( $ global2 ); // string(5) "world" __construct (& $ Caller, & $ dict, Array $ specialcom = [], $ areaname = [], $ serviceClass = null)
Es setzt die vorherigen Definitionen zurück, aber die Variablen, Dienst und Bereiche.
Setzen Sie ein Anruferobjekt. Das Anruferobjekt kann eine Dienstklasse mit Methode sein, die sie innerhalb des Skripts aufgerufen werden könnte.
Stellen Sie ein Wörterbuch mit den vom System verwendeten Variablen ein.
Es sendet einen Ausdruck an den Minilang und wird in seinen Teilen zersetzt. Das Skript wird nicht ausgeführt, sondern analysiert.
Es bewertet eine Logik. Es gibt wahr oder falsch zurück.
Es legt einen Wert oder Werte fest. Es wird nicht berücksichtigt, ob wo wahr ist oder nicht.
Boolean.
Reihe von String. Wenn $ throwerror falsch ist, wird hier jeder Fehler gespeichert.
Beispiel:
$ this -> throwError = false ;
$ mini -> separate ( " when FIELDDOESNOTEXIST=1 then field2=2 " );
var_dump ( $ this -> errorLog );Die Syntaxis des Codes wird in vier Teile unterteilt. Init, wo (oder wann), setzen (oder dann) und sonst.
Beispiel:
$ mini -> separate ( " when field1=1 then field2=2 " );Es heißt, wenn Field1 = 1 dann das Feld2 als 2 festlegen.
Eine Variable wird durch varname definiert
Beispiel: Beispiele/BeispielVariable.php
$ mini = new MiniLang ();
$ mini -> separate ( " when field1>0 then field2=3 " ); // we prepare the language
$ variables =[ ' field1 ' => 1 ]; // we define regular variables
$ callback = new stdClass ();
$ mini -> evalAllLogic ( $ callback , $ variables ); // we set the variables and run the languageand run the language
var_dump ( $ variables ); // field1=1, field2=3Eine Variable könnte ein PHP -Objekt hosten, und es ist möglich, auf die Felder in ihr zuzugreifen.
varname.field
Beispiel für Codebeispiele/BeispielVariable2.Php
class MyModel {
var $ id = 1 ;
var $ value = "" ;
public function __construct ( $ id = 0 , $ value = "" )
{
$ this -> id = $ id ;
$ this -> value = $ value ;
}
}
class ClassCaller {
public function Processcaller ( $ arg ) {
echo " Caller: setting the variable { $ arg -> id } <br> " ;
}
}
class ClassService {
public function ProcessService ( $ arg ) {
echo " Service: setting the variable { $ arg -> id } <br> " ;
}
}
$ mini = new MiniLang ([],[], new ClassService ());
$ mini -> separate ( " when field1.id>0 then
field2.value=3
and field3.processcaller
and processcaller(field3)
and processservice(field3) " ); // we prepare the language
$ variables =[ ' field1 ' => new MyModel ( 1 , " hi " )
, ' field2 ' => new MyModel ( 2 , '' )
, ' field3 ' => new MyModel ( 3 , '' )]; // we define regular variables
$ callback = new ClassCaller ();
$ mini -> evalAllLogic ( $ callback , $ variables , false ); // we set the variables and run the languageand run the language
var_dump ( $ variables );Eine Variable könnte ein assoziatives/Index -Array enthalten, und es ist möglich zu lesen und auf die darin enthaltenen Elemente zuzugreifen.
Beispiel:
$ mini = new MiniLang ( null ,
[
' vararray ' =>[ ' associindex ' => ' hi ' , 0 => ' a ' , 1 => ' b ' , 2 => ' c ' , 3 => ' d ' , 4 => ' last ' , ' a ' =>[ ' b ' =>[ ' c ' => ' nested ' ]]]
]
);vararray.associndex // vararray['associindex'] ('hi')
vararray. 4 // vararray[4] 'last'
vararray. 123 // it will throw an error (out of index)
vararray. param ( ' a.b.c ' )) // vararray['a']['b']['c'] ('nested')
param (vararray, ' a.b.c ' )) // vararray['a']['b']['c'] ('nested')
vararray._first // first element ('hi')
vararray._last // last element ('last')
vararray._count // returns the number of elements. (6)Beispiel für Codebeispiele/BeispielVariable_arr.php
class ClassCaller {
public function Processcaller ( $ arg ) {
echo " Caller: setting the variable { $ arg [ ' id ' ]} <br> " ;
}
}
class ClassService {
public function ProcessService ( $ arg ) {
echo " Service: setting the variable { $ arg [ ' id ' ]} <br> " ;
}
}
$ mini = new MiniLang ([],[], new ClassService ());
$ mini -> separate ( " when field1.id>0 then
field2.value=3
and field3.processcaller
and processcaller(field3)
and processservice(field3) " );
$ variables =[ ' field1 ' =>[ ' id ' => 1 , ' value ' => 3 ]
, ' field2 ' =>[ ' id ' => 2 , ' value ' => '' ]
, ' field3 ' =>[ ' id ' => 3 , ' value ' => '' ]
];
$ callback = new ClassCaller ();
$ mini -> evalAllLogic ( $ callback , $ variables , false );
var_dump ( $ variables );Eine globale Variable übernimmt die Werte des PHP ($ global), sodass sie nicht definiert oder in der Sprache festgelegt werden muss
Hinweis: Aus Sicherheitszwecken. Globale Variablen, die von PHP als "$ _namevar" definiert wurden, können nicht gelesen oder geändert werden. Wenn Sie also eine globale Variable schützen möchten, können Sie sie mit einem Unterstrich als Präfix umbenennen.
Beispiel: Wenn Sie versuchen, die Variable $ _server zu lesen, gibt es den Wert des Variablen -$ -Servers zurück, den er definiert oder nicht.
Eine globale Variable wird durch definiert durch
$globalname
$ globalname .associndex // $globalname['associindex']
$ globalname . 4 // $globalname[4]
$ globalname . param ( ' a.b.c ' ) // $globalname['a']['b']['c']
param ( $ globalname , ' a.b.c ' ) // $globalname['a']['b']['c']Beispiel:
$globalname=30
Beispielcode: Beispiele/exitleglobal.php
$ field1 = 1 ; // our global variable
$ mini = new MiniLang ();
$ mini -> separate ( ' when $field1>0 then $field1=3 ' ); // we prepare the language
$ variables =[]; // local variables
$ callback = new stdClass ();
$ mini -> evalAllLogic ( $ callback , $ variables ); // we set the variables and run the languageand run the language
var_dump ( $ field1 ); // returns 3 | Typ | Beispiel |
|---|---|
| Nummer | 20 |
| Saite | "Hallo Welt", 'Hallo Welt' ' |
| Stringp | "Mein Name ist {{var}}" |
| Funktion | Namefunktion (arg, arg) |
Setzen Sie var = 20 und var2 = "Hallo" und var3 = "Hallo {{var}}" und var4 = fn ()
| Reserviertes Wort | Erläuterung |
|---|---|
| null () | Nullwert |
| FALSCH() | falscher Wert |
| WAHR() | wahrer Wert |
| An() | 1 |
| Param (var, 'l1.l2.l3') | Trennt ein Array (var) in var ['l1'] ['l2'] ['l3'] |
| aus() | 0 |
| UNDEF () | -1 (für undefinierte) |
| Flip () | (besonderer Wert). Es umdreht einen Wert auf <--> aus Als Wert verwendet = Flip () |
| Jetzt() | Gibt den aktuellen Zeitstempel (Ganzzahl) zurück |
| Timer() | Gibt den aktuellen Zeitstempel (Ganzzahl) zurück |
| Intervall() | Gibt das Intervall (in Sekunden) zwischen der letzten Veränderung und jetzt zurück. Es verwendet das Feld Datelastchange oder Methode Datelastchange () der Rückrufklasse |
| FullInterval () | Gibt das Intervall (in Sekunden) zwischen dem Beginn des Prozesses und jetzt zurück. Es verwendet das Feld DateInit oder Methode DateInit () der Rückrufklasse |
| enthält ()/str_contains () | Gibt true zurück, wenn der Text in einem anderen Text enthalten ist. Beispiel: str_contains (Feld1, 'Hi') |
| str_starts_with (), startenwith () | Gibt true zurück, wenn der Text mit einem anderen Text beginnt |
| str_ends_with (), Endwith () | Gibt true zurück, wenn der Text mit einem anderen Text endet. |
Beispiel: Beispiele/Beispiele: Php
$ mini = new MiniLang ();
$ mini -> separate ( " when true=true then field1=timer() " ); // we prepare the language
$ variables =[ ' field1 ' => 1 ]; // we define regular variables
$ callback = new stdClass ();
$ mini -> evalAllLogic ( $ callback , $ variables ); // we set the variables and run the language
var_dump ( $ variables );Beispiel -Timer: Beispiele/BeispielPlereServedTimer.php
class ClassWithTimer {
var $ dateLastChange ;
public function dateInit () {
return time ();
}
public function __construct ()
{
$ this -> dateLastChange = time ();
}
}
$ mini = new MiniLang ();
$ mini -> separate ( " when true=true then field1=interval() and field2=fullinterval() " ); // we prepare the language
$ variables =[ ' field1 ' => 0 , ' field2 ' => 0 ]; // we define regular variables
$ callback = new ClassWithTimer ();
$ mini -> evalAllLogic ( $ callback , $ variables ); // we set the variables and run the language
var_dump ( $ variables );Dieser Teil des Ausdrucks ermöglicht das Festlegen eines Wertes. Dieser Ausdruck ist normalerweise optional und kann weggelassen werden.
Es ist ähnlich wie ein Set, wird jedoch vor und egal, ob dort gültig ist oder nicht.
Init counter = 20 wobei variable1 = 20 Variable+Zähler festlegen
$ mini -> separate ( " init tmp=50 when condition=1 then field1+10 " ); // set tmp to 50. If condition is 1 then it increases the field1 by 10. Dieser Teil des Ausdrucks fügt der Aussage eine Bedingung hinzu.
Wir können auch "wann" verwenden.
wo Ausdruck
oder
beim Ausdruck
Es ist möglich, mehr als eine Bedingung gleichzeitig zu vergleichen, indem Sie sich durch "und" oder "oder" trennen.
wobei v1 = 10 und v2 = 20 oder v3 <50
wobei variable1 = 20 und $ variable2 = variable3 oder Funktion (20) = 40
wobei $ field = 20 und field2 <> 40 oder field3 = 40 // sql syntax
wobei $ field == 20 && field2! = 40 || Field3 =+40 // PHP -Syntax
wo 1 // es immer wahr ist
Dieser Teil des Ausdrucks ermöglicht das Festlegen des Werts einer Variablen. Es ist möglich, mehr als eine Variable gleichzeitig durch Trennen durch "" oder "und" einzustellen.
Wir können auch den Ausdruck "set" oder "dann" verwenden
Ausdruck setzen
oder
dann Ausdruck
Dieser Teil des Ausdrucks wird nur ausgeführt, wenn dort gültig ist
Wir könnten eine Variable mit den nächsten Ausdrücken festlegen:
Diese Bibliothek erlaubt keine komplexen Anweisungen wie z.
variable 1 = 20 und $ variable2 = variable3 und Funktion (20) = 40 festlegen
$ mini -> separate ( " when condition=1 then field1+10 " ); // if condition is 1 then it increases the field1 by 10. Dieser optionale Teil des Ausdrucks ermöglicht das Festlegen des Werts einer Variablen. Es ist möglich, mehr als eine Variable gleichzeitig durch Trennung durch "oder" und "einzustellen.
Dieser Code wird nur bewertet, wenn "wobei" falsch zurückgibt, wenn noch man manuell aufgerufen wird.
sonst variable1 = 20 und $ variable2 = variable3 und Funktion (20) = 40
Es ist möglich, eine Schleife mit dem Speicherplatz "Loop" zu erstellen
Um eine Schleife zu starten, müssen Sie schreiben
$ this -> separate ( ' loop variableloop=variable_with_values ' );
// where variable_with_values is must contains an array of values
// variableloop._key will contain the key of the loop
// variableloop._value will contain the value of the loop Und um die Schleife zu beenden, müssen Sie verwenden
$ this -> separate ( ' loop end ' );Sie können der Schleife mit dem Operator "Break" im "Set" oder "sonst" entkommen.
$ this -> separate ( ' when condition set break else break ' );Hinweis: Schleifen werden nur bewertet, wenn Sie die gesamte Logik bewerten. Es funktioniert nicht mit Evallogic () und Evallogic2 ()
Hinweis: Sie können einer Schleife keine Bedingung hinzufügen. Sie können jedoch eine Schleife überspringen und ein leeres Array zuweisen
Beispiel:
$ this -> separate ( ' loop $row=variable ' );
$ this -> separate ( ' loop $row2=variable ' );
$ this -> separate ( ' where op=2 then cc=2 ' );
$ this -> separate ( ' where op=3 then break ' ); // ends of the first loop
$ this -> separate ( ' loop end ' );
$ this -> separate ( ' loop end ' )
$ obj -> evalAllLogic (); Es ist möglich, eine Klasse mit der in der Sprache erstellten Logik zu erstellen. Ziel ist es, die Leistung des Codes zu erhöhen.
Um die Klasse zu generieren, müssen wir zunächst die Logik mit der Methode separat2 () anstelle von separat () schreiben. Es speichert die Logik in einem Array der Instanz der Klasse. Sie können den Code direkt verwenden oder wie folgt in einer Klasse speichern:
// create an instance of MiniLang
$ mini = new MiniLang ( null );
// the logic goes here
$ mini -> separate2 ( ' when var1="hello" and comp.f=false() then var2="world" ' ); // if var1 is equals "hello" then var2 is set "world"
// and the generation of the class
$ r = $ mini -> generateClass ( ' ExampleBasicClass ' , ' nsexample ' , ' ExampleBasicClass.php ' );Es wird eine neue Datei mit dem Titel gespeichert? BeispielBasicClass.php (Sie können das Beispiel überprüfen? Beispiel/Genclass/1.ExampleBasic.php)
Mit der generierten Klasse können Sie diese neue Klasse anstelle von Minilang verwenden. Da diese Klasse bereits zusammengestellt ist, lobt sie schnell. Wenn Sie jedoch die Logik ändern müssen, müssen Sie sie erneut kompilieren. (Sie können das Beispiel überprüfen? Beispiel/Genclass/2.exampleBasic.php und?
$ result =[ ' var1 ' => ' hello ' ];
$ obj = new ExampleBasicClass ( null , $ result );
$ obj -> evalAllLogic ( true );Die Klasse wird aussehen wie:
<?php
namespace ns example ;
use eftec minilang MiniLang ;
class ExampleBasicClass extends MiniLang {
public $ numCode = 2 ; // num of lines of code
public $ usingClass = true ; // if true then we are using a class (this class)
public function whereRun ( $ lineCode = 0 ) {
// ...
} // end function WhereRun
public function setRun ( $ lineCode = 0 ) {
// ...
} // end function SetRun
public function elseRun ( $ lineCode = 0 ) {
// ...
} // end function ElseRun
public function initRun ( $ lineCode = 0 ) {
// ...
} // end function InitRun
} // end classWobei jede Methode einen Teil des Ausdrucks bewertet.
Beispiele/BeispielBenchmark.php
Wir nennen einige Operationen 1000 Mal.
Mittelschaffen eine neue Skriptsprache auf PHP