开发者社区> 问答> 正文

一个PHP的require/include 文件的问题。:报错

今天 发现一个很奇怪的PHP require/include 文件的问题。

先说下目录结构

根目录-----index.php
    |-------TPL目录
                  |-------------header.php
                  |-------------index.php
                  |-------------footer.php

文件加载结构:

根目录:index.php -----加载(require/include)------>tpl目录:index.php
                                                                                  |-----加载(require/include)--->header.php
                                                                                  |-----加载(require/include)--->footer.php

若根目录index.php 有以下内容:

<?php
//我是根目录的index.php
function get_header(){
	require('./tpl/header.php');
}

function get_footer(){
	require('./tpl/footer.php');
}

$a = "我是变量A";

require('./tpl/index.php');
TPL目录下的三个文件内容

index.php:

<?php
get_header();
echo '<br />';
echo '我是tpl目录的index.php';
echo $a;
echo '<br />';
get_footer();
header.php:
<?php
echo '我是页眉';
echo $a;//不会产生输出?
echo '<br/>';
footer.php:
<?php
echo '<br />';
echo $a;//不会产生输出?
echo '我是页脚';
根据以上的代码,根目录定义的变量$a. 在TPL目录index.php 调用header.php 和footer.php 后,这两个文件不会产生结果输出。。。

若我将TPL目录下的index.php更改成如下写法,则会没问题:

<?php
require('./tpl/header.php');
echo '<br />';
echo '我是tpl目录的index.php';
echo $a;
echo '<br />';
require('./tpl/footer.php');
这样header.php 和footer.php 都能够输出 根目录index.php 定义的变量$a 。

这是为什么呢?

上述源码我放在百度网盘了。http://pan.baidu.com/share/link?shareid=478253&uk=1778745343

展开
收起
kun坤 2020-06-06 11:51:10 736 0
1 条回答
写回答
取消 提交回答
  • 看你的说明头很 大!

    //我是根目录的index.php
    function get_header(){
    	require('./tpl/header.php');
    }
    
    function get_footer(){
    	require('./tpl/footer.php');
    }
    
    $a = "我是变量A";
    
    require('./tpl/index.php');
    是作用域的问题,当你require('./tpl/header.php')时,其中定义的变量是在get_header()这个函数的作用域内,在其外面是访问不到的######确实是作用域的问题,解答的很清楚######回复 @卡卡罗特 : global######噢。那有什么解决法子没?还真第一次遇到。######变量作用域的问题了.######全局变量######如果是作用域的问题。那有什么方案解决呢? 我看wordpress程序也是把 需要的文件引入 写成 函数形式之类调用的的。######

    header.php:

    footer.php:

    无法显示$a是正常的, 因为变量不在函数体内.

    tpl/index.php 应该会显示吧.

    ######

    作用域的问题,框架设计的有问题。如果按你那么来,就要使用global了,不过这会很丑

    <?php
    $a=5;
    function head(){
    echo '我是页眉';
    global $a;
    echo $a;//函数范围里使用全局变量
    echo '<br/>';
    }
    head();
    设计理念太落后,建议更新知识库######只能用全局变量了.######

    function(){}或foo(), 也就是方法定义或者调用, 都会引起变量局部的, 所以include/require的时候, 确保没有被function/class隔离, 就可以直接访问, 如:

    ######... 按错键盘.. a.php <?php $a=1; b.php <?php include a.php echo $a;######echo $GLOBALS['a'];
    2020-06-06 11:51:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载