我正在编写一个小PHP库(一堆PHP类)。 其中一个类创建HTML表,其中布尔值由图标表示,即其输出的一部分可能如下所示:
...<td class="img"><img width="16" height="16" alt="true" src="???/valid_16.png"></td>...
问题是:我不知道如何指定src属性。
当然我知道从PHP类到图像文件(在库中)的相对路径。 但是src属性需要一个URI,我不想对服务器上库的最终位置做出假设。
那么,是否可以引用图像文件使其相对于实际的库位置不变? 或者我应该重新考虑我的设计?
答案 0 :(得分:0)
您总是可以要求库用户将资产目录的url路径作为参数给出,这样您就可以使用它来为src属性添加前缀。
如果您确定图书馆的工作是为这个特定情况下的用户生成html输出,我会将这些图像设为background-image
,因为在css中,相对url()
s相对于文件的路径所以,如果您的库的用户只是使用css文件提取资产,它将“开箱即用”(假设他们将css文件添加到他们的站点)。如果您以后决定将这些图标转换为图标字体(如font awesome)以支持高DPI显示或缩放,这将非常方便。
答案 1 :(得分: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;
}
}
?>
缺点:使用别名时(在开发环境中),这不起作用。