我正在编写一个加载YAML文件的PHP CLI应用程序.尝试在xDebug会话中执行此操作时:
if (file_exists(__DIR__ . '/../../foo/bar')
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
__DIR__永诺是xdebug:这将导致百达至false从file_exists().
有什么工作吗?
在PHP中,__DIR__魔术常量计算到包含该常量出现的文件的目录的路径.
Python中是否有相同的功能?
TL; DR:当尝试在PHP include命令包含的页面上使用相对链接时,此页面上的最后一个代码示例有哪些替代方案?
我正在尝试include()链接到.css文档的文件,问题是我需要从多个(不同的)目录中包含此文件.我的目录结构看起来有点像这样:
www
??? (getpath.php)
?
??? css
? ??? style.css
??? php
? ??? header.php
??? content
??? index.php
??? posts
??? index.php
Run Code Online (Sandbox Code Playgroud)
(我header.php在两个index.php文件中都包含.header.php是引用的文件style.css(浏览器需要找到的文件).例如:使用时../css/style.css,CSS会显示在我的content/index.php但不会显示在我的文件中content/posts/index.php,因为浏览器正在寻找content/css/index.php.)
放置在文档根目录的子目录中时,网站也应该工作,而不是在文档根目录中.出于这个原因,我不能只使用/css/style.css(相对于服务器根目录)链接到我的CSS样式表.
我想(请纠正我,如果我错了!)告诉浏览器在哪里找到CSS文档的最简单方法可能是指定相对于文档根目录的路径.由于我希望我的网站位于文档根目录的子目录中(并且希望避免使用config文件来存储子目录),我需要找出网站所在子目录的相对路径.我的想法是放置getpath.php在我的网站的根目录(不是文档根目录)中调用的文件.在该文件中,我写了以下内容:
<?php
define('PROJECT_SUBDIRECTORY', $_SERVER['PHP_SELF']);
?>
Run Code Online (Sandbox Code Playgroud)
但是,我注意到这给了我用户在浏览器中请求的PHP文件的相对目录(例如content/index.php)而不是包含的文件(getpath.php).我也读过这PHP_SELF是基于REQUEST_URI,这是不安全的.我在这里找到了这个解决方案:
define('PROJECT_DIR', …Run Code Online (Sandbox Code Playgroud) php directory-structure relative-path document-root magic-constants
我使用SensioLabs Insight来控制我的代码质量.
对于简单的文件上传,我必须获取上传目录的绝对路径:
protected function getUploadRootDir()
{
// the absolute directory path where uploaded
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}
Run Code Online (Sandbox Code Playgroud)
代码直接来自官方文档(如何使用Doctrine处理文件上传)
但SLInsight提出了一个警告,如果分析的代码中包含__DIR__或__FILE__PHP魔术常量:
__DIR__和__FILE__常量可能与Symfony资源覆盖系统冲突.
如何使用这些常量会导致与Symfony冲突?
我怎样才能在代码中避免它们?
我想从包含的文件中获取包含另一个文件的文件的名称.
我知道还有就是__FILE__魔法恒定的,但这样做没有帮助,因为它返回的名称包含文件,而不是包括一个.
有没有办法做到这一点?或者由于PHP的解释方式是不可能的?
好吧,我有一个问题这里为我的日志类,但我希望能够调用脚本的行号添加到日志文件条目.
我见过__Line __但这给了我这行所在行的行号.
例:
a.php只会
$log = new Logger();
$log->debug('hello'); // Say this is line #20
Run Code Online (Sandbox Code Playgroud)
现在在debug()的Logger.php类中,我使用__Line __ Magic Constant,例如第300行.当我运行脚本时,我希望日志条目读取'在第20行',但它在'第300行'上读取.除了将行号传递给函数之外还有其他方法可以做到这一点吗?
示例调试类函数
public function debug($message) {
if(DEBUG) {
$this->calling_script = $this->getScriptBaseName();
$this->log_file = LOG_FILE_DIRECTORY."/".$this->calling_script.".log";
$this->fh = fopen($this->log_file, 'a') or die("Can't open log file: ".$this->log_file);
if($this->first_run) {
$this->log_entry = "\n[" . date("Y-m-d H:i:s", mktime()) . "][debug][line:".__LINE__."]:\t".$message."\n";
} else {
$this->log_entry = "[" . date("Y-m-d H:i:s", mktime()) . "][debug][line:".__LINE__."]:\t".$message."\n";
}
fwrite($this->fh, $this->log_entry);
fclose($this->fh);
$this->first_run = false;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:debug_backtrace()工作得很好!!! …
什么是PHP的魔术常量的使用的最佳实践,比如__LINE__,__FILE__,__FUNCTION__,__CLASS__和__METHOD__?
例如,我使用__LINE__ 和__CLASS__找到SQL错误,如下所示:
$result = mysql_query($query)
or die("Error SQL line ".__LINE__ ." class ".__CLASS__." : ".mysql_error());
Run Code Online (Sandbox Code Playgroud)
这是可接受的做法吗?
当我输入这个PHP代码时,魔术常量_LINE_只是按字面输出.
<!DOCTYPE html>
<html>
<body>
<?php
echo "This is line"._LINE_."blah";
?>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
输出:
This is line_LINE_
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?