Portál AbcLinuxu, 7. května 2025 22:02

Dotaz: Problem s výstupem z class v php

8.8.2013 13:42 Venda
Problem s výstupem z class v php
Přečteno: 277×
Odpovědět | Admin
Ahoj, mám dvě třídy s názvy Aaa a Bbb. (Ve tříde Aaa vytvořím instanci třídy Bbb).

Třída Aaa
class Aaa {
  private $aaa;
  public function __construct() {
  $this->aaa = new Bbb();
 }

 function __toString() {
  return $this->aaa;
 }
}
Třída Bbb
class Bbb {
  private $bbb;
  public function __construct() {
  $this->bbb = 'Výsledek';
 }

 function __toString() {
  return $this->bbb;
 }
}
Vytvořím instanci třídy Aaa ale dostanu chybu!
echo new Aaa(); // Method Aaa::__toString() must return a string value
Zjistil jsem, že když ve tříde Aaa opravím řádek
$this->aaa = new Bbb();
za
$this->aaa .= new Bbb();
tak to funguje. Proč tomu tak je však nedokážu nějak pochopit, vždyť nic nespojuji, tak proč tečka? Poradí někdo? Děkuji
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Tarmaq avatar 8.8.2013 13:58 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vsak to mas v popisu chyby, metoda __toString() musi vracet string. Takze v tride Aaa predelej metodu __toString() takto:
 function __toString() {
  return strval($this->aaa);
 }
Don't panic!
8.8.2013 14:01 Venda
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Ale to není odpověď na mou otázku, pořád nevím, proč tečka ovlivňuje jestl bude výstup objekt nebo string, tohle bych potřeboval objasnit. Děkuji
Tarmaq avatar 8.8.2013 14:19 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
ty nevis jaky je rozdil mezi operatorem = a .=? Prvni je prirazeni, druhy je zkraceny zapis concatenace stringu.
$this->aaa .= new Bbb();
by se tedy dalo zapsat take takto:
$this->aaa = $this->aaa . new Bbb();
No a pri concatenaci dochazi k prevodu na string, takze se na instanci new Bbb() zavola metoda __toString()
Don't panic!
8.8.2013 15:00 Venda
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Jenže já v $this->aaa nic jiného krom výsledku ze třídy Bbb() nemám, tudíž nerozumím proč mám spojovat prázdný řetězec, kdyby $this->aaa obsahovala ještě nějaká data ve své třídě new Aaa() tak to chápu ale takto ne. Díky
Tarmaq avatar 8.8.2013 15:39 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Co to je "vysledek z tridy"? V $this->aaa nemas zadny vysledek, mas tam instanci tridy Bbb. Metoda __toString() se vola jen v pripade, ze je potreba z te instance udelat string.
Don't panic!
8.8.2013 15:56 axel
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Co dela tecka si objasni v libovolnem tutorialu PHP. Metodou nekam napisu treba tecku a uvidim, jestli mi to nahodou nezacne "fungovat", se nikam nedostanes. Kdyz das do promenne instanci tridy, je v ni instance tridy. Kdyz tam das string (napr. ziskany volanim __toString na instanci), je tam string. To je zcela elementarni a pokud to nechapes, opet se vrat k libovolnemu tutorialu PHP.
8.8.2013 15:54 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Odpovědět | | Sbalit | Link | Blokovat | Admin

Musíš nějak vynutit konverzi na řetězec a pomocí .= jsi provedl $this->aaa = $this->aaa . new Bbb();.

Já mám otázku: »Co vás lidi, tedy fčul Tebe, prosím Tě vede k tomu to používat takto (používat __toString())?«
To se musí někde líhnout tyto nápady a musí to mít nějaký důvod :).

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
8.8.2013 17:06 Venda
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Když __toString() nepoužiju, tak jak dostanu výsledek co vytvoří ta class?

Příklad
class Aaa {
  private $aaa;
  public function __construct() {
  $this->aaa = false;
  $this->aaa .= '<ul>';
  $this->aaa .= '<li>aaa</li>';
  $this->aaa .= '<li>bbb</li>';
  $this->aaa .= '<li>ccc</li>';
  $this->aaa .= '</ul>';
 }
}
$aaa = new Aaa();

echo $aaa;
8.8.2013 17:22 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php

A k čemu je taková třída?

Dobře, bude to „výkonná“ třída:

<?php
class Aaa {
  static public function getListStatic() {
    $o  = '
    '; $o .= '
  • aaa
  • '; $o .= '
  • bbb
  • '; $o .= '
  • ccc
  • '; $o .= '
'; return $o; } public function getList() { $o = '
    '; $o .= '
  • aaa
  • '; $o .= '
  • bbb
  • '; $o .= '
  • ccc
  • '; $o .= '
'; return $o; } }; echo Aaa::getListStatic(),"
\n"; $o = new Aaa(); echo $o->getList(),"
\n";

PS: Neplatanl bych bool a string jen tak bezdůvodně…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
8.8.2013 17:26 Venda
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Tohle je mi jasný, ale jak to udělám s použitím __constructor() ? Díky
Tarmaq avatar 8.8.2013 17:41 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
class Aaa
{
  private $o;
  public function __construct()
  {
    $this->o  = '
    '; $this->o .= '
  • aaa
  • '; $this->o .= '
  • bbb
  • '; $this->o .= '
  • ccc
  • '; $this->o .= '
'; } public function getList() { return $this->o; } }; $o = new Aaa(); echo $o->getList(),"
\n";
U staticke varianty se konstruktor nevola, konstruktor se vola pri instanciaci..
Don't panic!
8.8.2013 17:47 Venda
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
Ale zase musím volat metodu, proto jsem tam dal __toString() a nemusím už nic volat, vytvořim instanci v proměnné $o a zrovna v ní mám zpracované data z class.
$o = new Aaa();
echo $o; 
# Výsledek
aaa
bbb
ccc

Tarmaq avatar 8.8.2013 17:56 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
No a kde je teda problem? Tohle ti nestaci?
Don't panic!
8.8.2013 18:23 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Problem s výstupem z class v php
PS: Stejně se metoda volá, nic jsi neušetřil, jen si to komplikuješ….
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

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.