无法从随附的php脚本访问变量

时间:2019-11-02 07:38:32

标签: php variables

我正在尝试从所包含的php脚本访问变量$ defaultPath。

但是,当我尝试回显该变量时,出现错误提示

  

未定义变量

。 php脚本基本上是一个导航栏(我们将其称为navbar.php),其中包括helper.php,这是$ defaultPath变量所在的位置。此外,navbar.php包含在index.php中,其中index.php也包含helper.php。我使用include_once在navbar.php和index.php中都包含了helper.php,但只有index.php可以回显变量,但不能回显navbar.php

以下是代码: Navbar.php

<?php 
    include_once __DIR__ . '/../../helpers/helper.php';

    echo $defaultPath . "</br>";

?>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Interactive Digital Experience</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link rel="stylesheet" href="/capstone-project/style.css"/>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container">
        <a class="navbar-brand mb-0 h1" href=<?php echo pageUrl("index.php", $defaultPath)?>>ICT Open House</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse justify-content-end" id="navbarNavAltMarkup">
            <div class="navbar-nav">
                <a class="nav-item nav-link" href="<?php echo pageUrl("index.php", $defaultPath) ?>">Courses<span class="sr-only">(current)</span></a>
                <a class="nav-item nav-link" href="<?php echo pageUrl("quiz.php", $defaultPath) ?>">Course Quiz</a>
                <a class="nav-item nav-link" href="<?php echo pageUrl("tour.php", $defaultPath) ?>">Tour Map</a>
            </div>
        </div>
    </div>
</nav>

Helper.php

<?php

$defaultPath = ($_SERVER['SERVER_NAME'] == 'localhost') ? '/capstone-project/' : '/' ;

function subview($file) {
    $file =  __DIR__ . '/../views/sub-views/'. $file;
    include_once $file;
}

function cssPath($file, $defaultPath) {
    $hrefPath = $defaultPath .'assets/css/'. $file;
    return $hrefPath;
}

function jsPath($file, $defaultPath) {
    $hrefPath = $defaultPath . 'assets/js/'. $file;
    return $hrefPath;
}

function pageUrl($file, $defaultPath) {
    $httpProtocol = !isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on' ? 'http' : 'https';
    $url = $httpProtocol . '://' . $_SERVER['HTTP_HOST'] . $defaultPath;
    if ($file !== 'index.php') {
        $url .= 'views/' . $file;
    }
    return $url;
}
?>

Index.php

<?php 
    include __DIR__.'/helpers/helper.php';
?>

<!DOCTYPE html>
<html lang="en">
    <?php subview('header.php') ?>
    <main class="container">
        <header>
            <h1>Fullscreen Landing Page</h1>
        </header>
        <section class="courses">
            <div class="row justify-content-center">
                <div class="col-xs-6 col-md-4 bg-primary">Course 1</div>
                <div class="col-xs-6 col-md-4 bg-primary">Course 2</div>
                <div class="col-xs-6 col-md-4 bg-primary">Course 3</div>
                <div class="col-xs-6 col-md-4 bg-primary">Course 4</div>
                <div class="col-xs-6 col-md-4 bg-primary">Course 5</div>
            </div>

        </section>
    </main>

    <?php subview('footer.php') ?>
</html>

*我尝试过的事情 我尝试将其更改回包括在内,但由于功能重复而发生错误。

我也尝试在index.php中回显$ defaultPath变量,并且没有未定义的错误,但是当我尝试在navbar.php中执行此操作时,它给我带来了可悲的未定义

注意: 我不尝试在函数范围内访问变量

1 个答案:

答案 0 :(得分:1)

执行为:

// index.php
include __DIR__.'/helpers/helper.php';
因此,

helper.php已被包含一次

// index.php
subview('header.php')

这将建立一个新的功能范围。

// function subview
include_once $file;

包括包含导航栏的标头,所有标头都在subview范围内。

// navbar.php
include_once __DIR__ . '/../../helpers/helper.php';

不做任何事情,因为helper.php以前已经包含在内。

// navbar.php
echo $defaultPath . "</br>";

尝试回显不在范围内且未被包含的变量。

函数没有作用域;如果定义功能的文件在任何地方都包含一次,那么它们在全球各地都可以使用。实际上,如果您尝试再次包含该文件,则会在尝试重新定义现有功能时遇到错误。正是include_once的目的就是为了避免该问题。

您可以use the global keyword访问全局包含和定义的变量,也可以重新考虑文件结构以将一次定义函数与需要多次包含的变量分开。