Autor Zpráva
dizi
Profil *
Dobrý deň, mám taký celkom veľký problémik z php..
Object of class Visitors could not be converted to string


Čo tento problém znamená viem.. a viem aj to že to je spôsobené verziou php. Ale ako to vyriešiť? Áno vygooglil som niečo ale boli to nepoužiteľné spôsoby.

Funckia v ktorej to hlási je súčasťou šablonovacieho systému, a je to konkrétne ten zvýraznený riadok
function parse($target, $block = "", $append = false)
{
if($block == "") {
$block = $target;
}
if(isset($this->blocks["/\{$block}/"])) {
if($append) {
$this->vars["/\{$target}/"] .=
preg_replace(array_keys($this->vars), array_values($this->vars),
$this->blocks["/\{$block}/"]);
} else {
$this->vars["/\{$target}/"] =
preg_replace(array_keys($this->vars), array_values($this->vars),
$this->blocks["/\{$block}/"]);
}
switch($this->unknowns) {
case "keep":
break;

case "comment":
$this->vars["/\{$target}/"] = preg_replace('/{(.+)}/',
"<!-- UNDEF: \\1 -->", $this->vars["/\{$target}/"]);
break;

case "remove":
default:
$this->vars["/\{$target}/"] = preg_replace('/{\w+}/',
"", $this->vars["/\{$target}/"]);
break;
}
} else {
$this->halt("parse: neexistujuci blok \"$block\".");
}
return $this->vars["/\{$target}/"];
}


Neviete o nejakom jednoduchom spôsobe ako to vyriešiť? Mňa napáda jedine vytvoriť novú metódu, ktorá tie polia rozbije a každú jednu položku prevedie na string a spraví z toho späť pole.. ale nezdá sa mi to efektívne
Mastodont
Profil
Napsat metodu __toString jsi zkoušel?
dizi
Profil *
áno túto metódu som skúšal, pravdepodobne som prepracovaný, ale nejak neviem prísť nato čo ma vrátiť
dizi
Profil *
spravil som si samostatny class pre metodu to string
class magicmethod
{
   public $co;
   //pixlovina
   public function __construct($co) 
   {
       $this->co = "/\{$co}/";
   }
   public function __toString() 
   {
       return $this->co;
   }
}


a kod vo funkcii parse som trochu upravil
                $blok = new Magicmethod($block);
                $ciel = new Magicmethod($target);
                echo $blok."<br>";   //toto pekne bezi
                echo $ciel."<br>";     //toto pekne bezi
                $this->vars[$ciel]= preg_replace(array_keys($this->vars), array_values($this->vars), $this->blocks[$blok]);


stale hlasi to z convertovanim objectu + pribudla nova hlaska:

[kod]
Warning: Illegal offset type in /data/www/xxx/rsx2/classes/class.template.php on line 73
[/kod]
ta 73 je stale ten isty riadok..
BetaCam
Profil
dizi
$blok = new Magicmethod($block);
$ciel = new Magicmethod($target);
echo $blok."<br>"; //toto pekne bezi echo
$ciel."<br>"; //toto pekne bezi
$this->vars[$ciel]= preg_replace(array_keys($this->vars), array_values($this->vars), $this->blocks[$blok]);


co je v $block??
co je v $target??
co je v $this->vars??
co je v $this->blocks??

Možná by nebylo od věci napsat sem celou třídu. Pokud ti to bude proti srsti hodilo by se alespon říct co které proměnné obsahují.

Pokud bych se měl spolehnout jen na svou křištálovou kouli tak bych podle hlášky "Object of class Visitors could not be converted to string" řekl, že

$this->vars je pole se string hodnotama
$this->blocks je pole objektů

tedy +-, že

$this->blocks['Visitors'] = new Visitors();
$this->blocks['Stats'] = new Stats();

preg_replace(array_keys($this->vars), array_values($this->vars), $this->blocks[$blok]);


pomocí $this->blocks[$blok] se tedy snažíš použít objekt jako string což hází chybu. Pokud je to takto měly by třídy "Visitors", "Stats", a dalsí, kteté takto budeš využívat mít definovanou metodu __toString(), která se postará o "převedení objektu na string" pokud to tak není tak zdřejmě má věštící koule zklamala a ty by si měl zkusit dodat nějaké další informace o problému.
dizi
Profil *
na úvod predovšetkým ďakujem za reakciu.. v princípe ti "křištálova koule" funguje.. :)

Ak som správne pochopil každá z tried, ktoré tomto skripte používam musí mať metódu __toString? Dúfal som že bude stačiť vloženie do tejto aktuálnej triedy
BetaCam
Profil
dizi
Ak som správne pochopil každá z tried, ktoré tomto skripte používam musí mať metódu __toString?

V tomhle případě ji budou zdřejmě muset mít všechny třídy, které ukládáš do $this->blocks. Jak jí tam dostaneš to je na tobě jesli jí v každé třídě nadefinuješ nebo jí třeba zdědíš. Další možnost je úprava šablonovacího systému. Nelze tady řešit konkrétní postupy jak bys to měl řešit na to by byla potřeba znát šablonovou třídu a třídy bloků.
dizi
Profil *
úprava šablonovacieho systému pravdepodobne neprichádza moc do úvahy, pohrám sa z tou metódou..

ešte raz Ďakujem
dizi
Profil *
v mojich classoch som tento problém vyriešil, ale ako to vyriešiť v prípadte stdClass?

Object of class stdClass could not be converted to string in..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: