在包含文件中使用PHP变量在包含文件中将求值为NULL


Using a PHP variable in included file evaluates to NULL in included file

我正在尝试使用PHP处理一些CSS。我想要处理的CSS是特定于页面的,所以我想在index.php中设置一个变量,以便在设置变量时只回显CSS。

index.php

<?php
    $name = 'index'; 
?>
<?php
    include 'inc/header.php';
?>

header.php

<head>
      <meta charset="utf-8">
      <title></title>       
<?php include 'import.php'; ?>
</head>

import.php

<link rel="stylesheet" href="css/styles.css.php" type="text/css" />

此文件的标头设置正确。并且对CSS进行解释。

styles.css.php

.jumbotron {
    background-image: url(../img/jumbotron.jpg);
    <?php 
        if ($name === "index") { 
            echo("height: 50VH;"); /* Does not echo anything*/
        }
        var_dump($name); // Evaluates to NULL
    ?>
}

如何确保$name设置为index.php中设置的值?


EDIT:我的最终解决方案是从stdClass生成一个对象,并将我需要的变量作为属性添加到该对象中。在指向CSS文件的链接中放入一个GET请求,该文件是对象的JSON字符串的Base64。

<link>标记对文件发出HTTP请求,该请求完全独立于包含彼此的PHP页面,因此$name在styles.css.PHP中不可用。

要这样做,您需要将样式表链接为这样的内容,以将$name作为get变量传递:

<link rel="stylesheet" href="css/styles.css.php?name=<?php echo $name; ?>" type="text/css" />

然后在样式表styles.css.php中使用$_GET['name']:

    if ($_GET['name'] === "index") { 
        echo("height: 50VH;");
    }

问题是您正在从渲染的html内部链接到styles.css.php。这意味着页面将在一个单独的请求中提取(正如您在检查页面时所看到的那样)。此请求从未通过index.php,因此不会设置$name变量。

我建议您将css包含在样式块中的渲染HTML中。这应该和将import.php更改为以下内容一样简单:

<style>
<?php include 'css/styles.css.php' ?>
</style>

这还有一个额外的好处,那就是减少了浏览器必须发出的请求数量,因此应该会加快页面的速度。

顺便说一句,这不是一种非常标准的css使用方法。我相信最好在你的body标签上添加一些id(或数据属性),指示你所在页面的名称。在css文件(它不是通过php运行的,只是一个标准的css文件)中,你可以这样做:

.jumbotron {
    background-image: url(../img/jumbotron.jpg);
}
#index .jumbotron {
    height: 50vh;
}

文件styles.css.php不知道关于$name变量的信息-这就是为什么在执行var_dump($name)时它为null的原因。使用<link>,您只需将style.css.php的内容输出为普通的html/css。您需要执行include_once('styles.css.php')require_once('styles.css.php'),以便正确评估$name变量。

您有一个由index.php生成的HTML页面。这将告诉浏览器在<link rel="stylesheet" href="css/styles.css.php" type="text/css" />行加载外部样式表。通过浏览器加载外部数据是一个全新的请求。因此,生成样式表的PHP文件对HTML页面脚本中声明的变量一无所知。

实际上,变量$name是未设置的。由于它是通过引用var_dump作为参数给定的(内建函数被声明为通过引用获取参数),因此引用在null中产生。

如果只想在一个PHP脚本中区分不同的样式表,请在URL中附加一个GET参数作为查询:

<link rel="stylesheet" href="css/styles.css.php?name=<?PHP echo $name;?>" type="text/css" />

syles.css.php中获取该参数:

<?php $name = isset($_GET['name']) ? $_GET['name'] : ''; ?>