How to pass arguments to an included file?

前端 未结 9 1934
無奈伤痛
無奈伤痛 2020-12-14 05:53

I\'m trying to make the whole section its own include file. One drawback is the title and description and keyword will be the same; I can\'t figure

相关标签:
9条回答
  • 2020-12-14 06:35

    I noticed nobody suggested using a template engine. I came looking here because for the project I'm working with, a template engine isn't possible and that might be your situation too, however I thought it might be worth mentioning these: Twig (my preferred engine) and Smarty both allow passing specific variables to includes.

    I highly recommend the use of a template engine whenever possible, as it simplifies your front end code, adds a layer of abstraction between your front end and back end, and both Twig and Smarty automatically clean the variables you pass to them which helps mitigate XSS attacks.

    Twig Example

    header.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <link rel="shortcut icon" href="favicon.ico">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="Keywords" content="{{ header }}" >
    <meta name="Description" content="{{ header }}" >
    <title> {{ header }} </title>
    <link rel="stylesheet" type="text/css" href="reset.css" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    </head>
    

    index.html

    {% include 'header.html' with { 'header' : '<script>alert("this shouldnt work")</script>'} only %}
    Body Text
    {% include 'footer.html' %}
    

    Smarty Example

    header.tpl

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <link rel="shortcut icon" href="favicon.ico">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="Keywords" content="{$header}" >
    <meta name="Description" content="{$header}" >
    <title> {$header} </title>
    <link rel="stylesheet" type="text/css" href="reset.css" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    </head>
    

    index.tpl

    {include 'header.tpl' header='<script>alert("this shouldnt work")</script>'}
    Body Text
    {include 'footer.tpl'}
    
    0 讨论(0)
  • 2020-12-14 06:36

    you are over thinking it

    <?php 
    $header = "aaaaaaaaaaaaaaaaa";
    include("header.php"); 
    ?>
    

    ::EDIT::

    Decided I would add value

    The included file will gain the scope of where you included it. So if you include a file INSIDE a function:

    <?php
    $get_me = "yes";
    function haha()
    {
    include("file.php");
    }
    haha();
    
    // And file.php looks like
    
    echo $get_me; // notice + blank
    
    ?>
    

    More over, you include the same file more than once to great effect.

    <?php
    
    $output = "this";
    include("cool_box.php");
    
    $output = "will";
    include("cool_box.php");
    
    $output = "work";
    include("cool_box.php");
    
    ?>
    

    And even use this to load templates that become part of a method in a class. So you can do something like:

    <?php
    
    class template
    {
    
        private $name;
    
        function __construct($name)
        {
            $this->name = preg_replace("/[^a-zA-Z0-9]/", "", $name);
        }
    
        function output(array $vars)
        {
            include($this->name.".php"); // Where $vars is an expected array of possible data
        }
    
    }
    
    $head = new template("header");
    $body = new template("body");
    $head->output();
    $head->output(array("content" => "this is a cool page"));
    
    ?>
    
    0 讨论(0)
  • 2020-12-14 06:37

    defining a variable as a pseudo-argument/workaround before an include() - as recommended by many - is a bad idea. it introduces a variable in the global scope. define a function in the included file instead to catch the arguments u want to pass.

    0 讨论(0)
提交回复
热议问题