今天 发现一个很奇怪的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
看你的说明头很 大!
//我是根目录的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'];版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。