PHP:'智能'绝对路径与相对路径

时间:2013-04-12 16:29:18

标签: php relative-path absolute-path

我正在为我的库编写一个Router类。 这个类将保留一些路径的位置,但我想知道我是否应该使用“智能”绝对路径,相对路径或两者(对于这种情况)将是相同的。

Obs.1:当我写'智能'绝对路径是因为即使管理员将库移动到另一个位置,这个绝对路径也会起作用。

Obs.2:Stack有关于这个主题的其他问题,但看起来它们并不是我正在寻找的东西,所以我提出了这个问题。

第一个解决方案:

MyVendor/src/class/MyVendor/MyNamespace/Router.php使用“智能”绝对路径

namespace MyVendor\MyNamespace;

class Router
{
    private $root;
    private $cache;

    public function __construct()
    {
        $this->setRootPath();
        $this->cache = "{$this->root}var/cache/";
    }

    public function setRootPath()
    {
        $currentDir = __DIR__;

        $exploded = explode("/", $currentDir);

        array_pop($exploded);   // Removing MyNamespace
        array_pop($exploded);   // Removing MyVendor
        array_pop($exploded);   // Removing class
        array_pop($exploded);   // Removing src

        $this->root = implode("/", $exploded)."/";
    }
}

第二个解决方案:

MyVendor/src/class/MyVendor/MyNamespace/Router.php使用相对路径

namespace MyVendor\MyNamespace;

class Router
{
    private $root;
    private $cache;

    public function __construct()
    {
        $this->setRootPath();
        $this->cache = "{$this->root}var/cache/";
    }

    public function setRootPath()
    {
        $this->root = __DIR__."/../../../../";
        // ..(pointing to MyVendor)/..(pointing to class)/..(pointing to src)/..(pointing to the root, MyVendor)
    }
}

Obs.3:看到第一个解决方案将使用如下链接:

root => `/var/www/myproject/vendor/MyVendor/`

cache => `/var/www/myproject/vendor/MyVendor/var/cache`

,第二个将使用如下链接:

root => `/var/www/myproject/vendor/MyVendor/src/class/MyVendor/MyNamespace/../../../../`

cache => `/var/www/myproject/vendor/MyVendor/src/class/MyVendor/MyNamespace/../../../../var/cache/`

Obs.4:初始处理(使用array_pop)与我无关。

那么,我应该使用什么解决方案?为什么?还有另一种更好的方法(如果是的话,请编写一个Router类替代方案)?

2 个答案:

答案 0 :(得分:0)

为什么不简单地要求它?

namespace MyVendor\MyNamespace;

class Router
{
    private $root;
    private $cache;

    public function __construct($rootPath)
    {
        $this->root = $rootPath;
        $this->cache = "{$this->root}var/cache/";
    }
}

注入根路径允许库的客户端(物理地)将其放置在任何他们想要的位置。在你的例子中,你假设根路径是4 dir up;如果不是这样怎么办?

答案 1 :(得分:0)

首先,如果您决定使用它,我肯定会在您的相对路径工作中使用realpath()(为开发人员简化它并使其更容易预测)。

其次,我会放弃你的array_pop()技术,如果你决定重新组织东西,它将会快速崩溃。

我会选择preg_replace('#^'.$FS_ROOT.'#', __FILE__);类型的方法来确定所调用的内容。

我认为你应该在你的信息流中反过来看一下你的项目的“基础”,然后从那里确定一切。当你移动它或者为了开发而运行该代码的多个副本时,这将使你非常头疼。