يتم استخدام هذه المكتبة لتخزين منطق الأعمال في تعريف بسيط وقوي.
لغة نص صغيرة ل 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)
تقوم بإعادة ضبط التعريفات السابقة ولكن المتغيرات والخدمة والمناطق.
تعيين كائن المتصل. كائن المتصل يمكن أن يكون فئة خدمة ذات طريقة يمكن استدعاؤها داخل البرنامج النصي.
اضبط قاموسًا مع المتغيرات المستخدمة من قبل النظام.
يرسل تعبيرًا إلى Minilang ، ويتحلل في أجزائه. لا يتم تنفيذ البرنامج النصي ولكن تم تحليله.
يقيم المنطق. إنه يعود صحيحًا أو خطأ.
يقوم بتعيين قيمة أو قيم. لا يعتبر ما إذا كان المكان صحيح أم لا.
منطقية.
مجموعة من السلسلة. إذا كان 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 " );يقول إذا كان الحقل 1 = 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
مثال على أمثلة رمز/مثال على ذلك
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
مثال رمز: أمثلة/exampleglobal.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 |
| خيط | "Hello World" ، "Hello World" |
| سلسلة | "اسمي {{var}}" |
| وظيفة | NameFunction (Arg ، Arg) |
Set var = 20 و var2 = "Hello" و var3 = "Hello {{var}}" و var4 = fn ()
| كلمة محفوظة | توضيح |
|---|---|
| باطل() | قيمة فارغة |
| خطأ شنيع() | قيمة كاذبة |
| حقيقي() | القيمة الحقيقية |
| على() | 1 |
| param (var ، 'l1.l2.l3') | يفصل صفيف (var) إلى var ['l1'] ['l2'] ['l3'] |
| عن() | 0 |
| undef () | -1 (للاخلاف) |
| نقف() | (قيمة خاصة). يزداد قيمة على <-> OFF تستخدم كقيمة = flip () |
| الآن() | يعيد الطابع الزمني الحالي (عدد صحيح) |
| مؤقت () | يعيد الطابع الزمني الحالي (عدد صحيح) |
| فاصلة() | يعيد الفاصل الزمني (بالثواني) بين التغيير الأخير والآن. يستخدم حقل datelastchange أو طريقة datelastchange () لفئة رد الاتصال |
| fullinterval () | إرجاع الفاصل الزمني (بالثواني) بين بداية العملية والآن. يستخدم الحقل DateInit أو Method DateInit () لفئة رد الاتصال |
| يحتوي على ()/str_contains () | إرجاع صحيح إذا كان النص موجودًا في نص آخر. مثال: str_contains (Field1 ، 'hi') |
| str_starts_with () ، startWith () | إرجاع صحيح إذا بدأ النص بنص آخر |
| str_ends_with () ، endwith () | إرجاع صحيح إذا انتهى النص بنص آخر. |
مثال: أمثلة/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 );مثال مؤقت: أمثلة/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 Counter = 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
حيث variable1 = 20 و $ variable2 = variable3 أو الدالة (20) = 40
حيث حقل $ = 20 و field2 <> 40 أو Field3 = 40 // SQL Syntax
حيث $ حقل == 20 && field2! = 40 || Field3 =+40 // PHP Syntax
حيث 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. يسمح هذا الجزء الاختياري من التعبير بإعداد قيمة المتغير. من الممكن تعيين أكثر من متغير واحد في نفس الوقت عن طريق الفصل بواسطة "أو" و "و".
يتم تقييم هذا الرمز فقط إذا كان "حيث" يعيد خطأ إذا تم استدعاء آخر يدويًا.
متغير آخر = 20 و $ variable2 = variable3 و function (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 ' );يمكنك الهروب من الحلقة باستخدام "Break" المشغل في "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 ' );سوف يحفظ ملف جديد يسمى؟ examplebasicclass.php (يمكنك التحقق من المثال؟ مثال/genclass/1.examplebasic.php)
مع إنشاء الفصل ، يمكنك استخدام هذه الفئة الجديدة بدلاً من Minilang . منذ أن تم تجميع هذه الفئة بالفعل ، فإنه يحترق بسرعة. ومع ذلك ، إذا كنت بحاجة إلى تغيير المنطق ، فستحتاج إلى تجميعه مرة أخرى. (يمكنك التحقق من المثال؟ مثال/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