如何在PHP类中使用HTMLPurifier?

时间:2018-06-15 20:41:12

标签: php class oop

正如标题所述;如何在班上使用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;
   }
});

我今天开始学习课程,所以我对如何实现这一点感到困惑,特别是对于我使用的命名空间系统。

我希望有更好经验的人能指导我朝着正确的方向前进。

2 个答案:

答案 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);
}

因为您将类放在命名空间中,所以任何“非命名空间”类都需要一个 "" 前缀 - 如上例中的 PDOstdClass

HTMLPurifier 人员本可以将他们的类放在命名空间中 - 但他们选择不这样做。

在开发用于 composer 的库时,使用命名空间是一种常见做法。但是 HTMLPurifier 在 Composer 被普遍使用之前就已经存在,并且它们的类有一个很好的唯一前缀,因为它们是在全局类命名空间中开始的——所以他们决定保持足够的独立性,而不是打破非动态加载/非命名空间的传统采用者他们的图书馆。