静态函数行为和__toString魔术方法

时间:2014-11-07 13:49:13

标签: php oop static

以下是我的代码的缩减片段

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方法,但后者不调用?

修改

link to full element class

2 个答案:

答案 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