【问题标题】:includes in php包含在 php 中
【发布时间】:2011-08-09 09:46:54
【问题描述】:

我在我的项目中相互包含了许多页面,我遇到了包含路径不正确的问题,有没有办法从根目录包含文件, 我试着做这样的

require_once("$_SERVER['DOCUMENT_ROOT']/crm/includes/opendb.php");
require_once("./includes/opendb.php");
require_once("../includes/opendb.php");
require_once("includes/opendb.php");

并且在包含文件时都会出错,请问有什么建议吗?

编辑

我有 2 个文件夹,控制器和包含,在控制器内部我从包含文件夹调用 opendb.php,我在下面的答案中演示了

set_include_path('../includes/');
include 'opendb.php';

set_include_path('includes/');
include 'opendb.php';

但同样的错误

Warning: include(opendb.php) [function.include]: failed to open stream: No such file or directory in C:\AppServ\www\crm\controllers\Customer.controller.php on line 

【问题讨论】:

  • $_SERVER['DOCUMENT_ROOT'] root 还不够吗?
  • 其实应该会触发解析错误:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING。您是否已将 PHP 配置为显示错误?
  • 除了上述警告之外,这些错误还会多次出现。
  • 未来提示:如果您遇到无法修复的解析错误,请明确询问并粘贴问题中的实际错误消息。解析错误意味着您的 PHP 代码甚至无效。改进甚至不会运行的代码的逻辑是没有意义的。

标签: php file include


【解决方案1】:

"$_SERVER['DOCUMENT_ROOT']/crm/includes/opendb.php" 不正确:您不能在双引号内的数组键周围使用撇号。尝试以下方法之一:

require_once( $_SERVER['DOCUMENT_ROOT']."/crm/includes/opendb.php" );
require_once( "$_SERVER[DOCUMENT_ROOT]/crm/includes/opendb.php" );
require_once( "{$_SERVER['DOCUMENT_ROOT']}/crm/includes/opendb.php" );

【讨论】:

    【解决方案2】:

    有许多可能的解决方案(从include_pathclass autoloading),但我认为设置绝对路径在实践中往往效果更好:它简单、直观且不会轻易被系统管理员和第三方破坏-党图书馆。

    你没有说为什么$_SERVER['DOCUMENT_ROOT'] 对你不起作用,但我发现它只在 99% 的情况下起作用:一些托管服务提供商没有设置它或将其设置为错误的值。此外,应用程序可能不直接位于文档根目录中。为了克服这个问题,我通常会在所有脚本之上编写一个 手动 加载的 settings.php 文件:

    // One of...
    require(dirname(__FILE__) . '/conf/settings.php');
    require(dirname(__FILE__) . '/../conf/settings.php');
    require(dirname(__FILE__) . '/../../conf/settings.php');
    

    settings.php 我创建了两个 PHP 常量:

    define('FS_ROOT', $_SERVER['DOCUMENT_ROOT'] . '/my-app/');
    define('WEB_ROOT', '/my-app/');
    

    我更喜欢常量而不是变量,因为它们在所有范围内都可用(而且它们无论如何都是常量值)。在设置它们的值时,您可以使用任意数量的逻辑(例如,您可以计算 my-app 部分而不是对其进行硬编码),但这是一般的想法:

    require_once(FS_ROOT . 'utils/email.php');
    echo '<script type="text/javascript" src="' . WEB_ROOT . 'js/validate.js"></script>';
    

    【讨论】:

      【解决方案3】:

      您可以使用set_include_path() 更改包含路径。

      假设你有这个文档结构:

      php/include.php
      php/include2.php
      file.php
      

      php/include.php 有这个代码:

      include 'include2.php';
      

      如果您要像这样在file.php 中包含php/include.php

      include 'php/include.php';
      

      这将导致include2.php 出现错误,因为您不在php/ 文件夹中。

      但如果你这样做:

      set_include_path('php/');
      include 'include.php';
      

      它会起作用的。

      【讨论】:

      • 试试:set_include_path(dirname(__FILE__)."/../includes/"));
      【解决方案4】:

      我猜includes/opendb.php 文件是连接数据库的配置?

      如果我是对的,那么你最好使用 OOP 和 MVC 来分离视图和逻辑,并尝试寻找依赖注入容器 (DIC) 来配置服务等。

      之后,您将能够为 PHP 类使用自动加载器并在模板中进行更改(包括其他模板等)。这将防止您烦人require_once("includes/opendb.php");

      【讨论】:

        【解决方案5】:

        如果 $_SERVER[ 'DOCUMENT_ROOT' ] 不起作用(它不适用于 PHP+IIS 等某些配置),请使用以下任一有效技巧:

        $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/',
               substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF'])));
        

        $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/',
             substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']),
             0, 0-strlen($_SERVER['PHP_SELF'])));
        

        地址文件相对使用dirname(__FILE__):

        require_once( dirname(__FILE__).'/../includes/opendb.php' );
        

        【讨论】:

          猜你喜欢
          • 2012-05-13
          • 2013-01-07
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 2014-11-29
          • 2014-02-01
          • 2011-11-28
          • 1970-01-01
          相关资源
          最近更新 更多