Php Zend Framework 2中的奇怪类自动加载会干扰tidy类的查找

Php Zend Framework 2中的奇怪类自动加载会干扰tidy类的查找,php,zend-framework2,htmltidy,Php,Zend Framework2,Htmltidy,我正在使用Zend Framework 2做一些工作,这里我需要清理用户的输入,它是Html格式的。我以前在普通php中使用过php tidy扩展,没有使用名称空间和自动加载,代码运行良好 这一次,我在zf2中编写了一个视图助手,如下所示: <?php namespace Blog\View\Helper; use Zend\View\Helper\AbstractHelper; class TidyHtml extends AbstractHelper { public fun

我正在使用Zend Framework 2做一些工作,这里我需要清理用户的输入,它是Html格式的。我以前在普通php中使用过php tidy扩展,没有使用名称空间和自动加载,代码运行良好

这一次,我在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();
    }
}
另外,php将tidy视为用户定义的类,无法找到其声明。
zf2中的自动加载功能可能会对其产生一些影响。我确信我的机器上正确安装了tidy2.0扩展。

这里的问题是由于您位于代码中声明的命名空间
Blog\View\Helper
中,并且由于您调用类
tidy
时没有完全限定名,PHP假定您实际上想要
Blog\View\Helper\tidy

只需执行
$tidy=new\tidy()你应该没事,注意前面的斜杠

您可能还想阅读有关PHP中名称空间的更多信息:


此外,您可能需要对根命名空间中的所有其他类使用完全限定类名,通常是从当前命名空间以外的命名空间使用完全限定类名,或者发出适当的
use
语句,正如这里所解释的:

这里的问题是由于您位于代码中声明的名称空间
Blog\View\Helper
中,并且由于您调用类
tidy
时没有其完全限定名,PHP假定您实际上想要
Blog\View\Helper\tidy

只需执行
$tidy=new\tidy()你应该没事,注意前面的斜杠

您可能还想阅读有关PHP中名称空间的更多信息:


此外,您可能需要为根命名空间中的所有其他类使用完全限定的类名,通常是从当前命名空间以外的命名空间中使用,或者发出适当的
use
语句,如下所述:

建议您阅读

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

如果某个类位于不同的命名空间中,则需要像以下那样使用它:

use Some\Name\Space\Tidy;
new Tidy();
还是像这样

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

明智的建议是你去读一读

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

如果某个类位于不同的命名空间中,则需要像以下那样使用它:

use Some\Name\Space\Tidy;
new Tidy();
还是像这样

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

谢谢,现在可以用了。我意识到我应该使用完全限定的名称tidy,但我不知道这是什么,现在我知道了,再次感谢。名称空间就像linux文件系统一样,但使用反斜杠,所以根是\等等。谢谢,它现在可以工作了。我意识到我应该使用完全限定的名称tidy,但我不知道这是什么,现在我知道了,再次感谢。名称空间就像linux文件系统一样,但是有反斜杠,所以根是\等等。