Autor Zpráva
jefitto44
Profil
Začal som kapku robiť OOP a zaujíma ma prvá vec... aký je rozdiel medzi zápisom typu

daco::urobdaco();
a
$daco->urobdaco();
?

Ďalej sa chcem spýtať, ako sa používa return... v classe si nakodim, čo chcem, aby mi daný objekt robil pri určitej metóde, to viem. Lenže ako použijem to return? Čo do neho vlastne môžem dávať?
Aby som bol konkrétny, dajme tomu, že mám databázu hráčov a každý hráč má svoje body. V class.user.php si teda založím novú funkciu, či metódu (tieto pojmy ešte presne neovládam), napr. public function getBestPlayers($limit), pričom v premennej $limit príde počet hráčov, koľko má ukázať. Ďalej pokračujem mysql_query, čiže selectom, ktorý hráčov vyberie a zoradí podľa počtu bodov. NAsleduje cyklus fetchovania výsledkov z databázy (v NeOOP už nasledovalo v cykle echo s výpisom jednotlivých hodnôt). A teraz by malo asi nasledovať return... lenže... čo do neho? A výpis v kóde bude takto? <?= $user->getBestPlayers(10)?>, čo by znamenalo, že má vybrať 10 najlepších hráčov a zobraziť? Ibaže nefunguje mi to takto...
Funguje mi to však ako <? user::getBestPlayers(10); ?> Prečo?
Snipo
Profil
Neviem či to dobre vysvetlím pretože až tak OOP neovládam ale skúsim.

daco::urobdaco() - pri volaní takejto metódy nemusíš vytvárať objekt, teda tú metódu voláš hneď z triedy (musí byť tuším public static function)

$daco->urobdaco() - $daco je objekt ktorý je potrebné vytvoriť a na neho sa aplikuje metóda

Viac si naštuduj sám, dosť sa v tom strácaš.

A k return. Je to návratová hodnota funkcie.

function sucet($x, $y)
{
  $vysledok = $x + $y;
  return $vysledok;
}

echo sucet(1,2); // Napíše 3
jefitto44
Profil
Dobre a ako by sa return mohlo použiť v mojom prípade?

echo '<table>
            <tr>
                <th>Hráč</th>
                <th>Body</th>
            </tr>
            ';
            $gbp=mysql_query("SELECT username, role, point FROM ".TABLE_PREFIX."user WHERE 1 ORDER BY point asc LIMIT ".$limit."");
            while($gBP=mysql_fetch_assoc($gbp)) {
                echo '<tr><td>'.$gBP["username"].'</td><td>'.$gBP["point"].'</td></tr>';
            }
            echo '</table>';
return ČO?
pcmanik
Profil
jefitto44:
Celkom slušne je spracovaná priamo oficiálna dokumentácia, ak teda angličtina nieje problém.
Potom dôležitým prvkom OOP je, že každá metóda je zodpovedná za jednu vec. Ak teda máš metodú na vybranie riadkov z DB, ďalšia metóda ti ich vypíše. Neviem čo si predstavuješ pod tým "fetchovaním".

A v tvojom prípade už nemáš čo returnovať keďže si to už vypísal.

Samotná trieda by mohla vyzerať nejak takto:

class User {
    private function getBestPlayers($limit) {
        // vyberieme data z DB
        return $gpb;
    }

   public function renderBestPlayers($limit) {
        $players = $this->getBestPlayers($limit);

       // vypis dat
    }
}

A nepoužívaj už mysql, je to zastaralé rozhranie ktoré bude v niektorej z budúcich verzií zmazané.
Destiny_1
Profil
daco::urobdaco(); statická metoda
daco::variable; statická proměnná

pro lepší pochopení statické proměnné si vyzkoušej třeba tohle;
<?php
class test {
static private $data1=0;

private $data2=0;

public function __construct() {
  self::$data1++;
  $this->data2++;
 echo self::$data1."<br>";
 echo $this->data2."<br>"; 

}
}
new test();
new test();
new test();
?>
return ČO?
nic...metoda nemusí za každou cenu něco vracet.
Tori
Profil
Další důležitý princip OOP (kromě jediné zodpovědnosti) je i zapouzdření - víte, že tahle metoda najde zadaný počet nejlepších hráčů, ale okolní kód nepotřebuje vědět, jak přesně to dělá, jestli je načte z databáze, z cache, nebo si najde nějaký žebříček na netu. Stačí vědět, že od ní pokaždé dostanu pole, které buď bude prázdné, anebo bude obsahovat záznamy o jednotlivých hráčích (jako vnořená pole):

array(
    array('id' => 1, 'jmeno' => 'jméno hráče', 'klub' => 'název klubu'),
    array(... další hráči
)
Takže na místě, kde to chci zobrazit, si prostě napíšu cyklus foreach a vypíšu je do nějaké tabulky, seznamu apod.

Výhody oproti původnímu stavu (načtení dat, vytvoření HTML a echo) jsou velké:
- tím, že metoda nic nevypisuje, můžete data hráčů získávat na jakémkoli místě v kódu
- vyhledání dat hráčů a zobrazení těchto dat budou vzájemně nezávislé funkčnosti, můžete upravovat každou z nich samostatně (kdybyste třeba přešel od zastaralých mysql_* funkcí na mysqli nebo objektové rozhraní PDO).
jefitto44
Profil
pcmanik:
A nepoužívaj už mysql
mysqli môžem/mám?
Kubo2
Profil
Áno.
jefitto44
Profil
Snipo:
Funguje mi to aj s public nestatic function. A funguje mi už aj druhý spôsob. Zatiaľ Ďakujem za rady

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: