【问题标题】:How to correctly load a PHP file in another PHP file?如何在另一个 PHP 文件中正确加载 PHP 文件?
【发布时间】:2013-12-10 06:51:10
【问题描述】:

当 php 文件通过 include() 和 required_once() 包含在另一个 php 文件中时,我很难找到将 php 文件正确加载到另一个 php 文件中的方法。我发现如果 Afile.php 使用诸如../controller/mycontroller.php 之类的url 在其中包含另一个php 文件,当Afile.php 被包含在位于不同目录中的Bfile.php 中时,../ 会将Afile.php 的url 引导到一个基于 Bfile.php 的不同目录。

我尝试使用这些PHP字符串来指定一个静态的文件的url,这样当许多.php文件中有多个包含时就不会产生误解。但它没有用!

有没有更好的方法来定义 .php 文件的文件位置,以便当我想要包含、调用或加载位于不同目录中的 .php 文件时,它本身也包含在其他目录中的其他 php 文件中目录?

如果有任何困惑,请告诉我。

谢谢

更新

define('PUBLICPATH', __DIR__.'/');
// I prefer to have the "root dir" not accessible from public dir
define('ROOTROOT', realpath(PUBLICPATH.'..').'/');
$pathnow= define('APPPATH', realpath(PUBLICPATH.'../application').'/');
echo 'pathnow:'.APPPATH;

它在 chrome 中返回 pathnow:/ 作为结果页面

【问题讨论】:

  • 使用绝对路径。这样你就不会再遇到任何问题了。
  • 使用您的 udpate,$pathnow 返回函数 define() 的结果。检查 define 如何在 php.net/define 上工作。将您的代码替换为echo 'pathnow:'.APPPATH;
  • 因为 realpath() 返回一个真实的路径。如果它不存在,这将返回 false。可能__DIR__不适用于您的php版本,所以您需要将其替换为dirname(__FILE__)
  • @Asenar 一个有趣的麻烦,我发现使用 PUBLICPATH 返回的路径将全部为 \path\mypath 样式,而您的代码尝试在此之后附加 /... 是错字吗?还是需要在代码中进行调整?
  • 附录:当你开发php代码时,你可以在你的主脚本开头添加以下内容:ini_set('display_errors', 'on'); error_reporting(E_ALL);。这样,所有问题都会显示出来

标签: php url curl include include-path


【解决方案1】:

最简单的方法是在第一个调用的脚本中定义一个常量ROOT_PATH(或更多),然后在每个包含/要求指令中使用它。例如,假设您有以下树:

/var/www/example.com            - 
/var/www/example.com/www         - your public directory, accessible from www.example.com
/var/www/example.com/application - 

index.php

<?php
// for recent php version, __DIR__ just do it
define('PUBLICPATH', __DIR__.DIRECTORY_SEPARATOR);
// in case __DIR__ is not available use the following:
//  define('PUBLICPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);

// I prefer to have the "root dir" not accessible from public dir
define('ROOTROOT', realpath(PUBLICPATH.'..').DIRECTORY_SEPARATOR);
define('APPPATH', realpath(PUBLICPATH.'..'.DIRECTORY_SEPARATOR.'application').DIRECTORY_SEPARATOR);

require(APPPATH.'bootstrap.php');

对于类定义,您还可以使用自动加载器(使用 __autoload 或 spl_autoload_register )来加载类,而不必在之前包含/要求它们的文件。

编辑:我将'/' 替换为DIRECTORY_SEPARATOR 以使其在window 和unix 上都可以使用。

【讨论】:

  • 谢谢!我会尝试一下并告诉你会发生什么:)
  • 我试过你的方法,直接复制过去,结果发现不会回显文件关联的路径,是不是我设置对了?请看我的更新!
  • define('NAME', 'some value') 创建一个常量NAME,将其内容固定为'some value'(并且该值不能在脚本中进一步更改)。然后你可以使用echo NAME; 来显示它,或者将它与任何功能一起使用(不要添加$ 否则这将不起作用)。按照惯例,每个人都用大写字母写常量。请参阅 php.net/constantsphp.net/define 以获得更好的帮助:)
猜你喜欢
  • 2011-07-16
  • 2019-06-23
  • 1970-01-01
  • 2012-10-29
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2016-10-05
相关资源
最近更新 更多