php中require_once()函数相对目录要谨慎

假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo

 代码如下 复制代码
c.php
require_once("a.php");
require_once("demo/b.php");
B::demo();a.php
class A
{
}

b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了

 代码如下 复制代码
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}

执行localhost/c.php 系统报错,报错信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?
原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于

 代码如下 复制代码
require_once("a.php");
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
B::demo();

原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错。
所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。

时间: 2024-10-02 09:43:11

php中require_once()函数相对目录要谨慎的相关文章

php-PHP中require_once不同目录下引用文件出错

问题描述 PHP中require_once不同目录下引用文件出错 目录结构是这样的: 1.php 3.php 文件夹2 2.php 1.php中require_once 2和3文件 2.php中又require_once 3.php 报错Fatal error: require_once(): Failed opening required '../3.php' 当2.php放置在与13同一目录下则不会出错 不懂这是怎么回事? 解决方案 我想问的是,你1中引了2.3为什么2中还要引3? 解决方案

在CPP中调用Jscript中的函数

js|jscript|函数 在CPP中调用Jscript中的函数   在C++中调用Jscript的函数非常简单,Windows提供了一个msscript.ocx的控件,利用这个控件可以直接操作Jscript: 执行一段Jscript脚本,或者调用指定的函数.我写了一个简单的例子:   l         导入msscript.ocx.下面这条指令会在项目目录中生成msscript.tli和msscript.tlh两个文件,里面有msscript.ocx中所有接口的描述和IID的定义. #imp

C#调用非托管动态库中的函数

C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型. extern "C" __declspec(dllexport) int add( int , int ); int add( int a, int b) { //实现这个函数returna+b; } 注意上面代码,一定要加上 extern&

Swift 3 中的函数参数命名规范指北

本文讲的是Swift 3 中的函数参数命名规范指北, 昨天,我开始将这个 Jayme 迁移到 Swift 3.这是我第一次将一个项目从 Swift 2.2 迁移至 Swift 3.说实话这个过程十分的繁琐,由于 Swift 3 在老版本基础上发生了很多比较大的改变,我不得不承认眼前这样一个事实,除了花费较多的时间以外,没有其余的捷径可走.不过这样的经历也带来一点好处:我对 Swift 3 的理解变得更为深入,对我来讲,这可能是最好的消息了. 在迁移代码的过程中,我需要做出很多的选择.更为蛋疼的是

ThinkPHP中公共函数路径和配置项路径的映射分析_php技巧

本文实例分析了ThinkPHP中公共函数路径和配置项路径的映射.分享给大家供大家参考.具体分析如下: ThinkPHP中在使用公共函数时(单一入口文件对应独立的项目),在Common文件夹中可以写公共的函数文件,写成文件名为common.php的文件会被系统自动加载,如果写成其他的函数名,则不会自动加载,但是有两种处理机制 1.在使用的时候手动加载 load('@.function');这样就会手动加载这个文件.@代表是在这个项目下的Common文件夹下的. 2.在配置文件中配置 复制代码 代码

php中rename函数用法分析_php技巧

本文实例分析了php中rename()函数用法.分享给大家供大家参考.具体如下: php filesystem 函数,rename() 函数重命名文件或目录,若成功,则该函数返回 true.若失败,则返回 false. 语句:rename(oldname,newname,context) 参数 描述 oldname 必需,规定要重命名的文件或目录. newname 必需,规定文件或目录的新名称 context 必需,规定文件句柄的环境,context 是可修改流的行为的一套选项 注释:在 php

【菜鸟请教】jsp如何调用到servlet中的函数

问题描述 首先说一下,我刚学习,问题可能很菜,请大家帮忙!之间接触过javabean的东西,jsp页面中可以调用java文件中的函数,比如,bean.java中可以写一个geturl的函数,bean.jsp中可以通过<iframesrc=<%=geturl()%>>,来实现对于iframe的设定.现在,我学习使用jsp.servlet来实现上述需求,在servlet.java文件中写了一个geturl函数,在jsp中编写<iframesrc=<%=geturl()%&g

PHP中文件读、写、删的操作(PHP中对文件和目录操作)_php实例

一:目录操作 首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出: 复制代码 代码如下: <?php $base_dir = "filelist/"; $fso = opendir($base_dir); echo $base_dir."<hr/>" ; while($flist=readdir($fso)){ echo $flist."<br/&

深度探究C++中的函数重载的用法_C 语言

C++ 允许同一范围内具有相同名称的多个函数的规范.这些函数称为重载函数,"重载"中对其进行了详细介绍.利用重载函数,程序员可以根据参数的类型和数量为函数提供不同的语义. 例如,采用字符串(或 char *)参数的 print 函数执行的任务与采用"双精度"类型的参数的函数执行的任务截然不同.重载允许通用命名并使程序员无需创建名称,例如 print_sz 或 print_d.下表显示了 C++ 使用函数声明的哪些部分来区分同一范围内具有相同名称的函数组.重载注意事项