BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #9830同步于 2010/4/11
WWWTechnology机器人发帖

[合集] 问个php的include问题。。。

xw2423
2010/4/11镜像同步0 回复
☆─────────────────────────────────────☆ xyqq163 ([ByR]♂Bupter) 于 (Wed Apr 15 14:29:27 2009) 提到: 利用include调用一个网页,当网址带参数传递时会报错,找不到文件? 例如: <? include("/include/head.php?title=1"); ?> 按上述方法就报错说: Warning: include(include/head.php?title=1) [function.include]: failed to open stream: No such file or directory in ******** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 如果 <? include("/include/head.php"); ?> 就正常显示调用。。。。。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 麻烦谁能解决这个问题。。。可以成功传递参数并且正常调用,谢谢啊~~~ ☆─────────────────────────────────────☆ reeze (Reeze) 于 (Wed Apr 15 15:46:58 2009) 提到: include不能带参数的。。 ☆─────────────────────────────────────☆ reeze (Reeze) 于 (Wed Apr 15 15:48:34 2009) 提到: 看你的需求了。如果是根据参数逻辑很不一样的话,就放在两个include文件里。如果是简单逻辑可以把逻辑放在head.php里直接处理。 ☆─────────────────────────────────────☆ xyqq163 ([ByR]♂Bupter) 于 (Wed Apr 15 17:18:21 2009) 提到: 是简单逻辑的判断。。。但是很多页都利用include调用 head.php页面!,所以得每个页面调用时传个参数过去才好判断在head.php怎么处理。。。。 所以,必须得带个参数。。。。。那还有什么办法能带参数调用? 【 在 reeze 的大作中提到: 】 : 看你的需求了。如果是根据参数逻辑很不一样的话,就放在两个include文件里。如果是简单逻辑可以把逻辑放在head.php里直接处理。 ☆─────────────────────────────────────☆ tangye1234 (ohyeahbb) 于 (Wed Apr 15 18:21:09 2009) 提到: include并不是使用客户端get服务端,怎么可以传递参数!!你何不如把include里的整个程序体写成一个过程,然后在include外面,调用过程,并传入参数,何必需要通过地址传递。 只有只有当采用了http协议的地址申请才可以使用?xx=xxxx&xxx=xxxx,inlcude仅仅是服务器内部的地址调用,就像你在你的文件浏览器下输入C:\windows\一样啊,本支持参数传递。 ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Fri Apr 17 00:14:48 2009) 提到: <? $title=1; include("/include/head.php"); ?> 【 在 xyqq163 的大作中提到: 】 : 是简单逻辑的判断。。。但是很多页都利用include调用 head.php页面!,所以得每个页面调用时传个参数过去才好判断在head.php怎么处理。。。。 : 所以,必须得带个参数。。。。。那还有什么办法能带参数调用? ☆─────────────────────────────────────☆ tangye1234 (ohyeahbb) 于 (Sun Apr 19 14:03:42 2009) 提到: 【 在 dragon2000 的大作中提到: 】 : <? : $title=1; : include("/include/head.php"); : ................... 楼上是错解 include不管写在哪,都会在程序执行前优先调用并执行 最好把include里的代码包装成一个过程,参量是title 然后调用这个过程,出入参量 ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Sun Apr 19 16:39:23 2009) 提到: 请自己看看require和include的区别。 另外,请自己编写PHP程序实际验证一下,不要妄下结论。 我可以用自己编写了8年的PHP系统程序来证明这个解没错。 补充说明:即使是用require替换include,仍然没有出错。看来不管是预先加载还是即时加载文件,都不影响执行顺序,$title=1总是先于head.php的内容执行。 不知道楼上的head.php文件会优先执行的知识或者经验,是从哪里得来的。 【 在 tangye1234 的大作中提到: 】 : 楼上是错解 : include不管写在哪,都会在程序执行前优先调用并执行 : 最好把include里的代码包装成一个过程,参量是title : ................... ☆─────────────────────────────────────☆ tangye1234 (ohyeahbb) 于 (Sun Apr 19 18:31:09 2009) 提到: 【 在 dragon2000 的大作中提到: 】 : 请自己看看require和include的区别。 : 另外,请自己编写PHP程序实际验证一下,不要妄下结论。 : 我可以用自己编写了8年的PHP系统程序来证明这个解没错。 : ................... 没有php经验,你是对的,我的经验是其他含有include的语言经验,不过预加载是应该的,及时加载会增加执行延时,介于php解释器应该会提前寻找include包含的文件,所以根据其他经验认为他可能会优先执行inlcude。至少大部分其他语言都是这样做的。 ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Sun Apr 19 19:18:14 2009) 提到: 其它语言的include会优先执行?不太靠谱吧?据我对多种编程语言的有限认识,真的不知道哪种语言是会打破原本程序的执行顺序,优先去执行include的内容。 以C语言为例: void main() { int title; title=1; #include "something.h" } 我肯定title=1会先于something.h的内容执行。 假如有哪种编程语言是设计成include的内容优先执行,而不是按开发者设计的程序代码顺序去执行,按照常理推断这是种很奇怪的设计。我会有兴趣探究一下它背后是藏了什么样的设计思想,说不定又是某种超脱了图灵机模型的程序语言。 ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Sun Apr 19 20:30:20 2009) 提到: php那样写是没有问题的。 至于C……ls你那样写include是可以,但是title貌似不会到那里面去。 c的include是个编译的预处理过程~ ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Sun Apr 19 20:31:54 2009) 提到: foo.php <?php $title = "Title!"; include("bar.php"); ?> bar.php <?php print($title); ?> 这样是没问题的。 ☆─────────────────────────────────────☆ yegle (我是老BT) 于 (Sun Apr 19 20:32:10 2009) 提到: 昂?不会到那里面去? include不是一个展开的过程么? 【 在 BookMoth (书中蠹鱼) 的大作中提到: 】 : php那样写是没有问题的。 : 至于C……ls你那样写include是可以,但是title貌似不会到那里面去。 : c的include是个编译的预处理过程~ : ................... ☆─────────────────────────────────────☆ yegle (我是老BT) 于 (Sun Apr 19 20:32:37 2009) 提到: 这么高…… 【 在 BookMoth (书中蠹鱼) 的大作中提到: 】 : foo.php : <?php : $title = "Title!"; : ................... ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Sun Apr 19 20:38:31 2009) 提到: 190...orz ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Sun Apr 19 20:38:36 2009) 提到: 如果是C foo.c #include<stdio.h> int main(){ int title; title = 12345; #include "bar.c" return 0; } bar.c #include <stdio.h> printf("%d\n",title); 这个在C里面好像决死也不会编译过去的。。。。 ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Sun Apr 19 20:40:00 2009) 提到: 别讨论这么无聊的问题了。。。。。这种设计简直糟透了。。。谁敢在面试时写这种代码 直接毙掉 ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Sun Apr 19 20:55:11 2009) 提到: 是啊。还是讨论怎么征友比较实在。。。。 【 在 coolfantasy 的大作中提到: 】 : 别讨论这么无聊的问题了。。。。。这种设计简直糟透了。。。谁敢在面试时写这种代码 直接毙掉 ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 00:38:01 2009) 提到: 如果是C,请注意bar.c里面的include <stdio.h>注释掉了。加这个include就等于展开了两次stdio.h,当然编译不了。而且在main函数里面定义别的函数,肯定不能编译。 这样再看看能不能编译,看看title是不是进去bar.c里面了。 foo.c #include<stdio.h> int main(){ int title; title = 12345; #include "bar.c" return 0; } bar.c //#include <stdio.h> printf("%d\n",title); 【 在 BookMoth 的大作中提到: 】 : 如果是C : foo.c : #include<stdio.h> : ................... ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 01:14:03 2009) 提到: 任何设计都只有合不合适之分,我只知道include的灵活运用,对提高程序的开发效率、代码重用的可维护性,都是有帮助的——当然这有前提条件,用的人清楚知道自己在干什么。 设计是否糟糕,取决于人而不是设计方式本身。即使是公认为很优秀的设计理念,也一样有人弄得一团糟。面试直接毙掉,是因为您看不懂,或者只看见过乱来的。 当然,不可否认,对于流水线上的编码工人,仍然是需要循规蹈矩地按照指令生产,毕竟生产线是什么样就应该按什么方式去做,乱来会出问题。 【 在 coolfantasy 的大作中提到: 】 : 别讨论这么无聊的问题了。。。。。这种设计简直糟透了。。。谁敢在面试时写这种代码 直接毙掉 ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Mon Apr 20 09:54:47 2009) 提到: 我试过了。不行。 要不麻烦您老人家编译下? 【 在 dragon2000 的大作中提到: 】 : 如果是C,请注意bar.c里面的include <stdio.h>注释掉了。加这个include就等于展开了两次stdio.h,当然编译不了。而且在main函数里面定义别的函数,肯定不能编译。 : 这样再看看能不能编译,看看title是不是进去bar.c里面了。 : foo.c : ................... ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 10:17:16 2009) 提到: 我编译通过,并且运行通过了,用的VC 6.0。要不要我发个工程文件压缩包给您? 建立工程的时候,不要把文件bar.c加进去,只编译foo.c,让bar.c自己出现在External Dependencies里面。或者您直接双击foo.c,使VC 6打开,然后编译,就会自动创建工程文件。 强调一下bar.c就是独立文件的代码片段,所以肯定不能加include <stdio.h>之类的东西。如果加了,就是没有搞懂include是用来干什么的。 【 在 BookMoth 的大作中提到: 】 : 我试过了。不行。 : 要不麻烦您老人家编译下? ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Mon Apr 20 10:17:17 2009) 提到: 框架级别的应用还行 【 在 dragon2000 (龙之梦工作室) 的大作中提到: 】 : 任何设计都只有合不合适之分,我只知道include的灵活运用,对提高程序的开发效率、代码重用的可维护性,都是有帮助的——当然这有前提条件,用的人清楚知道自己在干什么。 : 设计是否糟糕,取决于人而不是设计方式本身。即使是公认为很优秀的设计理念,也一样有人弄得一团糟。面试直接毙掉,是因为您看不懂,或者只看见过乱来的。 : 当然,不可否认,对于流水线上的编码工人,仍然是需要循规蹈矩地按照指令生产,毕竟生产线是什么样就应该按什么方式去做,乱来会出问题。 : ................... ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Mon Apr 20 11:00:13 2009) 提到: 确实不懂include是干嘛用的~~劳驾您给说说呗~ 【 在 dragon2000 的大作中提到: 】 : 我编译通过,并且运行通过了,用的VC 6.0。要不要我发个工程文件压缩包给您? : 建立工程的时候,不要把文件bar.c加进去,只编译foo.c,让bar.c自己出现在External Dependencies里面。或者您直接双击foo.c,使VC 6打开,然后编译,就会自动创建工程文件。 : 强调一下bar.c就是独立文件的代码片段,所以肯定不能加include <stdio.h>之类的东西。如果加了,就是没有搞懂include是用来干什么的。 ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 18:46:55 2009) 提到: 其实野狗同学已经说了,编译器在编译之前,预处理器会把include的文件展开。而且,请注意,在哪里碰上include就在哪里展开,不会自动移到前面去的。 虽然很常见的情况是把include语句放在文件的开头,但并不意味着include只能够放在开头。 接下来就好办了,只要想象一下include的文件展开之后会变成什么样子,就会明白怎样就会出错,为什么会出错。 【 在 BookMoth 的大作中提到: 】 : 确实不懂include是干嘛用的~~劳驾您给说说呗~ ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 18:58:55 2009) 提到: 拿上面的程序作例子。大家都知道stdio.h文件里面定义了很多标准函数。为了表达方便,假定stdio.h文件里只有如下简单的内容: void printf() { return; } 先看能够正确编译的情况: foo.c文件: #include<stdio.h> int main() { int title; title = 12345; #include "bar.c" return 0; } bar.c文件: printf("%d\n",title); 好,预处理器展开之后就变成: void printf() { return; } int main() { int title; title = 12345; printf("%d\n",title); return 0; } 然后编译器开工了。显然编译通过,并且程序代码逻辑正确,可以正常运行。 至于书虫同学为什么编译不了,我不能确定,只能怀疑是工程文件里面加入了bar.c文件,或者是bar.c里面的include没有注释掉。那么,用我前面说的编译方法能不能通过? ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 19:04:10 2009) 提到: 再看之前不能编译通过的情况。显然,仅仅是bar.c文件里面多了一个include。 bar.c文件: #include<stdio.h> printf("%d\n",title); 好,预处理器展开之后就变成: void printf() { return; } int main() { int title; title = 12345; void printf() { return; } printf("%d\n",title); return 0; } 接下来编译器就傻眼了。我们应该可以看出有什么问题了吧? ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 19:40:08 2009) 提到: 至于把include放在中间可以怎么个用法,我不知道没有实际见过的人能不能真正理解。尤其include嵌套层次多的时候,弄不好就变成走火入魔,又乱来了。 姑且简单说说,知道就行了,不必深究。 例如有个程序模板: void main() { int i; for (i=0; i<100; i++) { #include "repeat.c" } #include "loop_end.c" if (i>0) { #include "code1.c" } else { #include "code2.c" } #include "finish.c" } 这些include进去的文件,都是一些可重用的、相对独立的代码片段,相当于软件工业里面的零件,或许是某些固定的算法代码。这其实也算是模块组装,只不过那些模块如果用函数来代替并不适合,于是就采用include嵌入代码。 或许这里有耦合度方面的疑问,但反过来想想,是不是任何软件的任何部分,都需要松散耦合呢?尤其是性能要求很高的情况下。我就不知道一个只有几十个KB大小的加密引擎核心,或者压缩引擎核心,再把它分割成几小块来给谁用。其实,只要在需要接口的地方,做个漂亮的切割界面就足够了。 ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Mon Apr 20 22:16:33 2009) 提到: 对你的佩服真是如滔滔江水连绵不绝~ 能不能再解释一下,为啥不能把bar.c放到工程里呢? 【 在 dragon2000 的大作中提到: 】 : 拿上面的程序作例子。大家都知道stdio.h文件里面定义了很多标准函数。为了表达方便,假定stdio.h文件里只有如下简单的内容: : void printf() { : return; : ................... ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Mon Apr 20 23:09:54 2009) 提到: 貌似是加入到工程里面的.c文件都经过编译,生成obj。结果foo.c编译的时候,因为include使bar.c生成了一次,bar.c自己又生成一次,结果obj里面冲突了。 但这仅仅是我看见过类似出错情况,根据出错信息猜测的。集成开发环境底层的真正机制,我也不太清楚。 【 在 BookMoth 的大作中提到: 】 : 对你的佩服真是如滔滔江水连绵不绝~ : 能不能再解释一下,为啥不能把bar.c放到工程里呢? ☆─────────────────────────────────────☆ tangye1234 (ohyeahbb) 于 (Sun Apr 26 09:32:21 2009) 提到: 【 在 dragon2000 的大作中提到: 】 : 貌似是加入到工程里面的.c文件都经过编译,生成obj。结果foo.c编译的时候,因为include使bar.c生成了一次,bar.c自己又生成一次,结果obj里面冲突了。 : 但这仅仅是我看见过类似出错情况,根据出错信息猜测的。集成开发环境底层的真正机制,我也不太清楚。 你本人一定把咋用微软的东西,你试一试asp,或者在vs 下做asp.net,include被临时展开的这种东西是非安全的构造代码方式,vc可能可以,但是vs要实时侦测每个定义,你定义的东西跑到include里了,就没必要在编写时临时揭示出来,这种方式不靠谱啊。 再说了我是针对解释性语言说的,这类里面有asp,你试一试不就知道inlcude必须放哪啦。 没必要争论那么多,都在外面带一个星期了,回来后发现后面还有这么多回帖。php还是asp学了8年和4年有啥差别!关键是8年内得学些其他的东西。常有人说,死守php必定不是一个好主意。想必你8年经验,学的东西不仅到家了,而且渊博广泛啊。是不是ps,flash,css,js,ajax,等等都沾完了呢?如果是,果真大牛。 ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Tue Apr 28 18:20:53 2009) 提到: 好吧,这不是争论,仅仅是各人知道的东西不同而已。 1、我确实不咋用微软的开发类的东西,尤其.net我是一无所知。我只是对自己觉得不能解释的东西感到好奇,所以会刨根问底。例如之前您说的include会优先执行,而不是按照程序代码本身顺序执行的事情。 2、碰巧您所提到的asp我用过,而且碰巧也用到了include夹在中间的方法。但不巧的是,我写的asp仍然是按我设想的那样,依照程序代码顺序执行,而不是include的东西优先执行。不知道您是不是说的asp.net,因为asp.net我真的没接触过。 3、对于编码的构造是不是安全,我并不知道有没有一个标准的规范。我自己的标准只能是:程序按照自己的设想不折不扣地执行,没有遇到预料之外的问题,那么暂时没有被证明是不安全的。 4、您提到的flash、css等等,并不是样样都是我需要的,正如我从没有学过.net。至于php,那也不过是一种工具,我用了8年还是4年并没有区别,只不过是用了这么长时间,多次实践的结果,并没有遇上您所说的反例而已。 5、不知道怎样才算是死守php,每种工具都会有自己的长处和短处,适应的场合也各不相同。我用C、java、BASIC、PASCAL、php、asp、jsp、javascript等等,都是需要的时候拿来就用,当作工具来用。正如用php编写的离散对数加密程序,以EIGamal算法实现网站登录验证功能的时候,php本身就只是一个工具而已。 6、确切地说,我从小学开始学计算机,参加竞赛组,到现在是22年。这么长时间,任何一个人都可以学到不少东西了,没什么稀奇。所以我不是什么牛,永远是小学生一个。 【 在 tangye1234 的大作中提到: 】 : 你本人一定把咋用微软的东西,你试一试asp,或者在vs 下做asp.net,include被临时展开的这种东西是非安全的构造代码方式,vc可能可以,但是vs要实时侦测每个定义,你定义的东西跑到include里了,就没必要在编写时临时揭示出来,这种方式不靠谱啊。 : 再说了我是针对解释性语言说的,这类里面有asp,你试一试不就知道inlcude必须放哪啦。 : 没必要争论那么多,都在外面带一个星期了,回来后发现后面还有这么多回帖。php还是asp学了8年和4年有啥差别!关键是8年内得学些其他的东西。常有人说,死守php必定不是一个好主意。想必你8年经验,学的东西不仅到家了,而且渊博广泛啊。是不是ps,flash,css,js,ajax,等等都沾完了呢?如果是,果真大牛。 ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Tue Apr 28 19:59:32 2009) 提到: 前面的例子,用asp的代码: <% title=1 %> <!-- #include file="/include/head.asp" --> 然后head.asp里面是任意代码,诸如response.write输出title内容之类的,随便。 测试结果表明,title=1先于head.asp的代码执行。测试平台是windows 2000、IIS 5。 asp.net就不知道了,但我按常理推测,万变不离其宗,那也应该不会优先执行include的内容,除非有什么新的设计理念加在里面。事实上,我真正感兴趣的不是谁先执行,而是有没有新的理念,是什么样的思想。 ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Tue Apr 28 21:36:49 2009) 提到: 还在说这个问题啊。。。。。 人家说不是优先执行,而是在预处理阶段把include给替换了。你不是也这么给我解释的么。。。。。。 【 在 dragon2000 的大作中提到: 】 : 前面的例子,用asp的代码: : <% title=1 %> : <!-- #include file="/include/head.asp" --> : ................... ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Wed Apr 29 00:50:23 2009) 提到: 请看第6楼: "include不管写在哪,都会在程序执行前优先调用并执行" 第8楼: “根据其他经验认为他可能会优先执行inlcude” 如果只是说替换,而不是说执行,那么并不存在什么疑问。 【 在 BookMoth 的大作中提到: 】 : 还在说这个问题啊。。。。。 : 人家说不是优先执行,而是在预处理阶段把include给替换了。你不是也这么给我解释的么。。。。。。 ☆─────────────────────────────────────☆ tangye1234 (ohyeahbb) 于 (Thu May 7 13:52:38 2009) 提到: 首先,你够执着,在下佩服; 其次关于这个问题,你是对的,我原来一直把它写在头部。 第三,你的老辈,年龄至少大于22,出于尊敬,晚辈在此先自我批评一下,没有经过试验,就下结论。以后向你学习 最后,这个贴反映了一个程序员的严谨态度,值得肯定和尊敬。 [em68] 【 在 dragon2000 的大作中提到: 】 : 请看第6楼: : "include不管写在哪,都会在程序执行前优先调用并执行" : 第8楼: : ................... ☆─────────────────────────────────────☆ BookMoth (书中蠹鱼) 于 (Thu May 7 16:10:51 2009) 提到: 原来……六楼和八楼都是你~~[em1] 【 在 tangye1234 的大作中提到: 】 : 首先,你够执着,在下佩服; : 其次关于这个问题,你是对的,我原来一直把它写在头部。 : 第三,你的老辈,年龄至少大于22,出于尊敬,晚辈在此先自我批评一下,没有经过试验,就下结论。以后向你学习 : ................... ☆─────────────────────────────────────☆ dragon2000 (龙之梦工作室) 于 (Thu May 7 19:40:28 2009) 提到: 不敢当,如果要找30出头的程序员,表明年龄不是问题的话,我可以做例子。程序不是靠加班熬夜就能熬出来的。 我自己在本科答辩、硕士答辩的时候,都遇上被追问到答不上来的情况,不过并没有影响到我拿到学位。学校原本是讨论问题、寻求解答的地方。 请勿见怪我的追问,有时候真的会遇上追问下去总能回答得通的情况,那通常是发现新大陆的机会,我不想错过。爱因斯坦的相对论“怪胎”也是经受住了物理学界的质疑,才带来了翻天覆地的变化。 人人都会有出错,有些问题深入下去,甚至找不到绝对的真理。谁对谁错都不重要,求知才是意义所在。 【 在 tangye1234 的大作中提到: 】 : 首先,你够执着,在下佩服; : 其次关于这个问题,你是对的,我原来一直把它写在头部。 : 第三,你的老辈,年龄至少大于22,出于尊敬,晚辈在此先自我批评一下,没有经过试验,就下结论。以后向你学习 : ...................
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。