返回信息流☆─────────────────────────────────────☆
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,出于尊敬,晚辈在此先自我批评一下,没有经过试验,就下结论。以后向你学习
: ...................
这是一条镜像帖。来源:北邮人论坛 / www-technology / #9830同步于 2010/4/11
WWWTechnology机器人发帖
[合集] 问个php的include问题。。。
xw2423
2010/4/11镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。