以下是我的代码的缩减片段
namespace classes\tools\html;
class html{
public static function element($tag) {
return new element($tag);
}
}
class element{
//......
public function __toString() {
$element = "<$this->tag";
foreach ($this->attributes as $attribute => $value) {
$element.= " $attribute=\"$value\"";
}
if ($this->selfClosing) {
$element.="/>";
return $element;
}
$element.=">$this->html</$this->tag>";
return $element;
}
}
$html = new html();
如果我将元素称为:,那令我困惑的是什么
$html::element('a')->attr('href','/home/')->html('home');
它会返回
'<a href="/home/">home</a>"
但是我打电话给:
$html->element('a')->attr('href','/home/')->html('home');
它将返回element
对象
所以我的问题是为什么用::
运算符静态调用它来调用__toString
方法,但后者不调用?
修改
答案 0 :(得分:1)
我已尝试使用此帖子底部的代码复制此行为,但无法解决此问题。
如果您可以尝试在PhpFiddle上运行代码并且看到它,您会得到相同的结果。
如果您可以发布attr()和html()的基本要素(返回值和类型),也可能有所帮助;
很抱歉发布这个作为答案,但我还没有发表评论,我觉得这个问题很有意思。
我用过的代码:
class html{
public static function element($tag) {
return new element($tag);
}
}
class element{
public function attr($a,$b){
return $this;
}
public function html($a){
return $this;
}
public function __toString() {
return "iLot\n";
}
}
$html = new html();
echo $html::element('a')->attr('href','/home/')->html('home');
echo $html->element('a')->attr('href','/home/')->html('home');
?>
答案 1 :(得分:0)
类html的element()函数是静态的,所以你不想创建一个html实例,而是像这样调用你的函数:
echo html::element('a')->...
有时需要强制转换返回值以获取字符串,因为element函数返回一个元素对象:
$var = (string)html::element('a')->...
注意:请注意我不使用$ html