php 兩次include后,第一個include里的變量無效了


目錄結構
+ root
  index.php     
  config.php    
  +c
     index.php

root/config.php 里的內容
<?php
$shell['jquery'] = "jquery 1.4";
?>

root/index.php 里的內容
<?php
include "config.php";
print $shell['jquery'];
?>

root/c/index.php 里的內容
<?php
include "../index.php";
?>

訪問root/index.php返回
jquery 1.4

訪問root/c/index.php返回
Notice: Undefined variable: shell in H:\software\dev\php\xampp\htdocs\phptest\index.php on line 3


請問,兩次include 后變量為什么會失效呢?正確的做法應該是怎樣做?
謝謝大家了
      

6 个解决方案

#1


首先,解析順序如下

1.文件路徑是絕對路徑?是, 包含, 解析結束。不是, 進入下一步。
2.文件路徑是相對路徑(就像你的"../index.php")?是, 跳過include_path, 解析相對路徑。不是,下一步。
PS:相對路徑的基點, 永遠是“當前工作目錄”.即你在這個目錄里執行了腳本,不一定是腳本文件所存在的目錄
比如你在/root里執行了`php /var/www/index.php`,“當前工作目錄”是/root而不是/var/www/,/var/www是
current_script_dir。
3.php.ini中的include_path,比如".:somepath:current_script_dir"。根據DEFAULT_DIR_SEPARATOR常量(這里是":")分割出待處理列表
"."(當前工作目錄),"somepath(你自定義的目錄)","current_script_dir"這三個
把包含的文件名附加這些路徑后面, 逐個嘗試。

所以你的問題就變成



#訪問root/c/index.php

<?php
include "../index.php";  #執行第二步,include進/root/index.php

include "config.php";    
#執行第三歩,當前工作目錄為/root/c,current_script_dir也為/root/c,
#估計你也沒有自定義include_path,所以嘗試包含/root/c/config.php,沒有這個文件

print $shell['jquery'];
#Undefined variable
?>



這是我的理解,歡迎各位交流與指正

#2


不會的!
只要你沒有 root/c/config.php 這個文件
那么 root/config.php 就一定會加載到
你可以用 print_r(get_included_files()); 看一下都加載了哪些文件

#3


要用java的思維方式去寫php

#4


要用java的思維方式去寫php。我是只require類

#5


謝謝各位,這個問題在百度知道解決了
http://zhidao.baidu.com/question/1638100265932728980.html?quesup2&oldq=1

感謝@Anew_G, 因為我是新手,所以不知你的分析正不正確,好像是對的,分給你了

#6


引用 5 樓 userzh 的回復:
謝謝各位,這個問題在百度知道解決了
http://zhidao.baidu.com/question/1638100265932728980.html?quesup2&oldq=1

感謝@Anew_G, 因為我是新手,所以不知你的分析正不正確,好像是對的,分給你了


最好不要使用Register Globals

理由:  http://php.net/manual/zh/security.globals.php

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com