上一讲的demo中,我们遇到了第一个元代码
$metaApi->codeMeta = array( 'type'=>'window', 'child'=>array( array( 'type'=>'phpBegin' ), array( 'type'=>'echo', 'value'=>array( 'type'=>'string', 'data'=>'Hello World', ), ) ), );
这是一个类似json的结构,json是独立于编程语言的数据格式,这也就意味着不一定非要用php来生成这个json,用任何语言生成json后,通过metaPHP都可以生成php的对应代码。
下面我们讲解一下元代码的编写
整个元代码是一个属性结构,位于根结构的是type=window的,代表着整个代码的跟结构,包含child数组属性,里面包含着所有子元代码,一层一层子元素。例如函数调用的参数是函数调用的子结构。函数的正文,是函数的子结构。加法运算的两个元素是加法运算的子结构。
基础元素
类型 | 元代码 | 生成结果 |
字符串 |
array( 'type'=>'string', 'data'=>'Hello World', ) |
'Hello World' |
数字 |
array( 'type'=>'int', 'data'=>100, ) 或 array( 'type'=>'int', 'data'=>'100', ) |
100
|
布尔值 |
array( 'type'=>'bool', 'data'=>'true', ) |
true |
变量 |
array( 'type'=>'variable', 'data'=>'$name', ) |
$name
|
二元运算符:(左+运算符+右)
运算符左右两侧,分别是参与运算的两个子表达式
例如【$a=1+2】运算是【=】参与运算的是左右两个分别是【$a】和【1+2】两个子表达式
例如【5+4】运算符【+】参与运算的是左右两个分别是【5】和【4】两个子表达式
例如【$a>10】运算符【>】参与运算的是左右两个分别是【$a】和【10】两个子表达式
这一类运算符有如下这些'&&','^','||','or','[]=','+=','-=','==','===','>=','<=','!==','!=','>','<','.','+','-','=','.='
左+运算符+右,这种表达式都是使用下面这种形式来表达
array( 'type'=>运算符 'object1'=>左表达式 'object2'=>右表达式 )
那么$a=1+2怎么则可以拆解成,一个等式运算,右侧表达式可以继续拆解成一个+运算
array( 'type'=>'=', 'object1'=>array( 'type'=>'variable', 'name'=>'$a' ), 'object2'=>array( 'type'=>'+', 'object1'=>array('type'=>'int','data'=>1), 'object2'=>array('type'=>'int','data'=>2), ) )
一元运算符
与二元运算对应的还有一元运算符,例如++操作【$count++】、--操作【$count--】、非运算【!$fine】、引用运算符&【&$count】
则使用如下语法
array( 'type'=>'++', 'object'=>对象, )
demo
array( 'type'=>'++', 'object'=>array( 'type'=>'variable', 'name'=>'$count' ), ) //生成 $count++
三元运算符
就是【?】运算符
以一个demo举例
$isTrue?1:0;
对应metaPHP元代码是
array( 'type'=>'?', 'value'=>array( 'type'=>'variable', 'name'=>'$isTrue' ), 'object1'=>array( 'type'=>'int', 'data'=>1 ), 'object2'=>array( 'type'=>'int', 'data'=>0 ) )
value属性保存【?】前面的表达式,object1保存【?】后面的表达式,object2保存【:】后面的表达式
循环和判断
if、elseif和else
类型 | 语法 | demo | demo结果 |
if |
array( 'type'=>'if', 'value'=>条件判断表达式, 'child'=>array( |
array( 'type'=>'if', |
if(true){ $a=1; $b=2; }
|
elseif |
array( 'type'=>'elseif', 'value'=>条件判断表达式, 'child'=>array( 表达式1, 表达式2, ..... ), ) |
array( 'type'=>'if', 'value' =>array('type'=>'bool','data'=>'true'), 'child'=>array( //表达式 ) ), array( 'type'=>'elseif' 'value'=>array('type'=>'bool','data'=>'true'), 'child'=>array( //表达式 ) ) |
if(true){ 表达式 }elseif(true){ 表达式 } |
else |
array( 'type'=>'else', 'child'=>array( 表达式1, 表达式2, ..... ), ) |
array( 'type'=>'if', 'value' =>array('type'=>'bool','data'=>'true'), 'child'=>array( //表达式 ) ), array( 'type'=>'elseif' 'value'=>array('type'=>'bool','data'=>'true'), 'child'=>array( //表达式 ) ), array( 'type'=>'else' 'child'=>array( //表达式 ) ) |
if(true){ //表达式 }elseif(true){ //表达式 }else{ //表达式 } |
for、foreach、while循环
/* for(表达式1;表达式2;表达式3){ 语句1; 语句2; } */ array( 'type'=>'for', 'value'=>array( 表达式1元代码, 表达式2元代码, 表达式3元代码 ), child=>array( 语句1元代码, 语句2元代码, ...... ), )
用type、value、child三个属性组成,value存放for循环的‘三个参数’,child数组存放的是大括号里循环执行的语句
demo
for($i=0;$i<4;$i++){ echo $i; }
那么元代码就是
array( 'type'=>'for', 'value'=>array( //$i=0 array( 'type'=>'=', 'object1'=>array('type'=>'variable','name'=>'$i'), 'object2'=>array('type'=>'int','data'=>'0'), ), //$i<5 array( 'type'=>'<', 'object1'=>array('type'=>'variable','name'=>'$i'), 'object2'=>array('type'=>'int','data'=>'4'), ), //$i++ array( 'type'=>'++', 'object1'=>array('type'=>'variable','name'=>'$i'), ), ), child=>array( array( 'type'=>'echo', 'value'=>array( 'type'=>'variable', 'name'=>'$i', ), ), ), )
while和foreach都是用type、value、child三个属性组成,只不过在value内部结构上有一些区别,while的value不再是一个数组,而是一个单一表达式元代码,foreach则是一个包含object/key/value属性的对象。
for | while(或do while循环) | foreach |
array( 'type'=>'for', 'value'=>array( 表达式1元代码, 表达式2元代码, 表达式3元代码 ), child=>array( 语句1元代码, 语句2元代码, ...... ), ) |
array( 'type'=>'while', 'value'=>判断表达式元代码, child=>array( 语句1元代码, 语句2元代码, ...... ), ) |
/* foreach(遍历对象 as 键=>值){ } */ array( 'type'=>'while', 'value'=>array( 'object'=>遍历对象, 'key'=>键, 'value'=>值 ), child=>array( 语句1元代码, 语句2元代码, ...... ), ) 如果使用foreach(对象 as 值)这种忽略’键‘的 形式则不添加value里的key即可 |
在循环中直接使用break和continue,则可以直接作为type=break或者type=continue使用
例如循环里使用了break
while($count<3){ break; }
array( 'type'=>'while', 'value'=>array( 'type'=>'<', 'object1'=>array('type'=>'variable','name'=>'$count') ) 'child'=>array( array( 'type'=>'break' ), ) )
目录
也欢迎进行QQ联系本人 ,交流我在开发metaPHP过程中的经验
QQ:309568486