元代码结构

上一讲的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(
    表达式1,
    表达式2,
     .....
  ), )
array(
    'type'=>'if',
   //判断条件 'value'=>array( 'type'=>'bool', 'data'=>'true' ),
   //为真时执行的语句数组 'child'=>array( array( 'type'=>'=', 'object1'=>array('type'=>'variable','name'=>'$a'), 'object2'=>array('type'=>'int','data'=>1), ), array( 'type'=>'=', 'object1'=>array('type'=>'variable','name'=>'$b'), 'object2'=>array('type'=>'int','data'=>2), ) ) )
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'
        ),
    )
)

 

目录

引擎介绍

元代码结构

metaPHP数组的使用

函数的使用

类的定义和使用

杂七杂八的

修改已有代码

 

也欢迎进行QQ联系本人 ,交流我在开发metaPHP过程中的经验

QQ:309568486

posted @ 2017-09-22 00:19  浩然哥哥v5  阅读(589)  评论(0编辑  收藏  举报