![](/img/trans.png)
[英]Where to define Global Function or Constant in Cake PHP. Define Constant Dynamic
[英]Constant defined by PHP define() really global?
我只是将根路径定义为这样的常量
define("ROOT_PATH", dirname(__FILE__));
因此,在同一文件中,他们可以识别ROOT_PATH,但是,在另一个文件中,ROOT_PATH为null,我检查了一些论坛,人们说已定义的常量可以在全局中使用,但是,我不能,是我需要在PHP.ini中做一些配置?
实际上,为什么要这样做是因为我要将站点移至新服务器,但是,新服务器似乎不喜欢我使用相对路径,因此,我需要更改为绝对路径。
更新:
谢谢大家,我想我明白了原因,我使用ajax来调用文件,因此ROOT_PATH为null,因此,我在每个文件中都定义了ROOT_PATH,但是出现了另一个问题,我的文件结构是这样的
/index.php
/ajax/a1.php
/inc/inc.php
index.php:
<?
define('ROOT_PATH',dirname(__FILE__));
include_once ROOT_PATH."/inc/inc.php";
?>
a1.php:
<?
define('ROOT_PATH',dirname(__FILE__));
include_once ROOT_PATH."/inc/inc.php";
?>
因此,当客户端调用a1.php时,它将包含inc.php,但是,它不符合我的想象,我是从chrome开发人员工具中获得的
<b>Warning</b>: include_once(D:\.............\ajax/inc/a1.php) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in <b>D:\..................\inc\inc.php</b> on line <b>3</b><br />
我检查了两个文件生成的ROOT_PATH,发现FILE是取决于调用者的,
如果index.php调用它,
ROOT_PATH = d:\.............\
如果a1.php调用它,
ROOT_PATH = d:\..............\ajax\
但是,两个文件都需要调用该文件,任何方法都可以克服吗? 谢谢。
解决了:
嗨,我只是想出了解决路径问题的方法,首先,我们需要在每个目录中设置一个文件,该文件存储的绝对路径信息是指相对路径(很难理解吗?:P),我将这个文件称为path.php
/index.php
/ajax/a1.php
/inc/inc.php
因此,我们需要在这3个Directroy中添加3个path.php,如下所示,
/index.php
/path.php
/ajax/a1.php
/ajax/path.php
/inc/inc.php
/inc/path.php
像这样设置path.php
每个设置,
/path.php
<?
if(!defined(ROOT_PATH))
define(ROOT_PATH, dirname(__FILE__));
?>
/ajax/path.php
和/inc/path.php
<?
if(!defined(ROOT_PATH))
define(ROOT_PATH, '..');
?>
因此,如果我们有一个3级结构,可以说: /one/two/
,那么/one/two/path.php
应该像这样
<?
if(!defined(ROOT_PATH))
define(ROOT_PATH, '../..');
?>
设置完所有文件后,我们需要按如下方式包含该path.php
,例如index.php
/index.php
<?
include_once "path.php";
include_once ROOT_PATH."/inc/inc.php";
...
?>
因此,无论调用者是谁,它都将首先包含本地path.php
,并找出相对路径(/ or .. or ../..)
,因此,包含的文件不会出错,因为它们都是加上正确的符号,然后说,
如果调用者是/index.php,则ROOT_PATH =“ FULLPATH”,因此
include_once ROOT_PATH."/inc/inc.php";
=
include_once "FULLPATH"."/inc/inc.php";
如果调用者是/ajax/a1.php,则ROOT_PATH =“ ..”,因此
include_once ROOT_PATH."/inc/inc.php";
=
include_once ".."."/inc/inc.php";
我认为您误解了“全球”的含义。
从定义变量到脚本结束,脚本中都可以使用常量,包括在脚本中include
d或require
d的上下文中。
它在Web服务器上的其他不相关脚本中无法正常使用。
更新资料
因此,您正在尝试从其下的任意文件获取Webroot的路径。
当然__FILE__
行不通的,因为单个文件仅知道其自己的路径,而不知道目录结构的向下位置。
您可以尝试以下方法:
在utility.php
:
define('ROOT_PATH', dirname(__FILE__));
在somedir/somefile.php
:
require_once "../utility.php";
echo ROOT_PATH;
常量是超全局变量,一旦定义 d,就可以使用它们而无需使用关键字global将其导入当前范围。
定义常数后,它就可用于当前文件(从定义开始)以及常数定义之后包含的必需/包含的文件中。
这就是全部。 如果该文件未包含在定义文件中,或者如果定义文件未包含在文件中,则您将无法访问该常量到另一个文件中。
这样的定义确实是全球性的。 在定义它之前,您可能正在使用ROOT_PATH
。 打开错误报告并检查包含顺序。
define()
和其他页面的主要定义不能以任何方式说明常量的范围:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.