模板设计.变量作用域


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} 会显示。

上一篇:模板设计-变量
下一篇:变量输出修饰器
Copyright © 2021 海南的叶子 All Rights Reserved 琼ICP备2021000725号

琼公网安备 46900702000037号