Portál AbcLinuxu, 13. července 2025 13:31


Dotaz: Oprava kódu

16.3.2017 04:22 Tomáš Hradecký
Oprava kódu
Přečteno: 577×
Odpovědět | Admin
Ahoj, pořád dostávám chybu

Catchable fatal error: Method Controller::__toString() must return a string value in /www/index.php

Nemůže mi prosím někdo poradit?
class View{
     private $model;
     public function __construct($model){
          $this->model = $model;
     }
     private function title(){
          return $this->model->title();
     }
     public function __toString(){
          return   '<!DOCTYPE HTML>'.
                   '<html>'.
                        '<head>'.
                             '<title'.$this->title().'</title>'.
                        '</head>'.
                        '<body>'.
                        '</body>'.
                   '</html>';
     }
}

class Model{
     public function __construct(){
     }
     public function title(){
          return 'title';
     }
}

class Controller{
     private $html;
     public function __construct(){
          $model = new Model ();
          $this->html = $view = new View ($model);
     }
     public function __toString(){
          return $this->html;
     }
}

$controller = new Controller();
echo $controller;
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

16.3.2017 05:26 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
$this->html není string, ale objekt. Obvykle pomůže přetypování zřetězením:
public function __toString() {
     return '' . $this->html;
}
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kozzi avatar 16.3.2017 06:34 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Oprava kódu

Ale fuj :D.

http://php.net/manual/en/function.strval.php

Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
16.3.2017 16:12 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava kódu
No jo, obvykle v __toString() nevracím jen prezentaci vnořeného atributu, ale komplexní textovou prezentaci celého objektu. V daném případě je přetypování (string) vhodnější.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
kozzi avatar 16.3.2017 06:40 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin

Normalne to pretypuj:

public function __toString(){
    return (string)$this->html;
}
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
16.3.2017 14:17 Tomáš Hradecký
Rozbalit Rozbalit vše Re: Oprava kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Děkuji a to je běžná věc, že se přetypovávají proměnné nebo je to jen lenost/neschopnost programátorů?
16.3.2017 14:59 chrono
Rozbalit Rozbalit vše Re: Oprava kódu
Áno, ak funkcia __toString vráti čokoľvek iné ako reťazec, je to neschopnosť programátora. :)
kozzi avatar 17.3.2017 08:31 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Oprava kódu

Tak jde o to ze pokud mate nejnovejsi php, tak muzete (a mel by ste) urcit navratovy typ funkce

...
class Controller{
     private $html;
     public function __construct(){
          $model = new Model ();
          $this->html = $view = new View ($model);
     }
     public function __toString():string {
          return $this->html;
     }
}
...
Potom uz neni treba pretypovat
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
17.3.2017 10:09 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava kódu
Je to otázkou priorit. Mé skripty musí fungovat na PHP 5.3 i 7.0. Nové vlastnosti PHP si tedy nemohu dovolit.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.