Autor | Zpráva | ||
---|---|---|---|
Shadowek Profil |
#1 · Zasláno: 13. 10. 2010, 22:01:37
Dobrý den, potřeboval bych z instance objektu pracovat s nadřazeným objektem, ale nenapadá mě jak na to ..
class objekt1{ //...metody, proměnné __construct(){ $this->promenna = new objekt2(); } class objekt2{ //...dalsi metody, dalsi promenne public function udelej_neco(){ //A tady bych potreboval pracovat s metodami nadřazeného objektu (objekt1) } } } Snad jste můj příklad pochopili a máte nějaké řešení jak na to ... |
||
Majkl578 Profil |
#2 · Zasláno: 13. 10. 2010, 22:07:36 · Upravil/a: Majkl578
A co ti brání použít
$this (za předpokladu, že to bude opravdu rodič, což teď není — chybí extends )?
Jinak doporučení: kód se snaž lépe formátovat a uvádět funkční celky, v tomhle se nedá vyznat. |
||
__construct Profil |
#3 · Zasláno: 14. 10. 2010, 07:51:27 · Upravil/a: __construct
Shadowek:
Keď chceš pracovať v triede objekt2 s triedou objekt1 musíš si vytvoriť jej inštanciu v objekt2 , priradiť ju nejakej premennej a potom k nej cez ňu pristupovať:
class objekt1{ //…metody, proměnné public function verejnaMetoda(){ echo "Ahoj"; } } class objekt2{ private $promenna; public function __construct(){ // inštancia triedy objekt1 $this->promenna = new objekt1(); } //…dalsi metody, dalsi promenne public function udelej_neco(){ //A tady bych potreboval pracovat s metodami nadřazeného objektu (objekt1) $this->promenna->verejnaMetoda(); } } |
||
Shadowek Profil |
#4 · Zasláno: 14. 10. 2010, 16:06:02
Ano to chápu, ovšem já bych to potřeboval naopak ...
class objekt1{ //…metody, proměnné public function verejnaMetoda(){ //tady potřebuju pracovat s metodami objektu objekt2 } } class objekt2{ private $promenna; public function __construct(){ // inštancia triedy objekt1 $this->promenna = new objekt1(); } //…dalsi metody, dalsi promenne public function udelej_neco(){ //A tady bych potreboval pracovat s metodami nadřazeného objektu (objekt1) $this->promenna->verejnaMetoda(); } } |
||
tiso Profil |
#5 · Zasláno: 14. 10. 2010, 16:12:20
Shadowek: popíš presnejšie čo chceš dosiahnuť.
|
||
Shadowek Profil |
#6 · Zasláno: 16. 10. 2010, 11:00:40
No já bych potřeboval, aby třída která je přístupná přes proměnnou v jiné třídě mohla volat funkce té třídy, ze které byla volaná. Snad ten popis pochopíte. Zkusím napsat trefnější ukázku.
class mysql{ protected $user; protected $pass; protected $host; protected $db; public $conn = false; public $generator; public function __construct($host = NULL, $user = NULL, $pass = NULL, $db = NULL $connect = false){ $this->user = $user; $this->pass = $pass; $this->host = $host; $this->db = $db; if($connect === true){ $this->connect(); } $this->generator = new gen(); } public function protect($string){ return mysql_real_escape_string($string); } //Několik nezajímavých metod... } class gen{ public function insert($table, $vals){ //Tady potřebuji proměnnou $table cenzurovat metodou protect() ze třídy mysql $sql = "INSERT INTO `".$table."`"; $f = ""; $s = ""; foreach($vals as $key => $item){ if($f != ""){ $f .= ", "; } if($s != ""){ $s .= ", "; } //Tady potřebuji proměnnou $key cenzurovat metodou protect() ze třídy mysql $f .= "`".$key."`"; if($item === "NULL" || $item === NULL || strlen($item) < 1){ $s .= "NULL"; } else{ //Tady potřebuji proměnnou item cenzurovat metodou protect() ze třídy mysql $s .= "'".$item."'"; } } $sql = $sql."(".$f.") VALUES (".$s.")"; return $sql; } } |
||
Nox Profil |
#7 · Zasláno: 16. 10. 2010, 11:10:39 · Upravil/a: Nox
Shadowek:
toto se obvykle provádí tak, že to co chceš ošetřit (proměnné) nepíšeš přímo do řetězce, ale předáš to jako argument db funkci a ta si to pak zpracuje sama příklad z doctrine2 DBAL $count = $conn->executeUpdate('UPDATE user SET username = ? WHERE id = ?', array('jwage', 1)); |
||
Shadowek Profil |
#8 · Zasláno: 16. 10. 2010, 12:24:32
No ano, ale o to mi tady nejde, to byl jen příklad. Mě jde spíše o to abych mohl využít ty funkce ze třídy mysql
|
||
AM_ Profil |
#9 · Zasláno: 16. 10. 2010, 12:44:26
Nic proti, ale tohle je typický příklad toho, jak objektové programování nevypadá. Teoreticky toho lze docílit tak, že instanci toho "nadřazeného" objektu předáš konstruktoru toho "podřazeného" objektu, třeba takto:
class Foo { protected $bar; public function __construct() { $bar = new Bar($this); } public function baz() { echo 'foo bar baz'; } } class Bar { protected $ownerFoo; public function __construct($ownerFoo) { $this->ownerFoo = $ownerFoo; $this->ownerFoo->baz(); //zde volame baz() na "nadrazenem" objektu } } ovšem v 95% případů začátečníků, kdy dojdou do situace, že potřebují takto volat něco z "vlastníka", je to příznak špatně navrženého schématu objektů, a ty bohužel nejsi mezi šťastnými 5%. 1) potřebuješ si psát vlastní třídu pro připojení k mysql? pro základní funkce použij vestavěnou třídu mysqli, pokud chceš nějaký "pěkný" přístup, je zde spousta free záležitostí (od jednoduché dibi po propracovanou doctrine). Autory všech těchto věcí jsou mnohem zkušenější programátoři, a pokud chceš napsat vlastní, spíš se k tomu vrať za pár let, až budeš ostřílený programátor a bude pravděpodobné, že tvůj DB engine bude srovnatelný s jejich. 2) pokud má gen být třída pro generování dotazů (zajímavé, já bych jménem gen nazval spíš třídu reprezentující údaj lidské genetické informace, DBQueryGenerator nebo tak něco by bylo lepší) a třída mysql sloužit pro obhospodařování spojení, tak by zřejmě metoda protect měla být členem třídy Gen. |
||
Shadowek Profil |
#10 · Zasláno: 16. 10. 2010, 13:34:31
Hmm, díky no. Tak nechtěl bys mi napsat jak to má vypadat správně navržené? A já mám v normálním kódu generator, jen tu jsem omylem použil gen.
|
||
joe Profil |
#11 · Zasláno: 16. 10. 2010, 14:06:49
A proč nenapíšeš tu metodu protect jako statickou?
public static function protect($string){ A v dalším kódu pak $sql = "INSERT INTO `". mysql::protect($table) . "`"; Nox: „toto se obvykle provádí tak...“ Kdybych to psal já, odpověděl bych ti na to - a co je mi do toho, jak to dělají jinde. On v tom svém kódu místo ručně psaného dotazu má název metody (insert), kam jen předá parametry. Takže nemusí celý dotaz psát ručně. A někomu to tak vyhovuje. |
||
AM_ Profil |
#12 · Zasláno: 16. 10. 2010, 15:20:11
Shadowek:
„Tak nechtěl bys mi napsat jak to má vypadat správně navržené?“ AM: „tak by zřejmě metoda protect měla být členem třídy Gen.“ ostatně já bych takovou třídu ani nenavrhoval, třída mysql ve tvém podání mi přijde jako definice zbytečnosti sama, nevidím, že by oproti vestavěné třídě mysqli přinášela něco nového (snad jen nahrazení zdlouhavého "real_esacpe_string" - což je název jednoznačně říkající, že ta funkce escapuje řetězec - za méně výstižnější "protect" - což může klidně znamenat, že ten řetězec šifruje, umisťuje do chráněné paměti nebo nevím co ještě). Třída generator (stále mi ten název nepřijde dost výstižný) by mohla existovat sama o sobě, mohlo by se to používat nějak takto: $db->query(MyQueryGen::insert('tabulka', $data)); |
||
Shadowek Profil |
#13 · Zasláno: 16. 10. 2010, 15:22:33
joe:
No řešit to statickou metodou mě napadlo, ale nevěděl jsem co to slůvko "static" přesně dělá, chtěl jsem si to večer prostudovat, protože v tuto chvíli nemám přístup k mému kódu. A chtěl jsem se zeptat, protože s OOP v PHP začínám, jak bych to měl udělat tedy správně? |
||
AM_ Profil |
#14 · Zasláno: 16. 10. 2010, 15:24:30 · Upravil/a: AM_
Shadowek:
„A chtěl jsem se zeptat, protože s OOP v PHP začínám, jak bych to měl udělat tedy správně?“ už jsem ti to napsal dvakrát, zkus upřesnit, co ti není jasné. |
||
Shadowek Profil |
#15 · Zasláno: 16. 10. 2010, 16:12:03
AM:
No jako jak by ta třída vypadala nějak správně navržená, to by jako všechny metody byly uvnitř toho hlavního objektu? Tvou předchozí odpověď jsem neviděl, protože jsem začal psát odpověď pro joeho když jsi to odeslal a pak sem si ji nevšiml. A o existenci něčeho jako je mysqli jsem ještě nezaregistroval ... Nevím jak se to mohlo stát :) |
||
AM_ Profil |
#16 · Zasláno: 16. 10. 2010, 16:16:57
Shadowek:
„to by jako všechny metody byly uvnitř toho hlavního objektu?“ já nevím jaké všechny metody tam máš, jen říkám, že zde bych escape prováděl ve třídě toho generátoru a na třídu mysql bych se vykašlal. Jak obecně dělat objektové návrhy o tom se dá napsat celá knížka (můžeš si nějakou koupit), to se určitě nedá vysvětlit na dva řádky v diskusi... |
||
Shadowek Profil |
#17 · Zasláno: 16. 10. 2010, 16:28:15
A nechceš sem nějakou takovou napsat? :D No tak díky, pročtu si něco kdyžtak o té mysqli. Děkuji :)
|
||
Časová prodleva: 12 dní
|
|||
joe Profil |
#18 · Zasláno: 28. 10. 2010, 17:23:41
Asi to už je vyřešené, ale přece...
AM: „...že zde bych escape prováděl ve třídě toho generátoru a na třídu mysql bych se vykašlal“ To se mi nějak nezdá. Proč by metoda "protect" nebo nazvaná lépe měla být ve třídě generátoru? Vždyť už samotné slovíčko "mysql" v názvu oné funkce jasně říká, že to patří k mysql... Pak by to totiž mohlo fungovat tak, že třída generátoru by byla nezávislá na typu databázi, což by s tím tvým návrhem nešlo... Nebo se pletu? |
||
Časová prodleva: 13 let
|
0