我的页面的文件夹
system/ <-- offline files (classes, cronjobs, libraries ...)
online/ <-- contain all php scripts ( available online )
system/
classes <-- all my own classes inside.
... directories ...
libraries/htmlpurifier <- contain HTMLPurifier
我想用spl_autoload_register()
<?php
define("DOC_ROOT", dirname(__DIR__));
function hTMLPurifier($class) {
require DOC_ROOT . '/system/libraries/htmlpurifier/library/' . strtolower(str_replace('\\', '/', $class)) . '.php';
}
function myAutoload($class) {
require DOC_ROOT . '/' . strtolower(str_replace('\\', '/', $class)) . '.php';
}
spl_autoload_register('hTMLPurifier');
spl_autoload_register('myAutoload');
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
?>
我收到了关注消息。
.../htmlpurifier_config.php): failed to open stream: No such file or directory in ...
如果插入
"require_once '/path/to/HTMLPurifier.auto.php';"
在上面
<?php
define("DOC_ROOT", dirname(__DIR__));
require_once '/path/to/HTMLPurifier.auto.php';
function myAutoload($class) {
require DOC_ROOT . '/' . strtolower(str_replace('\\', '/', $class)) . '.php';
}
spl_autoload_register('myAutoload');
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
?>
一切都很有效。
我想只使用spl_autoload_register()加载所有类而不插入
"require_once '/path/to/HTMLPurifier.auto.php';"
在上面。我该怎么做???
HTML Purifier不适用于PHP命名空间,因此用\\
替换/
不会使您获得的结果成为可能。您的自动加载逻辑正在尝试从文件HTMLPurifier_Config
加载类htmlpurifier_config.php
- 所以你想要的是这样的:
function autoloadHtmlPurifier($class) {
require DOC_ROOT . '/system/libraries/htmlpurifier/library/'
. str_replace('_', '/', $class) . '.php';
}
spl_autoload_register('autoloadHtmlPurifier');
(注意这个函数如何不使用strtolower()
并用_
替换/
。)
但是,看看the HTML Purifier autoload implementation:
public static function getPath($class)
{
if (strncmp('HTMLPurifier', $class, 12) !== 0) {
return false;
}
// Custom implementations
if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) {
$code = str_replace('_', '-', substr($class, 22));
$file = 'HTMLPurifier/Language/classes/' . $code . '.php';
} else {
$file = str_replace('_', '/', $class) . '.php';
}
if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) {
return false;
}
return $file;
}
...由于语言类边缘情况,简单替换仍然无法正常运行。但你可以试试这个:
function autoloadHtmlPurifier($class) {
require DOC_ROOT . '/system/libraries/htmlpurifier/library/'
. str_replace('_', '/', $class) . '.php';
}
spl_autoload_register('autoloadHtmlPurifier');
spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'));
这使用您的自定义自动加载器来加载HTMLPurifier_Bootstrap
类,因此您不需要将它包含在require
中,但仍然可以使用规范的自动加载器进行HTML Purifier。
也就是说,在任何一种情况下,缺点是如果HTML Purifier确实切换到命名空间,那么它的自动加载器将会中断。我真的建议你坚持使用require_once(DOC_ROOT . '/system/libraries/htmlpurifier/library/HTMLPurifier.auto.php')
方法,或使用composer
安装HTML Purifier,这将take care of autoloading that library (and possibly others) for you:
对于指定自动加载信息的库,Composer会生成vendor / autoload.php文件。您可以简单地包含此文件并开始使用这些库提供的类,而无需任何额外的工作:
require __DIR__ . '/vendor/autoload.php';