PHP模板函数的参数

PHP模板函数的参数,php,coding-style,Php,Coding Style,这更像是一个风格问题。我有一个模板文件header.php,其中定义了一个PrintHeader函数 此函数的调用者可以通过全局变量指定页面的标题以及打印标题时要包含的任何Javascript脚本,因为肯定不是每个页面都有相同的标题或希望包含相同的脚本。我选择使用全局变量而不是函数参数,因为后者需要在添加新参数时更改接口 这被认为是一种好的风格吗?有没有更好的方式来完成我想做的事情 header.php简化 index.php简化 虽然旁观者可能会觉得更好,但我建议使用某种函数来设置页面位,而不

这更像是一个风格问题。我有一个模板文件header.php,其中定义了一个PrintHeader函数

此函数的调用者可以通过全局变量指定页面的标题以及打印标题时要包含的任何Javascript脚本,因为肯定不是每个页面都有相同的标题或希望包含相同的脚本。我选择使用全局变量而不是函数参数,因为后者需要在添加新参数时更改接口

这被认为是一种好的风格吗?有没有更好的方式来完成我想做的事情

header.php简化

index.php简化


虽然旁观者可能会觉得更好,但我建议使用某种函数来设置页面位,而不是公开原始变量。例如,不做$pageTitle='Welcome';您可以设置页面标题“欢迎”


对于JavaScript,您可以有一个添加到当前脚本集的函数,而不可能全部替换它,例如add_JavaScript$code;。这将允许开发人员设置所有这些变量,而不必跟踪变量名是什么,如果他们想在函数中设置它,也不需要全局设置

虽然旁观者可能认为更好,但我建议使用某种函数来设置页面位,而不是公开原始变量。例如,不做$pageTitle='Welcome';您可以设置页面标题“欢迎”


对于JavaScript,您可以有一个添加到当前脚本集的函数,而不可能全部替换它,例如add_JavaScript$code;。这将允许开发人员设置所有这些变量,而不必跟踪变量名是什么,如果他们想在函数中设置它,也不需要全局设置

使用全局变量当然是不可取的,我质疑是否有必要像您一样使用herdeoc——并不是说herdeoc本身就有什么问题,只是您似乎在这个示例模板中任意使用了它

$tpl = new Template;
$tpl->assign('pageTitle', 'My page title!');
$tpl->render('header.php');
使用函数的返回值作为每个模板的输出是不优雅的-这违背了模板的一个目的,即可重用性


看一看,如果不直接使用它,为什么要重新发明轮子,至少要了解如何使用渲染类在模板所需的变量中穿梭,而不使用混乱的全局变量。

使用全局变量肯定是不可取的,我质疑使用heredoc的必要性——并不是说heredoc本身就有什么问题,只是你似乎在这个示例模板中任意使用了它

$tpl = new Template;
$tpl->assign('pageTitle', 'My page title!');
$tpl->render('header.php');
使用函数的返回值作为每个模板的输出是不优雅的-这违背了模板的一个目的,即可重用性


看一看,如果不直接使用它,为什么要重新发明轮子,至少要了解如何使用渲染类在模板所需的变量中穿梭,而不使用混乱的全局变量。

下面是一个模板制作方法的快速概述:

您有一个模板类,可以为其指定数据,然后呈现模板

$tpl = new Template;
$tpl->assign('pageTitle', 'My page title!');
$tpl->render('header.php');
Template.php:

class Template
{
    protected $data = array();
    public function assign($key, $value)
    {
        $this->data[$key] = $value;
    }

    public function render($file)
    {
        extract($this->data);
        require $file;
    }
}
然后就有了模板header.php:

<html>
 <head>
   <title><?php echo $pageTitle; ?></title>
....

这只是一个简单的示例来演示这个想法,可以为您提供一个良好的起点。

下面是一个非常快速的模板制作方法概述:

您有一个模板类,可以为其指定数据,然后呈现模板

$tpl = new Template;
$tpl->assign('pageTitle', 'My page title!');
$tpl->render('header.php');
Template.php:

class Template
{
    protected $data = array();
    public function assign($key, $value)
    {
        $this->data[$key] = $value;
    }

    public function render($file)
    {
        extract($this->data);
        require $file;
    }
}
然后就有了模板header.php:

<html>
 <head>
   <title><?php echo $pageTitle; ?></title>
....

这只是一个简单的例子来说明这个想法,可以给你一个很好的起点。

全局变量通常被认为是不好的,如果可能的话应该避免

不要像您所说的那样列出接口中的每个变量,而是将单个数组传递给PrintHeader函数:

<?php
function PrintHeader($opts=array()) {
    if(!isset($opts['title'])) $opts['title'] = 'Default Title';
    echo <<<HEADER
    <html>
     <head>
      <title>$opts['title']</title>
    HEADER;

    if(!empty($opts['scripts'])) {
        foreach($opts['scripts'] as $script) {
            echo "  <script type=\"text/javascript\" src=\"$script.js\"></script>\n";
        }
    }
    echo " </head>\n";
}

$opts = array('title'=>'Welcome',
              'scripts'=>array('script1', 'script2'));
require('header.php');
PrintHeader($opts);
?>

通过这种方式,您可以在函数中添加新功能,而无需中断旧代码。

全局变量通常被认为是不好的,如果可能,应该避免使用

不要像您所说的那样列出接口中的每个变量,而是将单个数组传递给PrintHeader函数:

<?php
function PrintHeader($opts=array()) {
    if(!isset($opts['title'])) $opts['title'] = 'Default Title';
    echo <<<HEADER
    <html>
     <head>
      <title>$opts['title']</title>
    HEADER;

    if(!empty($opts['scripts'])) {
        foreach($opts['scripts'] as $script) {
            echo "  <script type=\"text/javascript\" src=\"$script.js\"></script>\n";
        }
    }
    echo " </head>\n";
}

$opts = array('title'=>'Welcome',
              'scripts'=>array('script1', 'script2'));
require('header.php');
PrintHeader($opts);
?>
这样,您就可以在函数中添加新功能,而无需中断旧代码

有没有更好的方法来做我想做的事

当然。 我认为定义和调用函数毫无意义。以及使用heredoc

header.php大大简化了:

<html>
 <head>
  <title><?=$pageTitle?></title>

<? if( !empty($scripts) ): ?>
  <?  foreach($scripts as $script): ?>
<script type="text/javascript" src="<?=$script?>.js"></script>
  <? endforeach ?>
<? endif ?>
  </head>
<?
//include our settings, connect to database etc.
include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php';
//getting required data
$DATA = getdata("SELECT * FROM links");
$pagetitle = "Links to friend sites";
//etc
//and then call a template:
$tpl = "links.tpl.php";
include "main.tpl.php";
?>
最后,links.tpl.php是实际的页面模板:

<h2><?=$pagetitle?></h2>
<ul>
<? foreach($DATA as $row): ?>
<li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li>
<? endforeach ?>
<ul>
请注意本机HTML语法,它突出显示、可读并集中在一个位置,而不是在众多函数和文件之间分割

关键在于每个PH值都有单独的模板 P页以及他们所有的主要网站模板。使用这种设置,您将获得许多优势,例如自定义错误页面、相同数据的多种表示形式(如HTML、JSON或XML),只需切换模板而不更改代码等等

有没有更好的方法来做我想做的事

当然。 我认为定义和调用函数毫无意义。以及使用heredoc

header.php大大简化了:

<html>
 <head>
  <title><?=$pageTitle?></title>

<? if( !empty($scripts) ): ?>
  <?  foreach($scripts as $script): ?>
<script type="text/javascript" src="<?=$script?>.js"></script>
  <? endforeach ?>
<? endif ?>
  </head>
<?
//include our settings, connect to database etc.
include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php';
//getting required data
$DATA = getdata("SELECT * FROM links");
$pagetitle = "Links to friend sites";
//etc
//and then call a template:
$tpl = "links.tpl.php";
include "main.tpl.php";
?>
最后,links.tpl.php是实际的页面模板:

<h2><?=$pagetitle?></h2>
<ul>
<? foreach($DATA as $row): ?>
<li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li>
<? endforeach ?>
<ul>
请注意本机HTML语法,它突出显示、可读并集中在一个位置,而不是在众多函数和文件之间分割



重点在于为每个PHP页面提供单独的模板,以及为所有页面提供主站点模板。通过这种设置,您将获得许多优势,如自定义错误页面、相同数据的多种表示形式(如HTML、JSON或XML),只切换模板而不更改代码,以及更多的

google global variables Bad google global variables Bad这看起来根本不像模板。但更像是一些糟糕的意大利面,这不是我的代码,这是OP的代码。我刚刚演示了如何使用哈希数组代替glabal varaiblesthats,它看起来根本不像模板。但更像是一些糟糕的意大利面,这不是我的代码,这是OP的代码。我刚刚演示了如何使用哈希数组代替glabal varaiblesThanks。实际上,我使用的模板函数更多的只是PrintHeader,但我只提到了PrintHeader,因为同样的问题也适用于使用调用者设置的变量的其他模板函数。我本可以说得更清楚。很明显,您使用的函数更多。不过,我认为使用它们没有任何意义。好吧,到目前为止,我同意你的看法,但是如果$DATA由HTML内容组成,比如第1段

第2段

,那该怎么办呢。您是否建议将该标记放在另一个文件中,比如page_content.php和doing$DATA=file_get_contents'page_content.php';?这是否意味着每个mypage.php都有一个对应的mypage_content.php?对于$DATA来说,不可能由HTML组成。这是数据,正如它的名字清楚地表明的那样。它是由HTML组成的模板。你读过我的答案吗?这就是我要说的:我已经将页面标记放入另一个文件links.tpl.php中,并从主模板调用它。是的,每个PHP页面都应该有单独的模板。这就是重点。每个页面的模板是使用模板的关键。我应该在回答中更好地阐明这一点。使用这种设置,您将获得许多优势,例如自定义错误页面、相同数据的多个表示形式(如HTML、JSON或XML),只需切换模板,而无需更改代码,谢谢。实际上,我使用的模板函数更多的只是PrintHeader,但我只提到了PrintHeader,因为同样的问题也适用于使用调用者设置的变量的其他模板函数。我本可以说得更清楚。很明显,您使用的函数更多。不过,我认为使用它们没有任何意义。好吧,到目前为止,我同意你的看法,但是如果$DATA由HTML内容组成,比如第1段

第2段

,那该怎么办呢。您是否建议将该标记放在另一个文件中,比如page_content.php和doing$DATA=file_get_contents'page_content.php';?这是否意味着每个mypage.php都有一个对应的mypage_content.php?对于$DATA来说,不可能由HTML组成。这是数据,正如它的名字清楚地表明的那样。它是由HTML组成的模板。你读过我的答案吗?这就是我要说的:我已经将页面标记放入另一个文件links.tpl.php中,并从主模板调用它。是的,每个PHP页面都应该有单独的模板。这就是重点。每个页面的模板是使用模板的关键。我应该在回答中更好地阐明这一点。使用这种设置,您将获得许多优势,例如自定义错误页面、相同数据的多个表示形式(如HTML、JSON或XML),只需切换模板,而无需更改代码,谢谢。当调用第二个模板(比如links.php)时,我希望避免传递过时的数据。所以我需要1或1。给类模板一个clearData函数;2.为调用的每个模板创建一个新的模板实例;3.还有别的。哪种方法更可取?@Anson一种方法是修改它以允许将数据分配给特定模板。有很多方法可以扩展它,这里的意思是作为一个起点,展示一个常用的模板方法:谢谢。当调用第二个模板(比如links.php)时,我希望避免传递过时的数据。所以我需要1或1。给类模板一个clearData函数;2.为调用的每个模板创建一个新的模板实例;3.还有别的。哪种方法更可取?@Anson一种方法是修改它,允许将数据分配给
一个特定的模板。有很多方法可以扩展它,这里的意思是作为一个起点,展示一个常用的模板方法:谢谢。那么set_page_title是对全局变量还是局部变量进行操作呢?Global的意思是类似于函数集_page _title$s{Global$pageTitle;$pageTitle=s;},它不会改变数据存储在全局中的事实,只是对用户隐藏它。如果你说的是局部变量,你能描述一下如何将它传递给模板函数吗?你需要某种全局变量来存储所有的模板变量。我建议使用关联数组,这样您只需全局处理一个变量,而不必全局处理它们。你是对的,没有消除全局性,只是对他们隐藏了模板的内部。如果您决定$template['title']最终应为$template['page_title'],则如果您更新set_page_title,开发人员无需更改其代码。谢谢。那么set_page_title是对全局变量还是局部变量进行操作呢?Global的意思是类似于函数集_page _title$s{Global$pageTitle;$pageTitle=s;},它不会改变数据存储在全局中的事实,只是对用户隐藏它。如果你说的是局部变量,你能描述一下如何将它传递给模板函数吗?你需要某种全局变量来存储所有的模板变量。我建议使用关联数组,这样您只需全局处理一个变量,而不必全局处理它们。你是对的,没有消除全局性,只是对他们隐藏了模板的内部。如果您决定$template['title']最终应为$template['page_title'],则如果您更新set_page_title,开发人员不必更改其代码。