Autor Zpráva
FNM
Profil *
Ahoj,
mohl by mi někdo prosím říct po lopatě (žádné odkazy na manuál, tam jsem to moc nepochopil)


k čemu je funkce __construct, __set a __get , k čemu slouží a kdy jsou nebo naopak nejsou potřeba? Můžete napsat jednoduchý příklad?

Děkuji mnohokrát.
krteczek
Profil
__construct slouží (v php5) k vykonání nějakého kódu ihned při inicializaci třídy
FNM
Profil *
__construct slouží (v php5) k vykonání nějakého kódu ihned při inicializaci třídy

Takže jestli to chápu správně, NEMUSÍM ho používat, stejně tak jako __set a __get ? Myslel jsem, že je to nutnost, když už si naprogramuju nějaké metody, které potom volám, takže musím ještě nastavit např. __construct na nějaké základní hodnoty. Pak mi přišlo, že __construct a __set že jsou si hodně podobný, nebo abych byl přesnej, žádnej rozdíl jsem nenašel.
souki
Profil
__construct se volá při inicializaci třídy
__set se volá při pokusu o nastavení hodnoty neexistující členské proměnné

v čem je to podobné?
lam1t0
Profil *
ukazka __construct

<?php

class UkazkaConstructru
{
function __construct()
{
echo "prave si vytvoril instanciu triedy: ". __CLASS__;
}
}

$uc = new UkazkaConstructru();

?>

vystupom bude ze skript vypise "prave si vytvoril instanciu triedy: UkazkaConstructru"


ukazka pre __set

<?php

class ukazkaSetu
{
$m_prvky = array();

function __set($kluc, $hodnota)
{
$m_prvky[$kluc] = $hodnota;
}

function __get($kluc)
{
return $m_prvky[$kluc];
}
}

$us = new ukazkaSetu();

$us->premenna1 = "a";
$us->premenna2 = "b";

echo $us->premenna1;
echo "<br>";
echo $us->premenna2;

?>

priklady som neskusal, takze su tam mozno syntakticke chyby,.. ale myslim ze vyznam je jasny
FNM
Profil *
o.k. Zkusil jsem sám napsat jednoduchou třídu na Formulář, když si nebudeme všímat syntaxe html u formuláře, ale jen OOP třídy Form, co byste mi u ní vytkli?
Podotýkám, že OOP teprve zkouším, jsem začátečník.



class Form
{
private $endForm = '</form>';


function __construct($method, $id, $width_table)
{
if(($method == 'post' || $method == 'get') && intval($id) && intval($width_table) )
{
echo "<table cellpadding="3" cellspacing="0" border="0" style="".$width_table.""> ";
echo "<form action="".$_SERVER['PHP_SELF']."" method="".$method."" id="".$id.""> ";
}
else
{
echo "<p>Nebyly zadány korektní hodnoty!</p> ";
}

}


function text($width, $name)
{

if ( isset($width) && isset($name) && ($width >= 0 && $width <= 50))
{
echo "<tr><td><input type="text" name="".$name."" size="".$width."" /></td></tr> ";
}
else
{
return false;
exit;

}
}

function submit($width, $text)
{

if ( isset($width) && isset($text) && ($width >= 0 && $width <= 150))
{
echo "<tr><td><input type="submit" value="".$text."" style="width:".$width."px" /></td></tr> ";
}
else
{
return false;
exit;

}
}



function endForm()
{
$endF = $this->endForm;
echo $endF;
echo " </table> ";
}


}

$form = new Form('post', 1, 350);


$form->text(20, 'text');
$form->text(20, 'email');
$form->text(20, 'mesto');
$form->submit(100, 'Odešli');

$form->endForm();
Mastodont
Profil
FNM
V zásadě to není špatné jako cvičení, ale:
- je to asi tisící třída, kterou jsem viděl na toto téma. (= nemá význam vynalézat kolo)
- IMHO by metody tříd neměly obsahovat echo, ale vracet hodnotu, kterou vypíšeš přes echo "zvenčí".
FNM
Profil *
- je to asi tisící třída, kterou jsem viděl na toto téma. (= nemá význam vynalézat kolo)

toto jsem ne uplně přesně pochopil



- IMHO by metody tříd neměly obsahovat echo, ale vracet hodnotu, kterou vypíšeš přes echo "zvenčí".

díky za radu
Mastodont
Profil
FNM
Myslím tím to, že téměř každý, kdo píše třídu na formuláře, píše stylem:
$f = new Form();
$f->přidejPrvek ...
$f->přidejPrvek ...
$f->VypišFormulář()

Prostě hotových řešení je v tomto směru iks ypsilon a je zbytečné ztrácet čas vývojem vlastní třídy.

Já si třeba myslím, že je blbost dynamicky skládat dohromady formulář, který vypadá vždy stejně. Takový mohu mít uložen přímo v HTML a vložit ho najednou. Jen dynamicky plněné seznamy apod., kde se položky mohou měnit, stojí za to řešit kódem.
FNM
Profil *
Jo takhle, třeba pomocí include, nebo normálních function...

No já to pojal spíš jako příklad, jestli tímhle stylem, co tam chybí, nebo tam naopak být nemá (třeba to tvoje upozornění na echo)
FNM
Profil *
resp. takhle, k čemu nejužitečnějšímu z praxe se dá třída využít? Přijde mi, že jde jen o jakési zjednodušení, protože to co jde pomocí třídy, objektově, jde i procedurálně. OOP se chci naučit, protože všude se píše, že je to lepší, motivaci mám, ale v zásadě mi chybí pochopení kde je ta zásadní výhoda? Je něco co třída - tedy OOP, umí a procedurální přístup to nezvládne?

Omlouvám se za možné bláboly, ale myslím že spoustu lidí začínalo taky s podobnými pocity, když se vrhalo na programování v OOP.
Mastodont
Profil
No výborná je třeba dědičnost, která umožňuje vytvářet různé, navzájem se méně či více lišící třídy. Odpadá nutnost duplikovat kód ve funkcích nebo spousta ifů.

Dále jsou třídy dobré kvůli tomu, že pomocí interních vlastností lze snadno nahradit globální proměnné, předávané mezi různými funkcemi.

Na toto téma bylo napsáno mnoho článků, IMHO se dají snadno vygooglit. Hladina krve v mém vínu (pardon naopak) a polooblečená žena za mnou mi brání rozepsat se víc ...
bukaj
Profil
FNM
No já to pojal spíš jako příklad, jestli tímhle stylem, co tam chybí, nebo tam naopak být nemá
Krom toho že, aby bylo dosaženo zapouzdření, by metody měli hodnoty vracet a ne vypisovat, což to už padlo, bych volil popisnější jména metod. Člověk si nejdříve říká, že je mu jasné, že např. metoda text() prostě vypíše <input type="text"... Ale co za rok... A pokud kód uvolníš pod svobodnou licencí, co ostatní...

A možná taky uvádět viditelnost u metod, když už to PHP nabízí.

ad. Proč OOP?
Objektově orientované programování se vyvinulo na konci 80. let (pokud si pamatuji), když počítače začaly mít jakýsi takýsi výkon. Hlavní motivací pro psaní metodou OOP bylo zapouzdření (to je např. s tím, že metody by měly vracet hodnotu místo toho, aby něco rovnou vypsali; objekt odvede svou práci a vrátí výsledek) a znovupoužitelnost (napíšu to jednou a pořádně a vys***u se na to). Je toho samozřejmě víc, ale tohle mi připadá takové nejdůležitější.

Jinak OOP by mělo být prostředkem, nikoli cílem. Proto se do ničeho nenuť.
FNM
Profil *
Díky, našel jsem si toto k OOP:

http://finc.ic.cz/?p=21

A co si to tak čtu, tak mi z toho vychází, že PHP není moc good na OOP (v porovnání třeba s JAVOU), resp. těží jen z toho, že je to na web. aplikace to nejjednodušší co může být.
bukaj
Profil
FNM
Jinak Java taky není vrcholem OOP. Podívej se po Smalltalku.
lam1t0
Profil *
No co sa tyka OOP v PHP.... PHP nebolo povodne navrhnute na pracu s Objektami, boli tam pridane az postupom casu. Ale aj napriek tomu, tak v dnesnej dobe je PHP na schopnej urovni co sa tyka OOP. Podporuje mnohe veci ako ine vyspele objektove programovacie jazyky napr interface, modifikatory pristupu (private, public, protected), dedicnost, pretazovanie, .... Navyse obsahuje jednu vlastnost, ktoru postradaju mnohe ine jazyky... Reflexia - v skratne: "za jazdy" si zistujes a vytvaras objekty podla nazvu v premennej a ine.... Samozrjme ze tieto veci so sebou prinasa az verzia 5.x a vysie.

Java je tam tom z hladiska objektov lepspie ale co sa tyka vykonu tak jednoznace PHP.

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:

0