正如标题所述;如何在班上使用HTMLPurifier库?
我第一次尝试使用OOP和PHP类,并成功构建了一个使用我的数据库类连接到我的数据库的类,并返回一篇博客文章。
我现在想要使用HTMLPurifier解析博客文章的HTML标记,但我希望在我的博客课程中实现这一点,并且我想知道如何实现它,因为HTMLPurifier是一个类。
到目前为止我的班级:
namespace Blog\Reader;
use PDO;
use HTMLPurifier_Config; <--- trying to include it here
use \Database\Connect;
class BlogReader {
private static $instance = null;
private static $article = null;
private static $config = null;
private static $db = null;
private static function InitDB() {
if (self::$db) return;
try {
$connect = Connect::getInstance(self::$config['database']);
self::$db = $connect->getConnection();
} catch (Throwable $t) {}
}
private function __construct($config) {
self::$config = $config;
}
public static function getInstance($config) {
if (!self::$instance) {
self::$instance = new BlogReader($config);
}
return self::$instance;
}
public static function getArticle($id) {
self::InitDB();
try {
if (self::$db) {
$q = self::$db->prepare("
// sql
");
$q->bindValue(':id', (int) $id, PDO::PARAM_INT);
$q->execute();
self::$article = $q->fetchAll(PDO::FETCH_ASSOC);
//////////// <----- and trying to use it here
$HTMLPurifier_Config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($HTMLPurifier_Config);
///////////
} else {
throw new Exception("No database connection found.");
self::$article = null;
}
} catch (Throwable $t) {
self::$article = null;
}
return self::$article;
}
private function __clone() {}
private function __sleep() {}
private function __wakeup() {}
}
但是,在尝试这样的事情时,我会收到以下错误日志:
未捕获错误:类&#39; HTMLPurifier_Config&#39;找不到 ...... / PHP /类/博客/读取器/ blogreader.class.php
错误的行号在这一行:
$HTMLPurifier_Config = HTMLPurifier_Config::createDefault();
我的班级目录结构:
[root]
[blog]
blog.php <--- using classes here
[php]
afs-autoload.php
[classes]
[blog]
[database]
[vendor]
[htmlpurifier-4.10.0]
[library]
HTMLPurifier.auto.php <--- this is what I used to `include` on blog.php to autoload HTMLPurifier_Config::createDefault() and new HTMLPurifier($purifier_config).
我的自动加载器(afs-autoload.php)文件:
define('CLASS_ROOT', dirname(__FILE__));
spl_autoload_register(function ($class) {
$file = CLASS_ROOT . '/classes/' . str_replace('\\', '/', strtolower($class)) . '.class.php';
if (file_exists($file)) {
require $file;
}
});
我今天开始学习课程,所以我对如何实现这一点感到困惑,特别是对于我使用的命名空间系统。
我希望有更好经验的人能指导我朝着正确的方向前进。
答案 0 :(得分:4)
1)您的自动加载程序正在查找HTMLPurifier_Config
个文件;但是您的HTMLPurifier.auto.php
位于str_replace('\\'
文件中。
2)仍然在自动加载器中:str_replace('\'
单引号时不需要转义字符,因此应该是:use
。
3)This excellent answer应该可以帮助您了解何时以及如何使用use
PHP关键字。
4)您的问题不在use
的范围内(我认为您甚至不需要使用require
)。但是你的自动加载器正在寻找错误类型的文件。尝试使用namespace Blog\Reader;
use PDO;
use HTMLPurifier_Config;
手动加载课程,看看它是否正常工作。
Blog\Reader\HTMLPurifier_Config
您在此处实际执行的操作是使用定义的命名空间中的值;所以你正在使用:
HTMLPurifier_Config
如果您的namespace Blog\Reader;
use PDO;
use \HTMLPurifier_Config;
文件位于其自己的命名空间内,则需要指定该文件,以便&#34;使用&#34;抓住正确的数据!
如果它不在它自己的命名空间中,那么它将在用斜杠标识的全局命名空间中:
HTMLPurifier
如果它位于名称空间namespace Blog\Reader;
use PDO;
use \HTMLPurifier\HTMLPurifier_Config;
中,例如:
const udsPath = path.resolve('some-path.sock');
const wss = net.createServer(s => {
});
wss.listen(udsPath, () => {
});
加载正确的数据引用。
答案 1 :(得分:0)
总结一下,如果您在放置在 namespace
中的类中使用命名空间,这就是您创建净化器对象的方式:
$config = \HTMLPurifier_Config::createDefault();
$purifier = new \HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
您不必必须使用 use
命令,因为 HTMLPurifier 类本身不在命名空间中。但是当您的代码在 namespace
中时,您需要在非命名空间类之前添加“\”。
namespace \Tdiscus; // This is the line that makes the difference.
use \Tsugi\Util\Net;
class Threads {
...
$config = \HTMLPurifier_Config::createDefault();
...
$retval = new \stdClass();
...
$dbh = new \PDO($dsn, $user, $password);
}
因为您将类放在命名空间中,所以任何“非命名空间”类都需要一个 "" 前缀 - 如上例中的 PDO
和 stdClass
。
HTMLPurifier 人员本可以将他们的类放在命名空间中 - 但他们选择不这样做。
在开发用于 composer
的库时,使用命名空间是一种常见做法。但是 HTMLPurifier 在 Composer 被普遍使用之前就已经存在,并且它们的类有一个很好的唯一前缀,因为它们是在全局类命名空间中开始的——所以他们决定保持足够的独立性,而不是打破非动态加载/非命名空间的传统采用者他们的图书馆。