Поведение статической функции и магический метод __toString

Вот сокращенный фрагмент моего кода

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 метод, а последний нет?

редактировать

ссылка на полный класс элемента

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

Другие решения

функция element () класса html является статической, поэтому вы не хотите создавать экземпляр html, а вместо этого вызываете свою функцию следующим образом:

echo html::element('a')->...

Иногда бывает необходимо привести возвращаемое значение, чтобы получить строку, потому что функция элемента возвращает объект элемента:

$var = (string)html::element('a')->...

NB: обратите внимание, я не использую $ html

0

По вопросам рекламы [email protected]