模板设计.变量作用域
1 代码赋值变量作用范围
在php代码中赋值的变量,作用域为全局, 在模板中、包含引入的文件、母版文件、插件等都可以使用。
define('ROOT_DIR', __DIR__);
date_default_timezone_set('PRC');
require(ROOT_DIR . '/vendor/autoload.php');
use sdopx\Sdopx;
$sdopx = new Sdopx();
//设置模板目录
$sdopx->setTemplateDir('./view');
//设置编译代码存放目录
$sdopx->setCompileDir('./runtime');
//赋值变量,全局可用
$sdopx->assign('title', 'Hello Sdopx');
$sdopx->assign('firstname', 'Doug');
$sdopx->assign('lastname', 'Evans');
$sdopx->assign('meetingPlace', 'New York');
$sdopx->assign('foot_content', 'foot content...');
//显示模板
$sdopx->display('index.tpl');
index.tpl
{extends file='layout.tpl'}
{block name=body}
<h1>{$title}</h1>
Hello {$firstname} {$lastname}, glad to see you can make it.
<p>Welcome to {$meetingPlace}</p>
{/block}
layout.tpl
<!DOCTYPE html>
<html>
<head>
<title>{$title}</title>
<meta charset="utf-8"/>
</head>
<body>
{block name=body}hello{/block}
{include file="foot.tpl"}
</body>
</html>
foot.tpl
{literal left='<@' right='@>'}
<div data-option='{opt:1}'><@$foot_content@></div>
{/literal}
输出:
<!DOCTYPE html>
<html>
<head>
<title>Hello Sdopx</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>Hello Sdopx</h1>
Hello Doug Evans, glad to see you can make it.
<p>Welcome to New York</p>
<div data-option='{opt:1}'>foot content...</div>
</body>
</html>
在模板中赋值变量的作用域范围
Sdopx 是允许在模板中赋值变量的,但是在模板中赋值的变量分为全局和局部变量
使用 {assign $var='value'} 和 {global $val='value'} 来赋值变量,也可以使用 {assign var='key' value='value'} 和 {global var='key' value='value'} 来赋值变量
{assign} 赋值的是局部变量,生命周期仅限于所在的代码块之中,或者文件之中,而{global} 所赋值的变量和 php 中使用 $sdopx->assign('title', 'hello sdopx'); 赋值的是一致的。
{function fn='func1' name='zhangsan'}
{$name} -- 局部变量<br/>
{assign $name='baa'} -- 改写局部变量<br/>
{$name} -- 局部变量<br/>
{assign var=data value=['key'=>'kkk']} -- 赋值一个局部对象<br/>
{assign $data.box='baa'} -- 局部变量赋值<br/>
{$data.key} -- 局部变量显示<br/>
{$data.box} -- 局部变量显示<br/>
{global $gname='this is global variable!'} -- 赋值一个全局变量<br/>
{$gname} -- 赋值变量会显示<br/>
{/function}
{call fn='func1'} -- 调用函数 func1<br/>
{$name|default:''} -- name 是局部变量,只在函数内有效,不会显示<br/>
{$gname} -- gname是全局变量,在所有位置都可以使用,会显示<br/>
输出:
zhangsan -- 局部变量<br/>
-- 改写局部变量<br/>
baa -- 局部变量<br/>
-- 赋值一个局部对象<br/>
-- 局部变量赋值<br/>
kkk -- 局部变量显示<br/>
baa -- 局部变量显示<br/>
-- 赋值一个全局变量<br/>
this is global variable! -- 全局变量会显示<br/>
-- 调用函数 func1<br/>
-- name 是局部变量,只在函数内有效,不会显示<br/>
this is global variable! -- gname是全局变量,在所有位置都可以使用,会显示<br/>
在函数内注册的局部变量在外部不可使用。
又如:
{for $i=0; $i<10;$i++}
{assign $name='baa'}-- 改写局部变量
{global $gname='this is global variable!'}-- 赋值一个全局变量
{$gname}-- 全局变量会显示
{$i}-- 显示局部变量
{/for}
{$i|default:''}-- 局部变量不会显示
{$name|default:''}- 局部变量不会显示
{$gname}-- 全局变量会显示
{if true}
{assign $name='baa'}
{/if}
{$name} -- 会显示,在当前模板页内有效
输出:
-- 改写局部变量
-- 赋值一个全局变量
this is global variable!-- 全局变量会显示
0-- 显示局部变量
-- 局部变量不会显示
- 局部变量不会显示
this is global variable!-- 全局变量会显示
baa -- 会显示,在当前模板页内有效
在for,foreach while function 及其他标记内赋值的变量在外部不可使用,而判断标签 if elseif else中赋值的局部变量 则认为是和 if 所在的区域一致所以 {$name} 会显示。