ugrás a tartalomhoz

Öröklött osztály példányából szülő tulajdonságának elérése

Anonymous · 2006. Már. 27. (H), 23.44
Próbáltam rájönni, hogy az egyik objektumban beállított változó értékét hogyan lehet átvinni egy másikba, de nem sikerült, remélem tudsz segíteni. Példa:

<?php

class a {

	function a () {

		$this -> ip = $this -> ip();

	}

	function ip () {

		return $_SERVER["REMOTE_ADDR"];

	}

}

class b extends a {

	function b () {

		return $this -> ip;

	}

}

$b = new b;
echo $b -> b();

?>
Tehát azt szeretném elérni, hogy ez így ahogy van, visszaadja nekem az IP címet - anélkül, hogy a "b" objektumban, vagy bárhol máshol újra meg kellene hívnom az "ip" függvényt.
 
1

azt hiszem ilyesmi lesz a megoldás

Anonymous · 2006. Már. 28. (K), 04.05
Szia!
Bele tenyereltél rendesen. :) PHP4-ben áthidalni tudnám. A probléma a következő. $a osztályod konstruktorának kéne lefutnia, amikor $b osztályod létrejön. Ez akkor törtenik, ha örökletes konstruktor van. Alapból nem. Tegyél egy echo-t $a osztály konstruktorába, és ha kííródik, amikor $b osztályt létrehozod, akkor jó. Ezekután el kéne érned a változóit. Ha C++ vagy valami szigorúbb nyelvet nézel meg, akkor a fordító nem is engedi elérni, csak egy osztály public változóit. Ha származtatsz belőle, akkor protected változóit. De a private-et soha. Tudomásom szerint PHP4-ben ezt nem tudod definiálni. Használhatsz úgynevezett static változókat is, akkor létre sem kell hoznod az osztály ahhoz, hogy elérd a változót, hiszen típusként foglalt már neki területet. De ez le van írva valahol nagyon szépen, most nem mennék bele. A lényeg, hogy kell $a osztályba egy lagalább protected változó, és azt eléred $b-ből. figyelj, hogy ne ugyan az legyen a függvények neve, hiszen akkor override-ról van szó. Nem tudom hogy mondja szépen a magyar. :) PHP5 ben valahogy így néz ki.

<?php

class a {
	protected $ipcim = "";
	function __construct() {
		print "In BaseClass constructor\n";
		$this->ipcim = $this->ip();
		}

	function ip () {
		return $_SERVER["REMOTE_ADDR"];
		}
}

class b extends a {
	function __construct() {
		parent::__construct();
		print "In SubClass constructor\n";
		}

	function get() {
		return $this->ipcim;
		}

}

$b = new b;
echo $b->get();

?>
PHP4-ben olyan megoldást tudok javasolni, hogy csinálj egy függvényt, ami a private változóból vissza adja az értéket. Ez bevett szokás más program nyelvekben is. Így valahogy.

<?php

class a {
	function a() {
		print "In BaseClass constructor\n";
		$this->ipcim = $this->ip();
		}

	function ip () {
		return $_SERVER["REMOTE_ADDR"];
		}

	function get_ipcim () {
		return $this->ipcim;
		}
}

class b extends a {
	function b() {
		parent::a();
		print "In SubClass constructor\n";
		}

	function getip() {
		return parent::get_ipcim();
		}

}

$b = new b;
echo $b->getip();

?>
A parent::a() hivására azért van szügség, mert nem ökölve fut a konstruktor. Erről neked kell gondoskodnod. PHP5-ben megoldották, hogy parent::__construct(), de 4-esben még osztály név kell.
Remélem tudtam segíteni. Hajrá!
2

el van bonyolítva

Hodicska Gergely · 2006. Már. 28. (K), 11.25
Szia!


Kicsit elbonyolítottad ezt a dolgot. A lényeg pont amit írtál is, hogy ha van konstruktorod egy osztályban, akkor a szülő konstruktora nem hívódik meg automatikusan, ezért neked kell meghívni.
<?php
class b extends a {
    function b () {
        parent::a();
        return $this->ip;
    }
}
?>
Felhő
3

Thx

Anonymous · 2006. Már. 29. (Sze), 09.27
Köszönöm a válaszokat. Működik.
4

Mégsem

Anonymous · 2006. Már. 30. (Cs), 00.56
Kicsit elhamarkodtam, ez mégsem oké így. Egyik verzió sem. Mert ugye a parent::constructorneve(); parancs kiadásával újra lefut a konstruktor (nem csak átadja a tartalmát). Ezzel persze a benne lévő összes függvény is újra lefut (épp ezt szeretném elkerülni). Igaz, hogy ha szó szerint vesszük a nyitó postot, akkor a megoldások tökéletesek, mert ugye konkrétan nincs újra meghívva az "ip" függvény, de természetesen úgy értettem, hogy ne kelljen újra lefutnia ahhoz, hogy megkapjam az értékét.
5

ez így nem érthető

Hodicska Gergely · 2006. Már. 30. (Cs), 11.12
Szia!


Kicsit pontosabban kéne fogalmaznod, mert amiket fentebb írtál, az nem igazán értehtő, plusz olyan foglamkata is használsz, amik szintén nem igazán definiálhatók ebben a kontextusban.

Mert ugye a parent::constructorneve(); parancs kiadásával újra lefut a konstruktor

Mi az, hogy újra lefut? Csak egyszer fut le, amikor ezt a parancsot kiadod.

(nem csak átadja a tartalmát)

Ilyen nincs, hogy konstruktr tartalma, meg annak átadása.


Szóval kicsit pontosítanod kéne, hogy mit is szeretnél, lehet, hogy az általad vázolt bojektum struktúra nem igazán szerencsés.


Felhő
6

Sorry

Anonymous · 2006. Már. 30. (Cs), 12.12
Most tanulgatom az OO programozást (ez talán már nyílvánvaló), elnézést, ha néhol fogalomzavarban vagyok, illetve zavarosan teszem fel a kérdést.

Mi az, hogy újra lefut? Csak egyszer fut le, amikor ezt a parancsot kiadod.

Ha csak egyszer fut le, akkor ennek a kódnak miért az a kimenete, ami?

<?php

class a {

	function a () {

		$this -> ipcim = $this -> ip();
		echo "Lefutott az 'a' konstruktora<br />\n";

	}

	function ip () {

		return $_SERVER["REMOTE_ADDR"];

	}

}

class b extends a {

	function b () {

		parent :: a();
		return $this -> ipcim;

	}

}

$b = new b;
echo $b -> b();

?>
Kimenet:
Lefutott az 'a' konstruktora
Lefutott az 'a' konstruktora
xXx.xXx.xXx.xXx

Azt most hirtelen nem tudom lecsekkolni, hogy PHP4 alatt ennek mi a kimenete, de PHP5 ezt dobja. És ebből ugye az derül ki, hogy lefut a szülő objektum konstruktora, amikor létrehozok egy példányt a "b" objektumból, és akkor is, amikor kiadom a parent parancsot a "b" objektum konstruktorában (parent nélkül meg egyszer sem fut le, akkor egyáltalán nincs kimenete a példának).

Ilyen nincs, hogy konstruktr tartalma, meg annak átadása.

Nos meglehet, valahol itt kezdődik a probléma :) A tartalom átadásán meg azt értettem, hogy ha beállítok benne változókat, azokat ugyanúgy elérjem egy másik objektumban is (de ezt leírtam a nyitó postban is).
Meglehet az is, hogy nem túl szerencsés a programom felépítése (lévén kezdő vagyok az OOP-ban). Ez esetben némi útmutatást is elfogadnék, hogy hogyan kellene ezt megvalósítani.
9

Mit mást várnál?

Hodicska Gergely · 2006. Már. 30. (Cs), 21.43
De hát meghívod a konstruktort te magad még egyszer. Nyilvánvaló, hogy így a benne lévő függvényhívások is kétszer hívódnak meg.

Írd le leégyszi, hogy mit szeretnél pontosan elérni, és akkor tudunk tanácsot adni egy szerencsésebb osztály struktúra kialakításra. Így igazából csak egy helyben topogunk, mert nem igazán látszik, hogy a kódod milyen célt is szolgálna.


Felhő
10

Csak szivatsz, ugye?

Anonymous · 2006. Már. 31. (P), 01.38
Mégis mit nem lehet ezen érteni? Meg ne haragudj, de valami gond van a felfogó készségeddel, vagy pedig én kérdezek rosszul és/vagy rosszat. Az előbbire tippelek, mert például aki először válaszolt, rögtön elsőre megértette, hogy mit akarok tulajdonképpen.
De hát meghívod a konstruktort te magad még egyszer. Nyilvánvaló, hogy így a benne lévő függvényhívások is kétszer hívódnak meg.

Már nem tudom hanyadszor írom le, hogy éppen azt szeretném elkerülni, hogy újra meg legyenek hívva a függvények, de a beállított változók értékeit elérjem egy másik objektumban is. Még logikus is, mert minek futtassam le kétszer ugyanazt a függvényt, ha egyszer már lefutott és csak az értékeit akarom megkapni...?

Írd le leégyszi, hogy mit szeretnél pontosan elérni, és akkor tudunk tanácsot adni egy szerencsésebb osztály struktúra kialakításra.

Pontosan azt szeretném elérni, amit leírtam már ki tudja hányszor. De a kedvedért leírom újra; Beállítok egy változót az egyik objektumban, és annak az értékét meg szeretném kapni egy másik objektumban, anélkül, hogy újra meg kellene hívnom a függvényt, ami beállítja a változó értékét. Mert hát már van értéke a változónak, csak épp egy másik objektumon belül, tehát valahogy csak át kellene vinni egyik objektumból a másikba. Ha mondjuk van egy $lecso = "kóbászos"; változóm az "a" objektumban, akkor az kóbászos legyen a "b"-ben is (de ne úgy legyen kóbászos, hogy újra beállítom neki ezt az értéket egy függvény újrahívással). Kápísi?

Így igazából csak egy helyben topogunk, mert nem igazán látszik, hogy a kódod milyen célt is szolgálna.


Ez a példa, mint a neve is mutatja, csak egy példa. Egy eszköz, amin keresztül be tudom mutatni, hogy mit is akarok konkrétan, ha esetleg a kérdés feltevéséből nem lenne egyértelmű. Tehát a célja csak szemléltetés, semmi egyéb.

A fentieket csak a kedvedért írtam le (sokadszorra), mivel idő közben próbáltam rájönni a megoldásra, és sikerült is. Ha lejjebb görgeted az oldalt, láthatod is az eredményt. PHP4 és PHP5 alatt is pontosan úgy működik, ahogy elképzeltem. Legalábbis úgy tűnik, aztán lehet, hogy tévedek. Ezesetben majd egy nálam okosabb ember kijavítja a tévedésem, ha arra érdemesnek találja, hogy egyáltalán foglalkozzon a témával. Feltételezem, ez nem te leszel, hisz még a kérdést sem sikerült feldolgoznod.

Mégegyszer elnézést a stílusért és a néhol éles szóhasználatért, de komolyan nem értem, hogy mit nem lehet ezen érteni...
11

sorry, de ez triviális

Hodicska Gergely · 2006. Már. 31. (P), 07.19
Szia!


Már nem tudom hanyadszor írom le, hogy éppen azt szeretném elkerülni, hogy újra meg legyenek hívva a függvények, de a beállított változók értékeit elérjem egy másik objektumban is. Még logikus is, mert minek futtassam le kétszer ugyanazt a függvényt, ha egyszer már lefutott és csak az értékeit akarom megkapni...?
<?php
$b = new b();
echo $b->b();
?>
helyett
<?php
$b = new b();
echo $b->ipcim;
?>
Szóval kár itt nagyon belelovalnod magad, a fenti verziónak nem sok értelme van. Legelső kérdésed arra vonatkozott, hogy nem hívódik meg az a konstruktora, arra válaszoltam.

Amúgy meg attól hogy csak egy példáról van szó, még lehetne szemléletes, de ez másik kérdés.


Felhő
12

Na jólvan...

Anonymous · 2006. Már. 31. (P), 09.51
Ki is próbálod, amit írogatsz, vagy csak úgy leírod, ami épp az eszedbe jut? Csak mert ennek a verziónak egy árva bájtnyi kimenete sincs, még véletlenül se...
No Comment
13

Off... bocs

Dualon · 2006. Már. 31. (P), 10.48
Nem kéne... nem szerencsés egy nálad ennyivel többet tudó ember ismereteit, - pláne személyeskedve - felfogóképességét szidni. Nem őt minősíti.
14

Hagyd csak

Hodicska Gergely · 2006. Már. 31. (P), 11.01
Engem nem nagyon zavarnak ezek. Amúgy meg igen, ki szoktam próbálni mielőtt válaszolok. Nem tudom, hogy kedves kérdező (nem cinizmus, csak anonymous jobban utálnám leírni), melyik kódba írtad bele, amit írtam, és szállnak megfelelően ajánlottam, de itt a teljes kód.
<?php

class a {

	function a () {

		$this -> ipcim = $this -> ip();
		echo "Lefutott az 'a' konstruktora<br />\n";

	}

	function ip () {

		return $_SERVER["REMOTE_ADDR"];

	}

}

class b extends a {

	function b () {

		parent :: a();
		return $this -> ipcim;

	}

}

$b = new b;
echo $b->ipcim;
?>
Ja és a konstruktorból nem igazán van értelme bármivel is visszatérni, figyelmen kívül marad.


Felhő
16

Thx

Anonymous · 2006. Már. 31. (P), 11.54
Köszönöm a választ, így már értem. Eredetileg azt gondoltam, hogy a nyitó postban lévő példát veszed alapul - ami talán érthető, ha belegondolsz.
15

Én kérek elnézést

Anonymous · 2006. Már. 31. (P), 11.51
Többnyire kerülöm a személyeskedést, de amikor már valaki ennyire nem érti a nyílvánvalót, az felvet bennem bizonyos kérdéseket. Elismerem, hogy nálam nagyságrendekkel többet tud a Gergő, mint említettem is, ez az OOP nekem még egy elég új terület. Csak amikor valaki újra és újra ugyan azokat kérdezi, miközben én újra és újra leírom gyakorlatilag ugyan azt, akkor valahol elszakad egy cérna. Többször elnézést is kértem, és megteszem újra - és újra.
17

Egy másik út

Hodicska Gergely · 2006. Már. 31. (P), 11.59
Én általában figyelembe szoktam venni a párbeszéd másik felének "PageRank"-jét is, és ennek megfelelően adott esetben nem abból indulok ki, hogy hülyeséget kérdez, vagy nem ért, hanem hogy esetleg van a kérdése, mondata mögött valami, amit én nem veszek figyelembe.
Jelen esetben is Te ismétlődő kérdésnek vetted a kérdésem, de érdemben nem válaszoltál rá, mert nem a problémád írtad le, hanem egy konkrét technikai kivitelezést kerestél, de könnyen lehet, hogy a problémád megoldására nem ez a helyes struktúra.
De ezt már neked kell eldönteni.


Felhő
26

Izé mizere

Anonymous · 2006. Ápr. 4. (K), 16.47
Lehet, hogy lejebb már írtak választ, de már muszáj volt itt hozzászólnom, hogy "tapasztalatommal" segítsem a fiatalságot :)

Izé...
PHP4-ben a konstruktor neve megegyezik az osztály nevével és ha van ilyen "osztálynév" nevű metódusod, akkor automatikusan meghívódik

<?php
$b = new b;  // <-- példányosítod és hopp! meghívódik a function b() is automatikusan
echo $b -> b();  // <-- megint meghívtad a konstruktort
?>
Mizere...
PHP5-ben a "function b(){...}" csak egy szimpla metódus és nem konstruktor.
27

kompatibilitas

Hodicska Gergely · 2006. Ápr. 4. (K), 17.50
PHP5-ben a "function b(){...}" csak egy szimpla metódus és nem konstruktor.

Azert erre csak olcsobb italokban fogadj. ;)
Kompatibilitasi okokbol ugyanugy hasznalhato az osztaly nevevel megegyezo nevu fuggveny konstruktorkent is.


Felho
7

Megvan

Anonymous · 2006. Már. 30. (Cs), 17.50
Azt hiszem, rájöttem a megoldásra.

<?php

class a {

	function a () {

		$this -> ipcim = $this -> ip();
		echo "Lefutott az 'a' konstruktora<br />\n";

	}

	function ip () {

		return $_SERVER["REMOTE_ADDR"];

	}

}

class b extends a {

	function b ($object) {

		return $this -> ipcim = $object -> ipcim;

	}

	function c () {

		return $this -> ipcim;

	}

}

$a = new a;
$b = new b($a);
echo $b -> c();

?>
Kimenet:
Lefutott az 'a' konstruktora
xXx.xXx.xXx.xXx

Valami ilyesmit szerettem volna elérni. Ez így használható, igaz? Vélemények?
8

PHP4 & PHP5

Anonymous · 2006. Már. 30. (Cs), 17.59
(Localon PHP5 van, de csekkoltam PHP4 alatt is, és jó azon is)
18

Re: 17

Anonymous · 2006. Már. 31. (P), 12.58
Nos rendben, akkor itt a programom felépítése, nagy vonalakban:

<?php

include "db.class.php" // Adatbáziskezelő függvények
class általános extends db {

    function általános () {

        /* Van az "általános" objektumban egy sor függvény, amik
           ilyen-olyan dolgokat művelnek.
           Például beállítja a sessiont, sessionben eltárol ezt-azt */

    }

    function config () {

        /* Vagy lekérdezi és beállítja az oldalra vonatkozó és 
           személyes beállításokat, ésatöbbi... */

    }

}

class html extends általános {

    function html () {

        /* Ez meg itt legenerálja a HTML kimenetet, és elvégez
           még néhány apróságot... */

    }

    function külső_fileok () {

        /* ... mint például megnézi van-e *.php kiterjesztésű file
           egy megadott könyvtáron belül, és ha talál, azt még
           behívja a programba, mielőtt kimenetet adna a böngészőnek.
           Ez lehet a példa kedvéért mondjuk egy statisztika modul 
           funkcióit tartalmazó objektum, amiben el kell érnem az
           "általános", vagy a "db", vagy más objektumokban már
           beállított változókat. */

    }

    function modulok () {

        /* Moduláris felépítésű programról van szó. Ez a függvény
           ellenőrzi, hogy a felhasználónak van-e jogosultsága az
           adott modulhoz, és az eredménytől függően fut tovább a
           program. Beincludeolja a modul filejait, ami szintén
           egy új objektum, amiben ugyancsak el kell érjem a már
           beállított változókat. */

    }

}

$html = new html;
echo $html -> html();
?>
Ez volna tehát az én kis programocskám, amin dolgozgatok. Mint minden valamire való programozó, én is próbálom optimálisan megírni a programot. Ezért fordult meg a fejemben az, hogy valami átjárást kellene biztosítani az egyes programrészletek között, hogy ne kelljen többször lefuttatnom ugyan azokat a függvényeket, ha már előtte be van állítva a használni kívánt változó értéke. Annó ezt ugye megoldottuk globális változókkal, de annak a világnak lassan vége. Ha azt feltételezzük, hogy csak egy külső file van, plusz az aktuális modul, akkor a parent::általános(); parancsot mindkét esetben ki kellene adnom, ezáltal legalább kétszer futna le az általános konstruktora, és ez még csak a leg optimálisabb eset.
Kedves Gergő, ha van ötleted egy szerencsésebb struktra kialakítására, szívesen fogadom a javaslatokat.
19

észrevételek

Hodicska Gergely · 2006. Ápr. 1. (Szo), 00.07
Szia!


include "db.class.php" // Adatbáziskezelő függvények

Én személy szerint az adatbázis kezelésére ezt a megoldást ajánlom. A cikkben minden le van írva, ezért itt most nem mennék bele az előnyeibe.

class általános extends db {

Na ez szerintem tipikusan nem jó használata az öröklődésnek. Ha belegondolsz, akkor az általános osztály nem egyfajta db osztály, hanem szüksége van rá a működéséhez, használja azt. Jelen esetben az objektum kompozícióval jobban jársz.

A következő öröklődésnél is érdemes lehet elgondolkodni, hogy szükséges-e. Igazából itt sem specializálod a szülő osztályt (konkrét kód nélkül ez az érzésem), hanem a korábbi funkcionalitásától eltérő tulajdonságokkal ruházod fel, itt is szerencsésebb lenne egy objektum helyett több kisebb, kevesebb felelőséggel bíró objektum használata.

Szintén érdemes lehet megismerkedned az MVC modellel, ötletet adhat arra, hogy egy kérés kiszolgálását milyen szempontok szerint lehet részekre bontani, és ezekre a részfeladatokra létrehozni különböző objektumokat.


Felhő
20

Re: 19

Anonymous · 2006. Ápr. 1. (Szo), 12.20
Én személy szerint az adatbázis kezelésére ezt a megoldást ajánlom.


Bevallom, a db osztályomat nem nagam írtam meg, neten találtam rá egy kész megoldást. Itt-ott testreszabva azóta ezzel dolgozok. Használatba vétel előtt átnéztem, és szerintem egész jól megírt program, de azért kíváncsi lennék a véleményedre ezzel kapcsolatban is.

Na ez szerintem tipikusan nem jó használata az öröklődésnek. Ha belegondolsz, akkor az általános osztály nem egyfajta db osztály, hanem szüksége van rá a működéséhez, használja azt. Jelen esetben az objektum kompozícióval jobban jársz.


Az adatbázis osztály szerintem tipikusan egy olyan része a programnak, amit gyakorlatilag mindenhol használni kell, ill. valószínűleg szükség lehet a használatára. Amit mondtál, azt mind aláírom, de ha van olyan, hogy "a kivétel erősíti a szabályt" (nincs ilyen, mert mint tudjuk, csak egy félrefordítás eredménye ez a mondás), akkor ez pont a DB osztályra igaz. Persze meglehet, hogy tévedek, és/vagy csak nem látom még át teljesen ezt az egészet.
És bár a belinkelt cikket korábban nem olvastam, a 7. postban láthatod, hogy jómagam is hasonló eredményre jutottam, tehát a fenti néhány sor nem kötekedés, vagy egyet nem értés. Azt kizárólag a DB osztályra értettem.

Szintén érdemes lehet megismerkedned az MVC modellel, ötletet adhat arra, hogy egy kérés kiszolgálását milyen szempontok szerint lehet részekre bontani, és ezekre a részfeladatokra létrehozni különböző objektumokat.


Ezt a cikket szintén nem olvastam, de a programom felépítésének vázlatából azért szerintem nagyjából kivehető, hogy hasonló szempontok alapján hoztam létre az osztályaimat. Talán annyi különbséggel, hogy én a modelt és a controllert valamilyen szinten összekapcsoltam, egynek vettem ("model, controller" => "általános osztály", "view" => "html osztály").
21

rere

Hodicska Gergely · 2006. Ápr. 2. (V), 22.56
Bevallom, a db osztályomat nem nagam írtam meg, neten találtam rá egy kész megoldást. Itt-ott testreszabva azóta ezzel dolgozok. Használatba vétel előtt átnéztem, és szerintem egész jól megírt program, de azért kíváncsi lennék a véleményedre ezzel kapcsolatban is.

Ha elolvasod a cikket akkor látni fogod, hogy az ott kialakított DB használati mód, az nem feltétlenül kötődik egy adott adatbázis kezelő osztályhoz. Amúgy ajánlanán neked, hogy egy általánosabban elterjedt DB layert használj. Belenéztem egy kicsit a kódjába, hát messze nem az igazi. Pl. ezzel nem tudnál ténylegesen két kapcsolatot létrehozni egyazon DB felé. A hibakezelése az igazából eleve kizárja, hogy egy komolyabb rendszer része legyen. Az escepe függvényben lévő rekúrzió, meg még egy két megoldás benne is hát elég érdekes. Ráadásul rengeteg olyan funkció van benne, ami nem egy alap DB osztály része. Kár ezeket egy osztályba belezsúfolni.

Az adatbázis osztály szerintem tipikusan egy olyan része a programnak, amit gyakorlatilag mindenhol használni kell, ill. valószínűleg szükség lehet a használatára.

Ettől függetlenül egyrészt nem az a megoldás, hogy a DB osztályból származtatod az oldaladat előállító osztályodat, hanem hogy az használja azt (kompozició), másrészt meg akkor is érdemes úgy kialakítani a programod, hogy csak akkor jöjjön létre adatbázis kapcsolat, ha ténylegesen szükség van rá.

hogy én a modelt és a controllert valamilyen szinten összekapcsoltam, egynek vettem

Igazából én nem is elsősorban ennek helyességére utaltam volna, hanem hogy az biztosan nem egy jó/igazi megoldás, hogy ezek az osztályok egymásból származnak, hisz ahogy te is írod, teljesen eltérő funkciókat valósítanak meg. Tehát legyenek a különböző célokra megfelelő objektumaid, és ezek kombinálásval alakítsd ki a programod, ne egy monumentális osztályod legyen.


Felhő
22

DB osztály

Anonymous · 2006. Ápr. 3. (H), 13.24
Az egyik topicban mintha olyasmit írtál volna, hogy készül, vagy tervezed a fentebb linkelt adatbáziskezelésről szóló cikked modernebb változatát megírni. Ez a cikk nagyjából mikorra várható?
És hogy közben haladni is tudjak, esetleg felrakhatnád valahová azt a DB osztályt, amit mostanság legszívesebben használsz. Vagy ha ajánlani tudnál egyet, azt is megköszönném. Ha valaki olyan szinten van, hogy megírjon magának egy ilyen osztály, az nyílván meg is teszi. Ha viszont ilyen-olyan okból nem tudja saját maga megírni, kénytelen keresni kész megoldást, ezesetben viszont egyáltalán nem biztos, hogy a megfelelőt választja - lásd az én példámat.
23

AdoDB

Hodicska Gergely · 2006. Ápr. 3. (H), 21.53
Szia!


Az egyik topicban mintha olyasmit írtál volna, hogy készül, vagy tervezed a fentebb linkelt adatbáziskezelésről szóló cikked modernebb változatát megírni. Ez a cikk nagyjából mikorra várható?

Hát az az igazság, hogy a DAO-s rész igazából csak egy kicsit változott, abból egy ciket nem igazán lehetne kihozni, ami szép lassan formálódik bennem, az egy lehetséges program szervezési mintának a leírása, aminek ez is része lenne. A cikkhez képest annyit változtattam rajta, hogy amikor elkérek egy DAO-t, akkor a Factory figyelembe veszi, hogy az általa használt DB kapcsolat az milyen RDBMS is, és az ennek megfelelő típusú DAO-t fogja példányosítani. Kis példa:
<?php
    // Régi módszer: a UserDao osztály egy példányát adja vissza.
    $userDao =& DaoFactory::singleton('User');
    // Új módszer: a UserDaoMysqlt osztály egy példányát adja vissza.
    $userDao =& Factory::singleton('dao', 'User', 'User');
?>
Az új módszer esetén használt 3. paraméter az megadható volt a régi módszer esetén is 2. paraméterként is, és az azt határozza meg, hogy melyik logikai DB kapcsolatot szeretnénk használni (ha nem adjuk meg, akkor az alapértelmezett lesz használva). Érdemes ilyeneket definiálni (mondjuk modulonként), és akkor bármikor változtatható konfigból (alap esetben ugyanazok a beállítsáok tartoznak mindegyik ilyen logikai DB kapcsolathoz, de ha pl. szükséges, hogy a user modult egy másik DB szolgálja ki, akkor elegendő a User logikai kapcsolathoz tartozó paramétereket megváltoztatni, az alkalmazáshoz nem is kell hozzányúlni). És amennyiben van az adott DB-hez típusához tartozó DAO, akkor automatikusan az kerül példányosításra.

És hogy közben haladni is tudjak, esetleg felrakhatnád valahová azt a DB osztályt, amit mostanság legszívesebben használsz.

Egy biztosan jó választás lehet az AdoDB. Nekem ez kicsit jobban tetszett, mint a PEAR::DB, de ez lehet csak megszokás kérdése. Ezenkívül PHP 5.1-től kezdve (5-től is van kiegészítésként) ki lehet próbálni a PDO-t is, de annyira nem vagyok oda tőle, de nagyjából korrekt és egységes felületet ad a különböző adatbázis kezelőkhöz.

Ezenkívül még vannak ORM cuccok, ezek valamilyen formában azt támogatják, hogy a DB séma alapján automatikusan legenerálják a DB-t kezelő objektumokat. Ezekből a legleterjedtebbek a Propel és a EzPDO, de akad még más versenyző is (MetaStorge, PEAR::DB_DataObject), vagy pl. a nemrég emlegetett Qcodo is tartalmaz ilyen cuccot. De ezeket még nem ismerem igazán részletesen, így nem igazán tudnám bármelyiket is kiemelni. Valamiért a Propelhez az egyik legszimpatikusabb, de úgy tűnik, hogy az EzPDO-nál is mindent megtesznek, hogy tudják mindazt, amit a Propel, elég aktívan fejlesztik, ezért az is egy jó választás lehet.


Felhő
24

Ez nekem sok

Anonymous · 2006. Ápr. 4. (K), 00.42
Megmondom őszintén, én félek egy kicsit ettől az AdoDB-től. Még így is, hogy olyas valaki ajánlja, aki ért hozzá. Nem szívesen használok olyan kódot, amit nem ismerek, nem látom át, nem értek. Itt durván másfél megányi kódról van szó. Ahhoz, hogy nyugodt szívvel felhasználjam, töviről hegyire át kellene néznem, áttanulmányozom és megpróbálni megérteni a működését, ami a méretéből következtetve sok időt venne igénybe. Háromszor akkora csak az adatbázis kezelő osztály, mint maga az egész motor, amit működtetnie kellene... Trabantba Ferrari motort, vagy az ágyúval verébre tipikus esete. Érted...

Nekem bőven megtenné egy olyan szimpla kis osztály, mint amilyet linkeltem. Alapvető funkciókat ellátja (connect, select_db, query, fetch_row, fetch_array, stb., és az escape), átlátható és könnyen használható. Ha esetleg egy ilyet tudnál ajánlani...
25

Nincs szükséged az egészre

Hodicska Gergely · 2006. Ápr. 4. (K), 01.03
Neked ebből az egészből igazából erre a fájlra lesz szükséged:
o adodb.inc.php
o drivers/adodb-mysql(t).inc.php

Amúgy pl. a mysql driver az biztosan annyira sok ember által használt, hogy nem igazán lehet benne hiba. Lényegesen jobban tesztelt, mint egy eldugott kis DB osztályocska.

Mindenféleképpen ajánlom a doksijának az átnézését. Plusz tuti elég sok tutoriált lehet találni hozzá a neten. Aztán ha megtetszik, akkor lehet nézegetni a többi részét is, plusz ha egy másik DB-t szeretnél használni, akkor nem kell egy tök másik API-t megtanulnod, használhatod a megszokott funkciókat.

A függvények többsége abszolút nem felesleges: GetOne, GetRow, tranzakció kezelés, prepared statement stb..

Létezik belőle amúgy egy AdoDB Light verzió is, amiben a fontos funkciók ugyanúgy léteznek, de a körítés nincs.


Felhő