0

我正在编写一个小的 PHP 库(一堆 PHP 类)。其中一个类创建 HTML 表,其中布尔值由图标表示,即其输出的一部分可能如下所示:

...<td class="img"><img width="16" height="16" alt="true" src="???/valid_16.png"></td>...

问题是:我不知道如何指定 src 属性。

当然,我知道从 PHP 类到图像文件(在库中)的相对路径。但是 src 属性需要一个 URI,我不想对库在服务器上的最终位置做出假设。

那么,是否可以引用图像文件以使其相对于实际库位置保持不变?还是我应该重新考虑我的设计?

4

2 回答 2

0

根据 complex857 的建议,我想出了这个解决方案:

我在库的主目录中创建了一个类,为库命名空间设置自动加载。它还确定库位置(假设库和使用它的代码位于同一文档根目录下)。这个类是库用户必须明确包含的唯一一个。它看起来像这样:

<?php

namespace vendor\lib;

class Includer
{
    public static $libUrl;
    public static $libPath;

    public static function getUrl($dir)
    {
        $url = substr($dir, strlen($_SERVER['DOCUMENT_ROOT'])); // remove root prefix from dir
        return str_replace('\\', '/', $url) . '/'; // windows...
    }

    public static function registerNamespaceAutoload($namespace, $path)
    {
        // some code to register autoload for given namespace using given path
    }
}

// determine library location
Includer::$libUrl = Includer::getUrl(dirname(dirname(__DIR__))); // lib's top level dir (two levels up relative to vendor\lib\Includer)
Includer::$libPath = str_replace('/', DIRECTORY_SEPARATOR, $_SERVER['DOCUMENT_ROOT'] . Includer::$libUrl);

// register autoload for library
Includer::registerNamespaceAutoload('vendor\\lib\\', Includer::$libPath);

?>

用于获取位于 vendor/lib/images/ 中的图像的 URL:

<?php

namespace vendor\lib\images;
use vendor\lib\Includer;

class Image
{
    public static function getUrl($fileName)
    {
        return Includer::$libUrl . 'vendor/lib/images/' . $fileName;
    }
}

?>

缺点:这在使用别名时不起作用(在开发环境中)。

于 2013-07-08T09:45:11.950 回答
0

您始终可以要求您的库用户将资产目录的 url 路径作为参数提供,以便您可以使用它来为您的 src 属性添加前缀。

如果您确定您的库的工作是在这种特定情况下为用户生成 html 输出,我会将这些图像设为 a background-image,因为在 css 中,相对url()s 是相对于文件路径解析的,所以如果您的库的用户只是提取带有 css 文件的资产,它将“开箱即用”(假设他们将 css 文件添加到他们的站点)。如果您稍后决定将这些图标转换为图标字体(如font awesome)以支持高 DPI 显示或缩放,这将派上用场。

于 2013-07-07T20:41:48.707 回答