Php Zend Framework 2中的奇怪类自动加载会干扰tidy类的查找
我正在使用Zend Framework 2做一些工作,这里我需要清理用户的输入,它是Html格式的。我以前在普通php中使用过php tidy扩展,没有使用名称空间和自动加载,代码运行良好 这一次,我在zf2中编写了一个视图助手,如下所示: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
<?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文件系统一样,但是有反斜杠,所以根是\等等。