php Objektum Orientált + kód magyarázat
Sziasztok az egyetemen most vagyok majdnem 2.hónapja eddig csak strukturális nyelvi alapokat vettük,de most bejött az OOP,és nem értem egyáltalán sokat olvasok róla javában kezdtük el az oop-t,de én szeretném php-ban is,de a szemléletem még nincs meg hozzá.
Valaki részletesen elmagyarázná az alábbi kód részletet?
Legyen szíves olyan válaszolni aki nem fog elküldeni melegebb éghajlatra a kódommal ezt az egyik könyvben találtam tökéletesen működik.
Egy nagy bajom van a programozással,hogy nincs sehol jó magyar nyelvű könyv php oop-ről.
És egy középfokú angol nyelvvizsgával nem sokra megyek.(közel 5éve csináltam a vizsgát)
■ Valaki részletesen elmagyarázná az alábbi kód részletet?
Legyen szíves olyan válaszolni aki nem fog elküldeni melegebb éghajlatra a kódommal ezt az egyik könyvben találtam tökéletesen működik.
Egy nagy bajom van a programozással,hogy nincs sehol jó magyar nyelvű könyv php oop-ről.
És egy középfokú angol nyelvvizsgával nem sokra megyek.(közel 5éve csináltam a vizsgát)
<?php
class Login // itt létre hozzuk a login osztályunkat,ha nem jól tudom kijavítanál?
{
private $_id; // na igen mit is jelent pontosan,hogy private mit csinál ez?
private $_username;
private $_password;
private $_passmd5;
private $_errors;
private $_access;
private $_login;
private $_token;
public function __construct()//Ezt sem értem,hogy mi célt szolgál
{
$this->_errors = array();// a $this itt mi célt szolgál?
$this->_login = isset($_POST['login'])? 1 : 0; //ezt nem tudom értelmezni
$this->_access = 0; // és ezt se
$this->_token = $_POST['token'];//És ezt se!
$this->_id = 0;// szintén nem tudom mit jelent
$this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username'];// szintén nem tudom mit jelent
$this->_password = ($this->_login)? $this->filter($_POST['password']) : '';// szintén nem tudom mit jelent
$this->_passmd5 = ($this->_login)? md5($this->_password) :
$_SESSION['password'];// szintén nem tudom mit jelent
}
public function isLoggedIn() // szintén nem tudom mit jelent
{
($this->_login)? $this->verifyPost() : $this->verifySession(); // szintén nem tudom mit jelent
return $this->_access;// szintén nem tudom mit jelent
}
public function filter($var)// szintén nem tudom mit jelent
{
return preg_replace('/[^a-zA-Z0-9]/','',$var);//itt ellenőrizzük,hogy megfelelnek a karakterek
}
public function verifyPost()// szintén nem tudom mit jelent
{
try// szintén nem tudom mit jelent
{
if(!$this->isTokenValid())// szintén nem tudom mit jelent
throw new Exception('Invalid Form Submission');// szintén nem tudom mit jelent
if(!$this->isDataValid())// szintén nem tudom mit jelent
throw new Exception('Invalid Form Data');// szintén nem tudom mit jelent
if(!$this->verifyDatabase())// szintén nem tudom mit jelent
throw new Exception('Invalid Username/Password');// szintén nem tudom mit jelent
$this->_access = 1;// szintén nem tudom mit jelent
$this->registerSession();// szintén nem tudom mit jelent
}
catch(Exception $e)// szintén nem tudom mit jelent
{
$this->_errors[] = $e->getMessage();// szintén nem tudom mit jelent
}
}
public function verifySession()// szintén nem tudom mit jelent
{
if($this->sessionExist() && $this->verifyDatabase())// szintén nem tudom mit jelent
$this->_access = 1;// szintén nem tudom mit jelent
}
public function verifyDatabase()// szintén nem tudom mit jelent
{
//Database Connection Data// szintén nem tudom mit jelent
mysql_connect("localhost", "root", "") or die(mysql_error());// szintén nem tudom mit jelent
mysql_select_db("example") or die(mysql_error());// szintén nem tudom mit jelent
$data = mysql_query("SELECT ID FROM users WHERE username = '{$this->_username}' AND password = '{$this->_passmd5}'");//itt lekérzeünk
if(mysql_num_rows($data))//itt végig megyünk a sorokon
{
list($this->_id) = @array_values(mysql_fetch_assoc($data));// szintén nem tudom mit jelent
return true;// szintén nem tudom mit jelent
}
else
{ return false; }// szintén nem tudom mit jelent
}
public function isDataValid()// szintén nem tudom mit jelent
{
return (preg_match('/^[a-zA-Z0-9]{5,12}$/',$this->_username) && preg_match('/^[a-zA-Z0-9]{5,12}$/',$this->_password))? 1 : 0;// szintén nem tudom mit jelent
}
public function isTokenValid()// szintén nem tudom mit jelent
{
return (!isset($_SESSION['token']) || $this->_token != $_SESSION['token'])? 0 : 1; // szintén nem tudom mit jelent
}
public function registerSession()// szintén nem tudom mit jelent
{
$_SESSION['ID'] = $this->_id;// szintén nem tudom mit jelent
$_SESSION['username'] = $this->_username;// szintén nem tudom mit jelent
$_SESSION['password'] = $this->_passmd5;// szintén nem tudom mit jelent
}
public function sessionExist()// szintén nem tudom mit jelent
{
return (isset($_SESSION['username']) && isset($_SESSION['password']))? 1 : 0;// szintén nem tudom mit jelent
}
public function showErrors()// szintén nem tudom mit jelent
{
echo "<h3>Errors</h3>";// szintén nem tudom mit jelent
foreach($this->_errors as $key=>$value)// szintén nem tudom mit jelent
echo $value."<br>";// szintén nem tudom mit jelent
}
}
?>
Ezt én sem értem
Egyébként azt sem értem, hogy egy középfokú angol nyelvtudás birtokában hogy a bánatba nem érted az angol doksikat.
Én mindössze másfél évig, heti egy órában tanultam angolt (majd' harminc éve) és az egyszerű dokumentációkkal általában nincs gondom. Cikkek esetében néha elakadok, de az más téma.
Angol!
Ha az alap nyelvtan megy,
De azt végképp nem értem, hogy korábban mit csináltál a PHP-vel, ha ennyi minden ismeretlen.
bocsi
Kiírja,hogy error h3 betű mérettel!
Érted már mi a gond ezzel?
Így honnan tudjuk, hogy mi az amit valóban meg kellene magyarázni?
Amit így hirtelen hozzá tudok tenni (nem feltétlenül szakszerűen) :
A _construct az osztály konstruktora.
Amikor létrehozol az osztályból egy példányt, akkor lefut a konstruktor, amiben inicializálhatod az objektumodat. Kezdőértéket adhatsz a példányváltozóknak, létrehozhatsz újabb objektumokat stb. stb. stb. Lényeg, hogy csak egyszer fut le (nem is szabad külön meghívni), amikor létrejön az új objektum.
A $this-> hivatkozások az ú.n. példányváltozókat jelzik. A példányváltozó lényege, hogy az osztályból létrehozott objektumhoz tartozik, az objektumon belül minden metódus láthatja.
Ahogy elnézem, gondot jelent a ? : is. Ezt általában feltételes értékadáshoz használják: a ? elé egy logikai kifejezést írsz, mögé érték1:érték2 formában egy értékpárt. A kifejezés értéke érték1, ha igaz a feltétel, érték2, ha hamis.
És nagyon kell vigyázni, hogy lehetőleg több ilyet ne akarj egymásba ágyazni, mert kínos meglepetések érhetnek. :-)
Azért vicces. :)
(nem biztos, hogy pont egy Login osztállyal kell megismerni az OOP-t, nem véletlenül szokták az Állat osztályt elővenni, majd a Kutya osztályt illetve a Buksi objektumot... szerintem az OOP alapjairól száz számra vannak magyar leírások, inkább azokból olvasgassál, majd ha ott nem értesz valamit, akkor arra kérdez rá, a nem értek semmit, segítsetek!-kel nehéz bármi is kezdeni)
Megfogadom!
Ha esetleg nem erről a
Illetve:
http://hu.wikipedia.org/wiki/Objektumorient%C3%A1lt_programoz%C3%A1s Most látom, hogy Felhő cikke is be van ide linkelve :)
Aztán ha ezek az alapok megvannak, akkor lehet menni a mélyvízbe a patternekkel, hogy ne csak OOP, de hasznos is legyen a produktum.
nem akadékoskodni akarok
Néhány tippet adnék, hogy hogyan tudsz te magad utánajárni a kérdéseidnek:
Nagyon sok magyar nyelvű anyag van a PHPről, kulcsszavak alapján akár a google is kidob sok magyarázatot. Nem feltétlenül egy komplett leírást kell találnod, amiben minden benne van, hanem egyenként is utánajárhatsz dolgoknak, amíg ki nem alakul a kép.
Sok-sok példát is találhatsz.
"private $_id; // na igen mit is jelent pontosan,hogy private mit csinál ez?"
A private tipikus kulcsszó, amire rá lehet keresni. Változó deklaráció hatókörrel kapcsolatos.
"public function __construct()//Ezt sem értem,hogy mi célt szolgál "
A construct a konstruktorra utal, alapvető az OOPben, az alapokat olvasd át (még egyszer).
"$this->_errors = array();// a $this itt mi célt szolgál? "
A "this" az aktuálisan létrejövő objektumra utal. Azt jelenti hogy "ez" vagyis épp "ez", ami létrejön.
"$this->_login = isset($_POST['login'])? 1 : 0; //ezt nem tudom értelmezni "
Ez nem jó kérdésfeltevés, mert nem tudom, hogy ebből mit nem értettél. Az isset-et? A $_POST tömböt? A ternális operátort? (valami?érték:érték) Sajnos nagyon sokfelé kellene elmenni a magyarázattal, légyszíves pontosíts hogy mit nem értesz.
Keress rá a kulcsszavakra (isset, post, ternális operátor)
Tovább nem is megyek, túl sok kérdést tettél fel, túl könnyen várod el, hogy valaki mindebben egyértelműen kitalálja hogy mit nem értesz és olyan választ adjon amitől megvilágosodsz.
Nemcsak a probléma értelmezésébe, de a kérdésfeltevésbe is több energiát kell befektetned, több önállóságot. Próbáld részekre bontani a problémát.
Ha nem megy a részekre bontás, mert az összképet nem érted, akkor viszont ne soronként kommentezd, hogy "ezt sem értem", hanem első körben arra kérdezz rá, hogy a beillesztett kódrészletnek mi a célja.
Sok sikert!
Koncepcio
A kovetkezo fontos dolog az oroklodes:
Remelem, eme rovid bevezetovel sikerult tisztaba tenni nehany alapfogalmat. A tovabbi reszletekert olvasd el Felho Objektumorientált programozás előnyei a kódújrahasznosítás jegyében cimu cikket vagy tanulj meg angolul. :)
Magyarul tanulni - luxus?!
Tehát jogos igény, ha magát az OOP-t magyarul akarod megérteni.
Erre mondjuk nem a PHP a legjobb nyelv; Angster tanárnő tankönyvét én is tudom javasolni (ha már Java). De mindenképp egy erősen típusos, eleve OOP-szemléletű nyelv kell - és nem megy egy pillanat alatt... Janoszen példája jó, csak pl. az Ember-t is az Élőlények->Emlősök->Emberszabásúak sorban (osztályokból) kéne örökíteni... (Egyáltalán nem rossz a példa(!), csak azt akarom szemléltetni: nagyon-nagyon összetett - és bonyolult - szabályrendszert is szokás alkalmazni OOP-ben.)
szerintem meg rossz példa,
Jobb példa például az, hogy van egy weboldal, annak oldal. Van olyan része, ami mindenhol megvan. Sok tulajfonsága van. Ne csak kinézetben gondolkodjunk. Tud mondjuk olyat, hogy kezeli a felhasználót, hogy most vendég vagy be van jelentkezve vagy admin. De van mondjuk az adatlapom oldal, ahol felül van picit definiálva. Lehet, hogy a többi oldalt mindenki láthatta, ezt meg csak a regisztrált és belépett felhasználók. Egy másik oldalon mondjuk maga a blog van. A kezdőlapon meg egy leírás. Mindegyik oldalban van valami közös, ugyanakkor mindegyik másmilyen. Lehet, hogy mindegyiknél van középen a $content tartalom, melyek minden oldalnál más értékekkel rendelkezik.
Elmélet vs gyakorlat
OOP-t így nem lehet elsajátítani, csak imitálni, mintha értenél hozzá. Nem ugyanaz. Viszont kísértetiesen hasonlít ahhoz a számtalan esethez, mikor egy szépnek mondható design mögött hulladék backend van...
Szerintem az OOP nagyon szép
Tudod, hogy hogyan magyarázták el a suliban a C++ órán az OOP-ét? Egyszer lenyomták az elméletet és valami robot mozgását kellett megcsinálnunk. Vajon hány programban szerepel robot a mozgásával? Soha nem láttam olyan egyszerű és könnyen érthető példákat, amiket nap mint nap alkalmaznak a C++ programozók. Pedig mi máson lehetne megérteni jobban az elméletet gyakorlati szinten, ha nem ilyen valós gyakori példákon? Oké, robot működik ezzel. És aztán? Szóval érted a problémát.
Miközben a mai videóban megmutatták egy függvénnyel, hogy van egy "hiba" nevű függvény és az belül szépen ki van csinosítva. Amikor meg külön meghívjuk a függvényt egy argumentummal, akkor érzékelhető, hogy milyen előnyei vannak és hogyan lehet kihasználni.
Maga a szemléletet elsajátítani nem könnyű.
Sajnos igazad lehet abban is, hogy elküldik az embert és jöjjön rá saját maga a dolgokra. Ez azonban nem mindig jön össze.
Ezt nem mondtam
Pont azért jók elmélet tanulására a nem valós példák, mert ezeken keresztül bármit be lehet mutatni az elméletből, míg gyakorlati példákon keresztül csak azt, ami az adott példában hasznos.
Tévhit az, hogy szerezz gyakorlatot, aztán próbálj elméletet tanulni hozzá. Addigra már egy csomó mindent nem- vagy rosszul gondolsz, amiket fontos jól tudni.
Ahhoz, hogy ezt jobban el tudjam magyarázni, szerintem tanárnak kéne legyek, úgyhogy bocsi, de érd be ennyivel. Nem tudom ennél pontosabban leírni, de a lényeg szerintem érthető. Az elmélet az nem gyakorlat, és egyirányú utca van a kettő közt: gyakorlatból nem lesz elméleti tudás, pont.
Az elméletet nem lehet
Így már sokkal helyesebb
Szemléltető példát kell alkalmazni, ami magát az elméletet mutatja jól be - ez szerintem sosem egy konkrét gyakorlati felhasználás.
Viszont az is igaz, hogy a megtanult / megértett elméletet alkalmazni is tudni kell: elmélet után jöhetnek a gyakorlati példák, ezek akár "élesek" is lehetnek - na nem rögtön az első...
De abban egyetértünk, hogy hasznos és kell a gyakorlat is, de nem azzal indítunk.
SOLID
Ez a kód talán túl bonyolult
Mi lenne ha a függvényekkel
A függvény lényege is annyi, hogy nem kell minden alkalommal 20-30 sort írni, hanem egy sorral meghívod bizonyos feltételekkel, értékadással és elvégzi az egész műveletet. Amíg ezt nem tapasztalod meg, addig max csak ciklusokban tudsz szerintem gondolkodni. Ha viszont elsajátítod és használsz saját magad készített függvényeket, akkor mélyebb megértésre tehetsz szert.
Nekem is nyomatták nagyon az OOP-ét. De tényleg muszáj ezt ilyen korán annyira erőltetni? Majd a profik megmondják, hogy mennyire van nagy szükség OOP-re és milyen gyakorisággal használták eddig. Én mégcsak a függvényeknél tartok, ennek a megértésével, gyakorlásával és használatával is bőven el leszek egy darabig.
+1
Szerintem
Hát ebből a
Korábbi fórumtémái
Köze sincs hozzá
Szóval igenis, a kettő nagy különbség, ha procedurálisan programozol, pont azokat a dolgokat nem használod (ki), amiktől OOP az OOP.
Személyes tapasztalat: OOP-t leginkább egy nagyon jó tanártól jó tanulni. Mindegy milyen nyelven, ha egyszer (akár "kínaiul") megértetted, nem fog többet gondot okozni más nyelveken sem (már önállóan), esetleg js lehet kicsit gond, de talán nem olyan nagy.
Én elsőre kiszenvedtem nagyon jó könyvekből, de maradtak bent lyukak is, évekkel később hozott össze a sors jó tanárral, aki már másik nyelvet (Java) tanított nekem (eredetileg "nagy" Delphi-s voltam), és valójában csak ekkor került minden a helyére.
És a mai napig sokat gondolkodom, hogy mikor csináljak valaminek már külön osztályt, ez az a része, ami már erősen fejlesztőfüggő (érdemes volna engem inf3rnoval "összemérni", neki ugyanaz a feladat min. mondjuk 10x annyi osztály, akkor is, ha mindketten jól csináljuk), nagyon széles skálán lehet jól csinálni. Rosszul meg pláne... :)
Nézegettem OOP programozásra
OOP-ét elméleti síkon értem valamilyen szinten, a rá adott példát is kezdtem elég jól megérteni. De hogy használni is tudom rendesen, arról nem vagyok meggyőződve.
Amikor írtam, akkor még nem készítettem függvényeket és nem alkalmaztam. Igen, én így gondoltam akkor is a dolgokat, ami most sem változott. Ettől persze tévedhetek.
Valameddig
Nagyon egyszerű honlapoknál még elfér, de ha egyszer megbarátkozol az OOP-vel MVC alkalmazásban, onnantól kezdve le sem teszed, annyi kényelmi funkcióval (védelemmel) bővül a tudásod. Erre jók a valóban jó keretrendszerek, amiket akár saját szájízed szerint továbbfejleszthetsz. Ne félj tőle, ez az idő is el fog jönni, ha nem, akkor valószínűleg más pályát választasz.
Sokkal kényelmesebb így programozni, ha már belejöttél, persze mindenkinek a maga tudását magának kell megszereznie.