Autor Zpráva
larryx
Profil
Nazdar zacal som sa ucit OOP no a potreboval by som pomoc

$mysqli = new mysqli(SQL_HOST, SQL_NAME, SQL_PASS, SQL_BASE);

class inzeraty extends mysqli {

    public function lavyZoznam(){
        $qry=mysqli::query("SELECT * FROM p_categories");
        while($result=$qry->fetch_assoc){
            echo $result["name"]."<br>";
        }
    }
}


chcel by som vlastne metody triedy mysqli pouzivat v inych triedach a ako si neviem ako ich volat, dalej ci je iny sposob ako dedenie kedze logika mi hovori ze inzeraty mat rodica mysqli cize pracu z databazou.. dakujem za rady

teraz vypuje chybu: Warning: mysqli::query() [mysqli.query]: Couldn't fetch inzeraty in C:\Documents and Settings\Kubko\Dokumenty\NetBeansProjects\ponuka.net\index.php on line 16
AM_
Profil
Technická chyba nevím kde je, tím spíš že jsi nedodal kompletní kód. Nicméně je vidět, že OOP jsi moc nepochopil, zřejmě se učíš ze špatného zdroje (snad ne metodou pokus-omyl?).
Především, základní rozpor s filozofií OOP: inzeráty není "zvláštní typ připojení k databázi", proto rozhodně není dobrý nápad, aby třída inzeráty dědila po třídě mysqli.

Uvedený kousek kódu sám o sobě určitě nic kloudného nedělá, nicméně je to hrozný nesmysl. Bez širšího kontextu nevím, co ti víc poradit kromě pečlivějšího nastudování základů OOP.
larryx
Profil
no ved ja viem ze je to rozpor z filozofiou OOP, tak prosim ta porad ako by som mal volat jednotlive metody triedy mysqli v inych triedach ?? hmm?
AM_
Profil
larryx:
no ved ja viem ze je to rozpor z filozofiou OOP
Tak proč jsi takový kód tvořil? předpokládal jsem, že jsi si myslel, že se to takhle nějak dělá, a proto jsi takhle začal.

Jednoduchá ukázka je zde. Pokud nějaká třída přistupuje k databázi, je nejjednodušší udělat jí jednoho člena (zde $db), do kterého přiřadíš existující spojení s DB.
class A
{
  public $db;
  public function vypisNecoZDatabaze(){
    return $this->db->query('nejaky dotaz')->fetch_assoc();
  }
}

$spojeni = new mysqli (...);
$mujObjekt = new A();
$mujObjekt->db = $spojeni;
var_dump($mujObjekt->vypisNecoZDatabaze());


další možnost je obalit to statickou třídou:
  class DB{
    public static $db;
  }
  DB::$db = new mysqli();


Potom máš všude v programu dostupnou instanci mysqli přes DB::$db;

Pokud chceš využívat jen jedno mysql spojení, je možná lepší použít procedurální verzi - funkce mysqli_*, které jsou viditelné všude a kde nemusíš řešit objekt reprezentující spojení :)
Nox
Profil
Trochu složitější, ale věřím že kvalitní (kdyžtak mě opravte)
http://www.potstuck.com/2009/01/08/php-dependency-injection/

no....co napsal AM je defakto to stejné, bez automatizace
larryx
Profil
cakal som na tu tvoju odpoved za, ktoru ti dakujem... medzitym som rozmyslal ze asi fakt bude lepsie proceduralnu verziu... len som to proste chcel pochopit ako to funguje, teraz uz viem a pouzijem proceduralnu... dakujem
AM_
Profil
larryx:
en som to proste chcel pochopit ako to funguje, teraz uz viem a pouzijem proceduralnu...
OOP bohužel není něco, co se dá naučit tak, že si to prostě "zkusíš napsat" - musíš mít nejdříve teoretický základ, jak se OOP používá, a pak teprve zkoušet psát kódy :) ono i procedurální programování má své krásy, a častou chybou "objektových nadšenců" je, že se naučí technickou stránku OOP a pak se všechno snaží nějak nacpat do tříd, aniž by znali jejich principielní smysl.
Lamicz
Profil
AM:
ono i procedurální programování má své krásy
To jistě, ale bohužel dnešní doba je objektová a mám pocit, že to přináší spíš nevýhody než výhody. Všichni se snaží za každou cenu nacpat do svého RS aspoň nějakou třídu a vznikají strašná monstra bez významu. Přitom dotyčný umí solidně procedurální kód a napsal by efektivní, malý a pěkný webík, který by dělal to stejné co ten OOP a všichni by se v tom hned vyznali.
Jenomže by byl procedurální, a to je dnes "low"...
Asi jsem zpátečnický, ale IMHO se dělá se scriptovacích jazyků to, co nikdy nebyly - aplikace.

Podle mého je ten pravý důvod jiný. OOP je vyžadováno proto, že kdo s tím umí pracovat, o PHP se zřejmě zajímá a umí psát přehledný, čistý, efektivní kód. Pravda je totiž bohužel ta, že buď je web prasácky napsán nějak procedurálně (viděl jsem i RS bez jediné fce), nebo je čistý, komentovaný, přehledný v OOP (bastlů v OOP je minimum). Zkrátka bastliči se k OOP nedostanou a nebo je přestane bavit (ono s tím je dost práce a není to o syntaxi) a tím to děla ten filtr.
Proto je IMHO všude "perfektní znalost PHP 5 OOP"
AM_
Profil
Lamicz:
No to je přesně to, co jsem říkal :) jenže zkrátka některé věci se lépe řeší procedurálně, proto v plně objektových jazycích máme statické metody a singletony. V PHP, které je jak objektové, tak procedurální, není důvod staré dobré procedury nevyužít :) a je tu i další fakt - vzhledem k tomu, že životnost aplikace se pohybuje v desítkách milisekund, nemá smysl složité objektové struktury tvořit.
Nesouhlasím ale, že objektová doba přináší spíše nevýhody - OOP je silný nástroj pro psaní velkých projektů a to, že ho někdo používá špatně, je holt nevyhnutelné, a pokud někdo umí *opravdu kulturně* psát procedurálně, tak je dost rozumný na to, aby u toho zůstal.

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: