PHP从父级到包含文件获取相对路径

时间:2013-12-28 01:08:15

标签: php

我的目录结构如下:

www/
  index.php
  my-library/
    my-library.php
    assets/
      my-library.css
      images/
        loading.gif

我需要my-library.php将样式表注入index.php。为此,我需要获取从index.phpmy-library/的相对路径 - 在这种情况下,它只是"my-library"

my-library.php开始,我有可能获得这条相对路径吗?

或者必须使用index.php提供它,如下所示?

<?php
require "my-library/my-library.php";
$mlib->linkroot='my-library';
?>

为了澄清,下面我已经详细介绍了我正在尝试做的事情:

的index.php:

<?php require "my-library/my-library.php"; ?>
<!doctype html>
<head>
  <title>Testing My Library</title>
  <?php $mlib->injectAssets(); ?>
</head>
<body>..</body>

我-library.php:

<?php
class MyLibrary(){
  public $rootpath;
  public $linkroot;
  function __construct(){
    $this->rootpath= __DIR__; // absolute path to my library's root directory (for serverside use)
    $this->linkroot = "???"; // relative path to my library's root from index.php (for clientside use, like linking in stylesheets)
  }
  function injectAssets(){
    $csslink = $this->linkroot.'/assets/my-library.css';
    echo '<link href="'.$csslink.'" rel="stylesheet" />';
  }
}
$mlib = new MyLibrary();
?>

我有兴趣搞清楚, $this->linkroot = "???";

我实际上是在尝试获取用于包含/需要当前脚本的字符串。

3 个答案:

答案 0 :(得分:1)

我明白了!我只需要建立Rube Goldberg机器就可以了!

感谢PHP

$linkroot = ascertainLinkroot();

function ascertainLinkroot(){
  return makeRelativePath(
    getTopScriptPath(),
    __DIR__
  );
}

function getTopScriptPath(){
  $backtrace = debug_backtrace(
    defined( "DEBUG_BACKTRACE_IGNORE_ARGS")
      ?DEBUG_BACKTRACE_IGNORE_ARGS
      :FALSE );
  $top_frame = array_pop($backtrace);
  $top_script_path = $top_frame['file'];
  return $top_script_path;
}

function makeRelativePath($from,$to){
  // Compatibility
  $from = is_dir($from) ?rtrim($from,'\/').'/' :$from;
  $to   = is_dir($to)   ?rtrim($to,'\/').'/'   :$to;
  $from = str_replace('\\','/',$from);
  $to   = str_replace('\\','/',$to);
  //----------------------------
  $from = explode('/',$from);
  $to   = explode('/',$to);
  $path = $to;
  foreach($from as $depth => $dir) {
    if ($dir === $to[$depth]) { // find first non-matching dir
      array_shift($path); // ignore it
    } else {
      $remaining = count($from)-$depth; // get number of remaining dirs to $from
      if ($remaining>1){
        // add traversals up to first matching dir
        $padLength = -(count($path)+$remaining-1);
        $path = array_pad($path, $padLength, '..');
        break;
      } else {
        $path[0] = './'.$path[0];
      }
    }
  }
  return rtrim(implode('/', $path),'\/');
}

所以,基本上,我使用makeRelativePath函数来计算从顶部脚本的绝对路径到当前脚本的绝对目录路径(__DIR__)的相对路径。

我意识到我实际上是在寻找从顶级脚本到库的相对路径,而不仅仅是父脚本 - 因为顶级脚本是客户端资产需要的脚本引用与...相关。

当然,PHP并不只是给你你的顶级脚本的绝对路径。在某些环境中,顶级脚本的路径可以作为$ _SERVER变量使用,但环境独立性对我来说很重要,所以我必须找到一种方法。

getTopScriptPath是我的解决方案,因为它使用debug_backtrace来查找它(令人毛骨悚然,我知道),但它是唯一与环境无关的获取方式(据我所知)。

仍然希望有一个更优雅的解决方案,但我对此工作感到满意。

答案 1 :(得分:0)

我相信这就是你要找的东西:

$this->linkroot = basename(pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME));

您可以删除basename()以获取完整路径。基本上,您可以运行以下代码:

echo '<pre>';
var_dump($_SERVER);
echo '</pre>';

如果您正在寻找的路径不是某种形状或形式,那么它根本就不可用,您将别无选择,只能硬编码,或至少硬编码部分。

答案 2 :(得分:0)

您是否尝试过从根进行相对链接?如果没有,如果我理解你的文件夹结构,你可以尝试这样的事情。

<link href="/my-library/assets/my-library.css" rel="stylesheet" type="text/css" />

您网站中任何页面中的此类链接都会在网站结构的上方或下方拉出相同的样式表。