Esta biblioteca se utiliza para almacenar la lógica de negocios en una definición simple pero poderosa.
Un mini lenguaje de script para PHP. Hace tres tareas simples.
Por ejemplo :
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.
A veces necesitamos ejecutar código arbitrario en la base de "Si algún valor es igual a, entonces establecemos o ejecutamos otro código".
En PHP, podríamos hacer el siguiente código.
if ( $ condition ) {
$ variable = 1 ;
}Sin embargo, este código se ejecuta en tiempo de ejecución. ¿Qué pasa si necesitamos ejecutar este código en algún punto específico?
Podríamos hacer el siguiente código:
$ script = ' if($condition) {
$variable=1;
} ' ;
// and later..
eval ( $ script );Esta solución funciona (y solo se ejecuta si llamamos al comando eval). Pero es detallado, propenso al error, y es peligroso.
Nuestra biblioteca hace lo mismo pero seguro y limpio.
$ mini -> separate ( " when condition then variable=1 " );Instalarlo usando el compositor:
El compositor requiere eftec/minilang
Creando un nuevo proyecto
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 );Otro ejemplo:
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 (& $ llamado, & $ dict, array $ specialcom = [], $ areaname = [], $ serviceClass = null)
Restablece las definiciones anteriores pero las variables, el servicio y las áreas.
Establezca un objeto de llamada. El objeto de llamadas podría ser una clase de servicio con método que se pueda llamar dentro del script.
Establezca un diccionario con las variables utilizadas por el sistema.
Envía una expresión al minilang, y se descompone en sus partes. El script no se ejecuta sino se analiza.
Evalúa una lógica. Devuelve verdadero o falso.
Establece un valor o valores. No considera si es verdad o no.
Booleano.
Matriz de cadena. Si $ Throwerror es falso, entonces cada error se almacena aquí.
Ejemplo:
$ this -> throwError = false ;
$ mini -> separate ( " when FIELDDOESNOTEXIST=1 then field2=2 " );
var_dump ( $ this -> errorLog );La sintaxis del código se separa en cuatro partes. Init, donde (o cuándo), establecer (o luego) y de lo contrario.
Ejemplo:
$ mini -> separate ( " when field1=1 then field2=2 " );Dice si el campo1 = 1 entonces establecemos el campo2 como 2.
Una variable se define por varname
Ejemplo: ejemplos/ejemplovariables.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=3Una variable podría alojar un objeto PHP, y es posible llamar y acceder a los campos dentro de él.
varname.field
Ejemplo de ejemplos de código/ejemplovariables2.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 );Una variable podría contener una matriz asociativa/índice, y es posible leer y acceder a los elementos dentro de él.
Ejemplo:
$ 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)Ejemplo de ejemplos de código/ejemplovariable_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 );Una variable global toma los valores del PHP ($ global), por lo que no es necesario definirlo o establecer dentro del idioma
Nota: Para fines de seguridad. Las variables globales definidas por PHP como "$ _namevar" no se pueden leer o modificar. Entonces, si desea proteger una variable global, puede cambiarle el nombre de un subrayador como prefijo.
Ejemplo: si intenta leer la variable $ _server, entonces devolverá el valor del servidor $ variable que podría ser o no definirse.
Una variable global se define por
$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']Ejemplo:
$globalname=30
Código de ejemplo: ejemplos/ejemploglobal.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 | Tipo | Ejemplo |
|---|---|
| Número | 20 |
| cadena | "Hola mundo", 'Hola mundo' |
| stringp | "Mi nombre es {{var}}" |
| función | Función de nombres (Arg, Arg) |
Establecer var = 20 y var2 = "hello" y var3 = "hello {{var}}" y var4 = fn ()
| Palabra reservada | Explicación |
|---|---|
| nulo() | valor nulo |
| FALSO() | valor falso |
| verdadero() | valor verdadero |
| en() | 1 |
| Param (var, 'l1.l2.l3') | Separa una matriz (var) en var ['l1'] ['l2'] ['l3']] |
| apagado() | 0 |
| UNDEF () | -1 (para indefinido) |
| voltear() | (valor especial). Invertida un valor en <-> apagado Utilizado como valor = flip () |
| ahora() | Devuelve la marca de tiempo actual (entero) |
| minutero() | Devuelve la marca de tiempo actual (entero) |
| intervalo() | Devuelve el intervalo (en segundos) entre el último cambio y ahora. Utiliza el campo DataLastChange o el método DataLastChange () de la clase de devolución de llamada |
| FullInterval () | Devuelve el intervalo (en segundos) entre el inicio del proceso y ahora. Utiliza el campo dateInit o método dateInit () de la clase de devolución de llamada |
| contiene ()/str_contains () | Devuelve True si el texto está contenido en otro texto. Ejemplo: str_contains (Field1, 'Hi') |
| str_starts_with (), startWith () | Devuelve verdadero si el texto comienza con otro texto |
| str_ends_with (), endwith () | Devuelve verdadero si el texto termina con otro texto. |
Ejemplo: ejemplos/ejemplareserved.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 );Temporizador de ejemplo: ejemplos/ejemplarservedtimer.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 );Esta parte de la expresión permite establecer un valor. Esta expresión suele ser opcional, y podría omitirse.
Es similar al conjunto, pero se ejecuta antes y no importa si es válido o no.
contador init = 20 donde variable1 = 20 establecer variable+contador
$ 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. Esta parte de la expresión agrega una condición a la declaración.
También podemos usar "cuándo".
Donde la expresión
o
Cuando la expresión
Es posible comparar más de una condición al mismo tiempo separándose por "y" o "o".
donde v1 = 10 y v2 = 20 o v3 <50
donde variable1 = 20 y $ variable2 = variable3 o función (20) = 40
Donde $ Field = 20 y Field2 <> 40 o Field3 = 40 // SQL Syntax
Donde $ Field == 20 && Field2! = 40 || campo3 =+40 // sintaxis de php
donde 1 // siempre es cierto
Esta parte de la expresión permite establecer el valor de una variable. Es posible establecer más de una variable al mismo tiempo separándose por "," o "y".
También podemos usar la expresión "set" o "entonces"
establecer expresión
o
luego expresión
Esta parte de la expresión solo se ejecuta si es válido
Podríamos establecer una variable usando las próximas expresiones:
Esta biblioteca no permite instrucción compleja como
Establecer variable1 = 20 y $ variable2 = variable3 y función (20) = 40
$ mini -> separate ( " when condition=1 then field1+10 " ); // if condition is 1 then it increases the field1 by 10. Esta parte opcional de la expresión permite establecer el valor de una variable. Es posible establecer más de una variable al mismo tiempo separándose por "," o "y".
Este código solo se evalúa si "donde" devuelve falso de si más se llama manualmente.
más variable1 = 20 y $ variable2 = variable3 y función (20) = 40
Es posible crear un bucle usando el espacio "bucle"
Para comenzar un bucle, debe escribir
$ 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 Y para terminar el bucle, debes usar
$ this -> separate ( ' loop end ' );Puede escapar del bucle usando el operador "Break" en el "set" o "else".
$ this -> separate ( ' when condition set break else break ' );Nota: los bucles solo se evalúan cuando evalúa toda la lógica. No funciona con Evallogic () y Evallogic2 ()
Nota: no puede agregar una condición a un bucle, sin embargo, puede omitir un bucle asignando una matriz vacía
Ejemplo:
$ 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 posible crear una clase con la lógica creada en el idioma. El objetivo es aumentar el rendimiento del código.
Para generar la clase, primero necesitamos escribir la lógica utilizando el método separado2 () en lugar de separado () . Generará la lógica dentro de una matriz de la instancia de la clase. Puede usar el código directamente, o puede guardar dentro de una clase de la siguiente manera:
// 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 ' );¿Guardará un nuevo archivo llamado? Ejemplobasicclass.php (¿puede verificar el ejemplo? Ejemplo/genclass/1.EsmampleBasic.php)
Con la clase generada, puede usar esta nueva clase en lugar de minilang . Dado que esta clase ya está compilada, entonces es rápido. Sin embargo, si necesita cambiar la lógica, deberá compilarla nuevamente. (¿Puede verificar el ejemplo? Ejemplo/Genclass/2.ExampleBasic.php y? Ejemplo/Genclass/ESPEAMBasicClass.php)
$ result =[ ' var1 ' => ' hello ' ];
$ obj = new ExampleBasicClass ( null , $ result );
$ obj -> evalAllLogic ( true );La clase se verá como:
<?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 classDonde cada método evalúa una parte de la expresión.
ejemplos/ejemplobenchmark.php
Llamamos a algunas operaciones 1000 veces.
Creación media de un nuevo lenguaje de secuencias de comandos en PHP