1

我正在使用 Zend Framework 2 做一些工作,这里我需要清理用户的输入,这是在Html中。我之前在普通 php 中使用过 php tidy extension [see this],没有使用命名空间和自动加载,而且代码运行良好。

而这一次,我在 zf2 中写了一个视图助手,就像:

<?php
namespace Blog\View\Helper;
use Zend\View\Helper\AbstractHelper;

class TidyHtml extends AbstractHelper
{
    public function __invoke($userHtml){
    $config = array(
               'indent'         => true,
               'output-xhtml'   => true,
               'wrap'           => 200);

    $userHtml = '<div id="wrapper">'.$userHtml.'</div>';
    $tidy = new tidy();
    $tidy->parseString($userHtml,$config,'utf8');

    $tidy->cleanRepair();
    $dom = new DOMDocument();
    $dom->loadHTML($tidy);

    $node = $dom->getElementsById("wrapper");
    $newdoc = new DOMDocument();
    $cloned = $node->item(0)->cloneNode(TRUE);
    $newdoc->appendChild($newdoc->importNode($cloned,TRUE));
    return $newdoc->saveHTML();
    }
}

我想在第 14 行创建一个 tidy 实例,但出现错误:

PHP Fatal error:  Class 'Blog\\View\\Helper\\tidy' not found in /var/www/zf2-tutorial
/module/Blog/src/Blog/View/Helper/TidyHtml.php on line 14

显然 php 将 tidy 视为一些用户定义的类并且找不到它的声明。也许zf2中的自动加载功能对其有一些影响。而且我确定 tidy2.0 扩展程序已正确安装在我的机器上。

4

2 回答 2

1

这里的问题是由于您Blog\View\Helper在代码中声明的名称空间中,并且由于您在没有完全限定名称的情况下调用该类tidy,因此 PHP 假设您实际上想要Blog\View\Helper\tidy.

简单地做$tidy = new \tidy();,你应该没问题,注意前面的斜杠。

您可能还想阅读更多关于 PHP 命名空间的信息:http: //php.net/manual/en/language.namespaces.php

此外,您可能需要对根命名空间中的所有其他类使用完全限定的类名,通常来自当前命名空间以外的命名空间,或者发出正确的use声明,如下所述:http://php。网络/手册/en/language.namespaces.importing.php

于 2012-12-18T16:19:11.600 回答
0

建议您阅读有关命名空间的信息

您在命名空间内Blog\View\Helper。这意味着,当您创建 a 时,new tidy();它正在寻找Blog\View\Helper\tidy. 如果一个类在你需要调用的全局命名空间中new \tidy(),与 . 相同DOMDocument

如果一个类在不同的命名空间中,你需要像这样使用它:

use Some\Name\Space\Tidy;
new Tidy();

或者这样做

new \Some\Name\Space\Tidy();
于 2012-12-18T16:20:11.157 回答