Perpustakaan ini digunakan untuk menyimpan logika bisnis dalam definisi yang sederhana namun kuat.
Bahasa skrip mini untuk php. Ini melakukan tiga tugas sederhana.
Misalnya :
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.
Terkadang kita perlu menjalankan kode sewenang -wenang berdasarkan "Jika beberapa nilai sama dengan, maka kita mengatur atau menjalankan kode lain."
Dalam PHP, kita bisa melakukan kode berikutnya.
if ( $ condition ) {
$ variable = 1 ;
}Namun, kode ini dieksekusi saat runtime. Bagaimana jika kita perlu menjalankan kode ini di titik tertentu?.
Kami bisa melakukan kode berikutnya:
$ script = ' if($condition) {
$variable=1;
} ' ;
// and later..
eval ( $ script );Solusi ini berfungsi (dan hanya dieksekusi jika kita memanggil perintah eval). Tapi itu bertele -tele, rentan terhadap kesalahan, dan itu berbahaya.
Perpustakaan kami melakukan hal yang sama tetapi aman dan bersih.
$ mini -> separate ( " when condition then variable=1 " );Menginstalnya menggunakan komposer:
Komposer membutuhkan EFTEC/MINIRANG
Membuat proyek baru
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 );Contoh lain:
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)
Ini mengatur ulang definisi sebelumnya tetapi variabel, layanan, dan area.
Atur objek penelepon. Objek penelepon itu bisa menjadi kelas layanan dengan metode yang dapat dipanggil di dalam skrip.
Atur kamus dengan variabel yang digunakan oleh sistem.
Ini mengirimkan ekspresi ke minilan, dan terurai di bagian -bagiannya. Script tidak dieksekusi tetapi diuraikan.
Itu mengevaluasi logika. Itu mengembalikan benar atau salah.
Itu menetapkan nilai atau nilai. Itu tidak mempertimbangkan apakah di mana benar atau tidak.
Boolean.
Array string. Jika $ Throwerror salah maka setiap kesalahan disimpan di sini.
Contoh:
$ this -> throwError = false ;
$ mini -> separate ( " when FIELDDOESNOTEXIST=1 then field2=2 " );
var_dump ( $ this -> errorLog );Sintaksis kode dipisahkan menjadi empat bagian. Init, di mana (atau kapan), atur (atau kemudian) dan lainnya.
Contoh:
$ mini -> separate ( " when field1=1 then field2=2 " );Dikatakan jika field1 = 1 maka kami mengatur field2 sebagai 2.
Variabel didefinisikan oleh varname
Contoh: Contoh/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=3Variabel dapat meng -host objek PHP, dan dimungkinkan untuk menelepon dan mengakses bidang di dalamnya.
varname.field
Contoh Contoh Kode/Esamplevariable2.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 );Variabel dapat menampung array asosiatif/indeks, dan dimungkinkan untuk membaca dan mengakses elemen di dalamnya.
Contoh:
$ 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)Contoh contoh kode/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 );Variabel global mengambil nilai PHP ($ global), jadi tidak perlu didefinisikan atau ditetapkan di dalam bahasa
Catatan: Untuk tujuan keamanan. Variabel global yang didefinisikan oleh PHP sebagai "$ _namevar" tidak dapat dibaca atau dimodifikasi. Jadi, jika Anda ingin melindungi variabel global, maka Anda dapat mengganti nama dengan garis bawah sebagai awalan.
Contoh: Jika Anda mencoba membaca variabel $ _server, maka itu akan mengembalikan nilai variabel $ server yang bisa atau tidak.
Variabel global didefinisikan oleh
$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']Contoh:
$globalname=30
Contoh Kode: Contoh/contohglobal.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 | Jenis | Contoh |
|---|---|
| Nomor | 20 |
| rangkaian | "halo dunia", 'halo dunia' |
| stringp | "Nama saya {{var}}" |
| fungsi | Namefunction (arg, arg) |
set var = 20 dan var2 = "hello" dan var3 = "hello {{var}}" dan var4 = fn ()
| Kata yang dipesan | Penjelasan |
|---|---|
| batal() | nilai nol |
| PALSU() | nilai palsu |
| BENAR() | nilai sejati |
| pada() | 1 |
| param (var, 'l1.l2.l3') | Memisahkan array (var) menjadi var ['l1'] ['l2'] ['l3'] |
| mati() | 0 |
| undef () | -1 (untuk tidak ditentukan) |
| membalik() | (Nilai Khusus). Itu membalikkan nilai di <-> OFF Digunakan sebagai nilai = flip () |
| Sekarang() | Mengembalikan stempel waktu saat ini (integer) |
| timer () | Mengembalikan stempel waktu saat ini (integer) |
| selang() | Mengembalikan interval (dalam detik) antara perubahan terakhir dan sekarang. Itu menggunakan bidang DatelasTchange atau metode datelastchange () dari kelas callback |
| fullinterval () | Mengembalikan interval (dalam detik) antara awal proses dan sekarang. Ini menggunakan DateInit Field atau Metode DateInit () dari kelas Callback |
| contains ()/str_contains () | Mengembalikan true jika teks terkandung dalam teks lain. Contoh: str_contains (field1, 'hai') |
| str_starts_with (), startwith () | Mengembalikan true jika teks dimulai dengan teks lain |
| str_ends_with (), endwith () | Mengembalikan true jika teks berakhir dengan teks lain. |
Contoh: Contoh/examplereserved.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 );Contoh Timer: Contoh/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 );Bagian ekspresi ini memungkinkan pengaturan nilai. Ekspresi ini biasanya opsional, dan bisa dihilangkan.
Ini mirip dengan set, tetapi dieksekusi sebelum di mana dan tidak masalah apakah di mana valid atau tidak.
init counter = 20 di mana variabel1 = 20 set variabel+penghitung
$ 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. Bagian ekspresi ini menambah kondisi pada pernyataan tersebut.
Kami juga dapat menggunakan "When."
dimana ekspresi
atau
Saat ekspresi
Dimungkinkan untuk membandingkan lebih dari suatu kondisi secara bersamaan dengan memisahkan dengan "dan" atau "atau."
dimana v1 = 10 dan v2 = 20 atau v3 <50
dimana variabel1 = 20 dan $ variabel2 = variabel3 atau fungsi (20) = 40
dimana $ field = 20 dan field2 <> 40 atau field3 = 40 // sintaks sql
di mana $ field == 20 && field2! = 40 || Field3 =+40 // Sintaks PHP
dimana 1 // itu selalu benar
Bagian ekspresi ini memungkinkan pengaturan nilai variabel. Dimungkinkan untuk mengatur lebih dari satu variabel secara bersamaan dengan memisahkan oleh "," atau "dan."
Kami juga dapat menggunakan ekspresi "set" atau "kemudian"
atur ekspresi
atau
lalu ekspresi
Bagian ekspresi ini hanya dieksekusi jika di mana valid
Kami dapat mengatur variabel menggunakan ekspresi berikutnya:
Perpustakaan ini tidak mengizinkan instruksi yang rumit seperti
Set variabel1 = 20 dan $ variable2 = variabel3 dan fungsi (20) = 40
$ mini -> separate ( " when condition=1 then field1+10 " ); // if condition is 1 then it increases the field1 by 10. Bagian opsional dari ekspresi ini memungkinkan pengaturan nilai suatu variabel. Dimungkinkan untuk mengatur lebih dari satu variabel secara bersamaan dengan memisahkan oleh "," atau "dan".
Kode ini hanya dievaluasi jika "di mana" mengembalikan false jika lain disebut secara manual.
lain variabel1 = 20 dan $ variabel2 = variabel3 dan fungsi (20) = 40
Dimungkinkan untuk membuat loop menggunakan spasi "loop"
Untuk memulai satu lingkaran, Anda harus menulis
$ 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 Dan untuk mengakhiri loop, Anda harus menggunakan
$ this -> separate ( ' loop end ' );Anda dapat keluar dari loop menggunakan operator "Break" di "Set" atau "Else".
$ this -> separate ( ' when condition set break else break ' );Catatan: Loop hanya dievaluasi saat Anda mengevaluasi semua logika. Itu tidak bekerja dengan evallogic () dan evallogic2 ()
Catatan: Anda tidak dapat menambahkan kondisi ke loop, namun Anda dapat melewatkan loop yang menetapkan array kosong
Contoh:
$ 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 (); Dimungkinkan untuk membuat kelas dengan logika yang dibuat dalam bahasa. Tujuannya adalah untuk meningkatkan kinerja kode.
Untuk menghasilkan kelas, pertama -tama kita perlu menulis logika menggunakan metode terpisah2 () alih -alih terpisah () . Ini akan menyimpan logika di dalam array dari contoh kelas. Anda dapat menggunakan kode secara langsung, atau Anda dapat menyimpan di dalam kelas sebagai berikut:
// 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 ' );Itu akan menyimpan file baru yang dipanggil? ExampleBasicclass.php (Anda dapat memeriksa contoh? Contoh/genclass/1.exampleBasic.php)
Dengan kelas yang dihasilkan, Anda dapat menggunakan kelas baru ini alih -alih minilan . Karena kelas ini sudah dikompilasi, maka itu berkobar cepat. Namun, jika Anda perlu mengubah logika, maka Anda harus mengkompilasinya lagi. (Anda dapat memeriksa contohnya? Contoh/genclass/2.exampleBasic.php dan? Contoh/genclass/exampleBasicclass.php)
$ result =[ ' var1 ' => ' hello ' ];
$ obj = new ExampleBasicClass ( null , $ result );
$ obj -> evalAllLogic ( true );Kelas akan terlihat seperti:
<?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 classDi mana setiap metode mengevaluasi bagian dari ekspresi.
Contoh/exampleBenchmark.php
Kami menyebut beberapa operasi 1000 kali.
Membuat Sedang Bahasa Scripting Baru di PHP