Эта библиотека используется для хранения бизнес -логики в простом и в то же время мощном определении.
Мини -язык сценариев для PHP. Он выполняет три простых задачи.
Например :
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.
Иногда нам нужно выполнить произвольный код в основе «Если какое -то значение равно, тогда мы устанавливаем или выполняем другой код».
В PHP мы могли бы сделать следующий код.
if ( $ condition ) {
$ variable = 1 ;
}Однако этот код выполняется во время выполнения. Что если нам нужно выполнить этот код в какой -то конкретной точке?.
Мы могли бы сделать следующий код:
$ script = ' if($condition) {
$variable=1;
} ' ;
// and later..
eval ( $ script );Это решение работает (и оно выполняется только в том случае, если мы называем команду Eval). Но это многословное, склонное к ошибке, и это опасно.
Наша библиотека делает то же самое, но безопасно и чисто.
$ mini -> separate ( " when condition then variable=1 " );Установка его с помощью композитора:
Композитор требует eftec/minilang
Создание нового проекта
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 );Другой пример:
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)
Это сбрасывает предыдущие определения, но переменные, обслуживание и области.
Установите объект вызывающего абонента. Объект Caller Это может быть сервисный класс с методом, который его можно было бы вызвать внутри сценария.
Установите словарь с переменными, используемыми системой.
Он посылает выражение на Миниланг, и он разлагается в его частях. Сценарий не выполняется, а анализируется.
Он оценивает логику. Он возвращает истинность или ложь.
Он устанавливает значение или значения. Это не учитывает, есть ли это правда или нет.
Логический.
Массив строки. Если $ Throwerror является ложным, то здесь хранится каждая ошибка.
Пример:
$ this -> throwError = false ;
$ mini -> separate ( " when FIELDDOESNOTEXIST=1 then field2=2 " );
var_dump ( $ this -> errorLog );Синтаксис кода разделен на четыре части. Init, где (или когда), установите (или затем) и иначе.
Пример:
$ mini -> separate ( " when field1=1 then field2=2 " );Он говорит, что если Field1 = 1, мы установили Field2 как 2.
Переменная определяется varname
Пример: примеры/examplevariable.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=3Переменная может размещать объект PHP, и ее можно позвонить и получить доступ к полям внутри него.
varname.field
Пример примеров кода/examplevariable2.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 );Переменная может содержать ассоциативный/индексный массив, и ее можно прочитать и получить доступ к элементам внутри него.
Пример:
$ 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)Пример примеров кода/examplevariable_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 );Глобальная переменная принимает значения PHP ($ global), поэтому ее не нужно определять или устанавливать внутри языка
Примечание: для цели безопасности. Глобальные переменные, определенные PHP как «$ _namevar», не могут быть прочитаны или изменены. Поэтому, если вы хотите защитить глобальную переменную, то вы можете переименовать ее с подчеркиванием в качестве префикса.
Пример: если вы попытаетесь прочитать переменную $ _server, то она вернет значение сервера переменной $, которая может быть или не определена.
Глобальная переменная определяется
$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']Пример:
$globalname=30
Пример кода: примеры/Пример global.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 | Тип | Пример |
|---|---|
| Число | 20 |
| нить | «Привет, мир», «Привет, мир» |
| stringp | "Мое имя {{var}}" |
| функция | namefunction (arg, arg) |
Установить var = 20 и var2 = "hello" и var3 = "hello {{var}}" и var4 = fn ()
| Зарезервированное слово | Объяснение |
|---|---|
| нулевой() | нулевое значение |
| ЛОЖЬ() | ложное значение |
| истинный() | Истинное значение |
| на() | 1 |
| Param (var, 'l1.l2.l3') | Разделяет массив (var) на var ['l1'] ['l2'] ['l3'] |
| выключенный() | 0 |
| Undef () | -1 (для неопределенного) |
| подбросить() | (специальное значение). Он инвертирует значение на <--> Используется как значение = flip () |
| сейчас() | Возвращает текущую временную метку (целое число) |
| таймер () | Возвращает текущую временную метку (целое число) |
| интервал () | Возвращает интервал (в секундах) между последним изменением и теперь. Он использует поле DatelastChange или метод DatelastChange () класса обратного вызова |
| FullInterval () | Возвращает интервал (в секундах) между началом процесса и теперь. Он использует полевой дат или метод dateInit () класса обратного вызова |
| содержит ()/str_contains () | Возвращает true, если текст содержится в другом тексте. Пример: str_contains (Field1, 'hi') |
| str_starts_with (), startwith () | Возвращает True, если текст начинается с другого текста |
| str_ends_with (), endwith () | Возвращает True, если текст заканчивается другим текстом. |
Пример: примеры/examplerServed.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 );Пример таймер: примеры/examplereservedtimer.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 );Эта часть выражения позволяет установить значение. Это выражение обычно является обязательным, и оно может быть опущено.
Это похоже на установку, но он выполняется раньше, где и независимо от того, есть ли, есть ли есть или нет.
Счетчик init = 20, где переменная1 = 20 установить переменную+счетчик
$ 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. Эта часть выражения добавляет условие к утверждению.
Мы также можем использовать «Когда».
где выражение
или
Когда выражение
Можно сравнивать больше, чем условие одновременно, разделяя «и" или "или".
где v1 = 10 и v2 = 20 или v3 <50
где переменная1 = 20 и $ переменная 2 = переменная3 или функция (20) = 40
где $ field = 20 и field2 <> 40 или Field3 = 40 // SQL Syntax
где $ field == 20 && field2! = 40 || Field3 =+40 // Синтаксис PHP
где 1 // это всегда верно
Эта часть выражения позволяет установить значение переменной. Можно установить более чем одну переменную одновременно, разделяя «," или "и".
Мы также можем использовать выражение «установить» или «тогда»
установить выражение
или
затем выражение
Эта часть выражения выполняется только в том случае, если есть действительнее
Мы могли бы установить переменную, используя следующие выражения:
Эта библиотека не допускает сложных инструкций, таких как
Установить переменную1 = 20 и $ variable2 = variable3 и функция (20) = 40
$ mini -> separate ( " when condition=1 then field1+10 " ); // if condition is 1 then it increases the field1 by 10. Эта необязательная часть выражения позволяет установить значение переменной. Можно установить более чем одну переменную одновременно, разделяя "," или "и".
Этот код оценивается только в том случае, если «где» возвращает неверно, если еще называется вручную.
else variable1 = 20 и $ variable2 = переменная3 и функция (20) = 40
Можно создать петлю, используя пространство «петля»
Чтобы начать петлю, вы должны написать
$ 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 И чтобы закончить петлю, вы должны использовать
$ this -> separate ( ' loop end ' );Вы можете избежать цикла, используя оператор «разрыв» в «Set» или «else».
$ this -> separate ( ' when condition set break else break ' );Примечание: петли оцениваются только при оценке всей логики. Он не работает с Evallogic () и Evallogic2 ()
Примечание: вы не можете добавить условие в цикл, однако вы можете пропустить цикл, назначающий пустой массив
Пример:
$ 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 (); Можно создать класс с логикой, созданной на языке. Цель состоит в том, чтобы повысить производительность кода.
Чтобы сгенерировать класс, сначала нам нужно написать логику, используя метод отдельный 2 () вместо отдельного () . Он хранит логику в массиве экземпляра класса. Вы можете использовать код напрямую, или вы можете сохранить внутри класса следующим образом:
// 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 ' );Это сохранит новый файл под названием? Пример basicclass.php (вы можете проверить пример? Пример/Genclass/1.ExampleBasic.php)
С генерируемым классом вы можете использовать этот новый класс вместо Миниланга . Поскольку этот класс уже составлен, тогда он быстро сверкает. Однако, если вам нужно изменить логику, вам нужно будет скомпилировать ее снова. (Вы можете проверить пример? Пример/Genclass/2.ExampleBasic.php и? Пример/Genclass/examplebasicclass.php)
$ result =[ ' var1 ' => ' hello ' ];
$ obj = new ExampleBasicClass ( null , $ result );
$ obj -> evalAllLogic ( true );Класс будет выглядеть как:
<?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 classГде каждый метод оценивает часть выражения.
Примеры/examplebenchmark.php
Мы называем некоторые операции 1000 раз.
Среднее создание нового языка сценариев на PHP