Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]skrypt w OOP
Forum PHP.pl > Forum > PHP
Stron: 1, 2
marcio
Witam tak jak kiedys napisalem chce sie nauczyc OOP i robie sa prosta ksiege

OTO KOD:
  1. <?php
  2.  
  3. include('config.php');
  4.  
  5. class Ksiega {
  6.  
  7. public $data, $ip, $host, $nick, $message;
  8. private $pasy, $action, $method, $db;
  9.  
  10. public function __construct($nick, $message, $action, $method) {
  11.  
  12. global $pasy;
  13.  
  14. $this -> action = $action;
  15. $this -> method = $method;
  16. $this -> data = date('j/n/Y H:i:s');
  17. $this -> nick = htmlspecialchars(addslashes($nick));
  18. $this -> message = htmlspecialchars(addslashes($message));
  19. $this -> ip = $_SERVER['REMOTE_ADDR'];
  20. $this -> host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  21. $this -> pasy = $pasy;
  22. }
  23.  
  24.  
  25. public function db_connect() {
  26.  
  27. if($this -> db = mysql_connect($this->pasy['host'], $this->pasy['login'], $this->pasy['haslo'])) {
  28. mysql_select_db($this->pasy['baza']);
  29. return true;
  30. }
  31.  
  32. else return false;
  33.  
  34. }
  35.  
  36.  
  37. public function db_close() {
  38.  
  39. mysql_close($this -> db);
  40.  
  41. }
  42.  
  43.  
  44. public function new_query($query) {
  45.  
  46. $this -> db_connect();
  47. if($result = mysql_query($query))
  48. return $result;
  49.  
  50. else return die(mysql_error());
  51. $this -> db_close();
  52.  
  53. }
  54.  
  55.  
  56. public function show_form() {
  57.  
  58. echo('<html>
  59. <head><meta http-equiv="content-type" charset="utf-8" /><title>GuEsT bY MARCIO</title>
  60. <style type="text/css">
  61. a {color:#FDEDF2}
  62. body {color:#FDEDF2}
  63. </style>
  64. </head>
  65. <body bgcolor="#000000">
  66. <center><img src="gora.jpg" width="1240" height="100" alt="obrazek"/></center>
  67. <table align="center" width="75%">
  68. <form action="'.$this -> action.'" method="'.$this -> method.'">
  69. <tr><td align="center"><input type="text" name="nick" size="71" value="Nick" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;"/></td></tr>
  70. <tr><td align="center"><textarea name="message" rows="3" cols="70" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;">Tutaj wpisz wiadomosc</textarea></td></tr>
  71. <tr><td align="center"><input type="submit" name="dodaj" value="Dodaj wpis" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;" /></td></tr>
  72. </form></table>
  73. </body><html>'); 
  74. }
  75.  
  76.  
  77. public function add_reply() {
  78.  
  79.  $this -> show_form();
  80.  
  81.  if(!empty($_POST['nick']) && !empty($_POST['message']) && isset($_POST['dodaj'])) {
  82.  
  83.  setcookie("Spamer", "Spam", time() + 300);
  84.  $zapytanie = ("insert into ksiega_gosci(nick,message,data,ip,kod) values('$this->nick', '$this->message', '$this->data', '$this->ip', '')");
  85.  
  86. if($_COOKIE['Spamer'] != "Spam") {
  87.  
  88. $this -> new_query($zapytanie);
  89. $host = $_SERVER['HTTP_HOST'];
  90. $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/');
  91.  
  92. }
  93.  
  94. else {
  95.  
  96. echo('<script>alert("Spadaj spamerze musisz odczekac 5min :)");</script>');
  97.  
  98. }
  99. }
  100.  
  101.  else echo('<script>alert("Prosze wypelnic formularz");</script>'); 
  102.  
  103.  }
  104.  
  105.  
  106. public function show_reply($liczba = 30) {
  107.  
  108. $query = ("select * from ksiega_gosci");
  109. $wynik = $this->new_query($query);
  110. $num = mysql_num_rows($wynik);
  111. $ile = ceil($num/30);
  112.  
  113. if(!isset($_GET['strona'])) $_GET['strona'] = 0;
  114.  
  115. $strona = (int)$_GET['strona'];
  116. $id = (int)$_GET['id'];
  117. $query1 = ("select * from ksiega_gosci order by id desc limit ".$strona*$liczba.",".$liczba);
  118. $wynik1 = $this->new_query($query1);
  119. while($tab = mysql_fetch_assoc($wynik1)) {
  120.  
  121. echo('<table border="1" width="75%" align="center" style="border: 1px dotted red;"><tr><td width="40%">Dodal: '.stripslashes($tab['nick']).'</td><td width="26%">Dnia:'.$tab['data'].'</td></tr>
  122. <tr><td><b>'.stripslashes($tab['message']).'</b></td></tr></table></form>');
  123.  
  124. }
  125.  
  126. if(mysql_num_rows($wynik) == 0) {
  127.  
  128. echo('<script>alert("Nie ma wpisow");</script>');
  129. }
  130.  
  131. echo('<Br><center><b>Strona: '.($strona).' z '.($ile).'</b></center>');
  132.  
  133. if(is_numeric($strona) && !empty($strona) && $strona > 0) {
  134.  
  135. echo('<center><a href="?strona='.($strona-1).'"><img src=\'rev.gif' /></a> ');
  136.  
  137. }
  138.  
  139.  
  140. if(is_numeric($strona) && !empty($strona) && $strona < $ile) {
  141.  
  142. echo('<a href="?strona='.($strona+1).'"><img src='next.gif' /></a></center>');
  143.  
  144. }
  145.  
  146. else {
  147.  
  148. echo('<center><a href="?strona='.($strona+1).'"><img src='next.gif' /></a></center>');
  149.  
  150. }
  151.  
  152. echo('<table align="center" style="border: 1px dotted red;"><tr><td align="center">');
  153.  
  154. for($i = 0; $i < $ile; $i++) 
  155. echo('<a href="?strona='.$i.'">['.$i.']</a> ');
  156. echo('</td></tr></table>');
  157.  
  158. }
  159. };
  160.  
  161. $ksiega = new Ksiega($_POST['nick'], $_POST['message'], 'new_klasa.php', 'post');
  162. $ksiega -> add_reply();
  163. $ksiega -> show_reply();
  164.  
  165. echo('<Br><div style="background:#FFFFFF;color:#000000;text-align:center;border:2px solid:white;"><code><b>Powered by Marcio. GG(4854727)</b><img src="http://www.gadu-gadu.pl/users/status.asp?id=4854727&styl=1"/><Br><a style="color:#000000" href="http://ekmll.com" TARGET="_blank">My site</a></code></div>');
  166. ?>

NIe chce zebys ktos z was analizowal kod linijka po linicje po kod dziala lecz tak patrzac na oko czy kod jest zgdony z OOP czyli czy nie jest to tak jak wy to nazywacie pseudo OOP jesli tak to bylbym wdzeczny jak ktos by pokazal jak by to mialo wygladac w czystym OOP nie zeby mi pisal na nowo kod ale zeby pokazal np jak powinna wygldac funkcja add_reply() albo ktora z nich

Oprocz tego mam jeszcze kilka pytan bylbym wdzieczny jak by ktos na nie odpowiedzial nie musi odpowiadac na wszystkie

1.DO czego sluzy klasa interface??BO nie zrozumialem
2.Do czego sluzy abstract??
3.Do czego sluzy static??

I potem mam jeszcze jedno pytanie czytalem kurs na temat OOP
Czyli w OOP do obiektow mozna sie odwolywac za pomoca pol i metod jednak gdy zmienne klasowe sa publiczne gdy sa typu private albo protected to tylko za pomoca metod dobrze mowie??
Jednak chcialbym sie zapytac czy ktos z was bedzie tak mily i by mi pokazal roznice pomiedzy odwolywaniem sie do obiektow za pomoca pol i metod smile.gif bo pomieszalo mi sie teraz wszystko i juz nie wiem co jest czym...
Piniek
po pierwsze nie umieszczaj kodu html w klasie i wedlug mnie jest to kod strukturalny zamkniety w klasy
marcio
P.S co sie stalo z bbcode'em pierwszy raz mi sie tak dzieje??
Jarod
Ehh... global..
marcio
To moze ktos pokarze dlaczeg jest to tylko skladnia OOP a pisze strukturalnie bo sam nie wiem tez chce sie nauczyc ze nie rozumiem jeszcze jak pisac w OOP w 100%
Cysiaczek
Obejrzyj kod jakiegoś frameworka, albo zobacz, jak wyglądają klasy wygenerowane przez Propel. Obecnie mogę jedeynie powiedzieć, że jeśli ten kod działa poprawnie, to ok, ale z oop nic, ale to zupełnie nic nie ma wspólnego. Proponuję dobrą książkę na początek, bo bez tego ani rusz. Opis tej klasy:

Klasa sprawdza, czy dane są poprawne i usuwa z nich potencjalnie niebezpieczny kod. Łączy się z bazą danych. Może wyświetlić formularz, albo dodać wpis do bazy danych, albo pokazać dodany wpis. Wysyła też cookie, jak już wpis został dokonany.

Twoja klasa robi zatem tyle, ile przeciętny framework. Masę zbędnych rzeczy, które nijak nie są związane z meritum sprawy, czyli wpisem do księgi

Poniżej klasa księgi gości wg. Propel (3 minuty pracy)
http://rafb.net/p/6itcTx76.html
  1. <?php
  2. $entry=new GuestBook();
  3. $entry->setNick('nick');
  4. $entry->setContent('message');
  5. $entry->setIp('IP');
  6. $entry->setCreationDate(time());
  7. $entry->save();
  8. ?>


To wszystko.

Pozdrawiam.
marcio
o0..trudne to jest wiesz mysle ze odrazu nie napisze skryptu w OOP ale bylbym wdzieczny jakbys ty lub ktos inny mogl pokazac tak na szybko chodzi mi o szkic jak powinna wygladac moja klasa lub dana funckja nie mowimy o 100% OOP ale zeby przynajmniej zblizyc sie do jego idee bo ja jak narazie mam tam tylko skladnie OOP
Cysiaczek
Tylko, że tego się nie pisze, tylko generuje. Samo się generuje - z czegoś takiego

Kod
  guest_book
    _attributes:  { phpName: GuestBook }
    id:
    nick:
      type: VARCHAR
      size: 32
    content:
      type: LONGVARCHAR
    email:
      type: VARCHAR
      size: 32
    creation_date:
      type: TIMESTAMP
    ip:
      type: VARCHAR
      size: 16


Ideą jest natomiast ten fragment kodu, który Ci pokazałem, a który używa tej klasy.

Pozdrawiam.
marcio
No ok dzieki ale to mi w niczym nie pomaga bo klasa jest skomplikowana a sam wygenerowany kod tez mi w niczym nie pomoga przynajmniej ja nie widze jak moglby mi pomoc...

Chodzi mi to czy ktos z was moze powiedziec co musze zmienic i jak zeby ten kod przypominal OOP
Cysiaczek
Nie da się tego kodu zmienić. należy go napisać zupełnie inaczej. Pokazałem Ci tą klasę, abyś zobaczył, że OOP to ładne, spójne interfejsy, a nie kod html w metodach. Pierwsza zasada - obiekt ma robić tylko to, na co wskazuje jego nazwa i krótki opis. Twoja klasa to jak samochod, który ma w standardzie obok kół i silnika, możliwość puszczania latawca i parzenie kawy. Potrzebne to do jeżdżenia?

Pozdrawiam i jeszcze raz polecam książkę. Czasami 50 zł trzeba zainwestować.
marcio
@Cysiaczek na ksiazki sknera nie jestem mam w domu kolo 20 ksiazek na temat programowania i jedna do php "Tworzenie stron www vademceum profesjonalisty php+mysql" a teraz jestem za granica ogolnie teraz przejrze ten link co podales i dam tu to co wykombinuje smile.gif

Wszedzie w klasach widze funckje ktore zwracaja atrubut np pod moja klase takie cos
  1. <?php
  2. public function get_nick() {
  3.  
  4. return $this->nick;
  5. }
  6. ?>

Zastanawiaja mnie natomiast 2 rzeczy do czego sie to przydaje i i czy jest zaleta uzywanie tego??
zlw
Cytat(marcio @ 8.03.2008, 22:27:27 ) *
Wszedzie w klasach widze funckje ktore zwracaja atrubut np pod moja klase takie cos
  1. <?php
  2. public function get_nick() {
  3.  
  4. return $this->nick;
  5. }
  6. ?>

Zastanawiaja mnie natomiast 2 rzeczy do czego sie to przydaje i i czy jest zaleta uzywanie tego??


Chodzi o to, żeby nie tworzyć jednej, wielkiej metody, która robi wszystko, ale kilka mniejszych które (jak w przykładzie) zwracają pewne wartości (lub np. zamieniają BBCode na HTML, usuwają niebezpieczne wyrażenia itp.) oraz taką która coś z tymi zwracanymi wartościami robi (dodaje do bazy, wyświetla itp.)

A co do drugiego pytania - "czy się przydaje?". Oczywiście! Ponieważ gdy w przyszłości wystapi błąd, będziesz chciał zmienić działanie klasy/metody nie musisz grzebać w setkach linii kodu.
marcio
No ok @zlw wiec poczytalem troche kurs'ow i przykladowych kodow na tym forum i zrobilem cos takiego
  1. <?php
  2. public function get($name) {
  3.  
  4. return $this -> name;
  5.  
  6. }
  7.  
  8. public function set($name, $wartosc) {
  9.  
  10. $this ->name = $wartosc;
  11.  
  12. }
  13. ?>

Funckja get do zwracania wartosci set do ustawiana i teraz zapisuje sobie do bazy nowy wpis:
  1. <?php
  2. $zapytanie = ("insert into ksiega_gosci(nick,message,data,ip,kod) values('$this->nick', '$this->message', '$this->data', '$this->ip', '')");
  3. ?>

I teraz probowalem to wywolywac i robie tak
  1. <?php
  2. $zapytanie = ("insert into ksiega_gosci(nick,message,data,ip,kod) values('$this->get($this->nick)', '$this->get($this->message)', '$this->data', '$this->ip', '')");
  3. ?>

I tak patrze a przy wyswieltaniu i zapisywaniu do bazy dodaje () czyli jak wpisze jako nick marcio to sie nie wyswietli marcio a (marcio) dlaczego tak sie dzieje??

Cytat
Chodzi o to, żeby nie tworzyć jednej, wielkiej metody, która robi wszystko, ale kilka mniejszych które (jak w przykładzie) zwracają pewne wartości (lub np. zamieniają BBCode na HTML, usuwają niebezpieczne wyrażenia itp.) oraz taką która coś z tymi zwracanymi wartościami robi (dodaje do bazy, wyświetla itp.)

A co do drugiego pytania - "czy się przydaje?". Oczywiście! Ponieważ gdy w przyszłości wystapi błąd, będziesz chciał zmienić działanie klasy/metody nie musisz grzebać w setkach linii kodu.

Zlw moglbys rozwinac twoja odpiwedz bo nie zabardzo zrozumialem np jaki przyklad albo cos?
Cysiaczek
  1. <?php
  2. public function get($name) {
  3.  
  4. return $this -> name;
  5.  
  6. }
  7. $this->get($this->message)
  8. ?>

questionmark.gif?
  1. <?php
  2. public function get($name) {
  3.  
  4. return $this ->$name;
  5.  
  6. }
  7. $this->get('message')
  8. ?>


Masz duże braki w znajomości API języka. Nie myśl, że się czepiam Ciebie ciągle i coś wypominam bez powodu. Powód mam - nie napiszesz nic obiektowo, jeśli nie będziesz rozumiał tego, co robisz. Teraz na wszelkie tłumaczenie zawiłości oop jest moim zdaniem za wcześnie. Obiektowość jest niezależna od języka. Tak samo się projektuje klasy i obiekty w Javie i Rubym, .NET i C++ itd. To, że masz 20 książek o programowaniu, to niewiele znaczy - Ja mam 5. Nie masz wśród nich książki o programowanie obiektowym.

Tak zupełnie, ale naprawdę zupełnie poważne i życzliwie radzę Ci - teoria to podstawa - opanuj ją.
~zlw powiedział dokładnie to samo, co ja w poprzednich postach - małe klasy o ograniczonej funkcjonalności.

Pozdrawiam.
marcio
Powiem tak ksiazki o OOP nie mam tzn mam ksiazki do C/C++ ale C++ nie znam JAVY czy tam C# tez nie ucze sie C gdzie obiektywnosc jest o wiele trudniejsza i sie jej nie ucze a w php proceduralnie sobie radze i chcialem sie nauczc OOP bo widze ze piszac cms'a mam duzo lini kodu moglbym to napisac na funckjach albi i tak ilosc kodu o duzo sie nie zmniejszy i chce sie nauczyc klas ale kompltnie ich nie rozumie tam jeszcze jej skladnie to troche rozumiem ale nie wiem jak pisac obiektowo dlatego chcialem jakis latwy przyklad etc..
Piniek
dam ci link do artykułu http://kavuka.pl/blog/show/entry_11-Jestes_OOP winksmiley.jpg bardzo ciekawy winksmiley.jpg

mam nadzieje Cysiaczek ze sie nie obrazisz ze to ja dalem tego linka winksmiley.jpg z reszta do twojego blog-a ;P
Cysiaczek
eheheh. To samo próbuję wytłumaczyć tutaj, w temacie. Nie da rady pisać OOP bez teorii i żadne przykłady nie pomogą (zwlaszcza, że dałem już jeden, który jest niemal doskonały).
marcio
Czy jestem chociaz na taki etapie??
Cytat
Uważam (pewnie nie tylko Ja), że istnieje etap pośredni. Jest to programowanie strukturalne ujęte w klasy.

kurde sam juz nie wiem za kazdym razem jak probuje napisac cos lub nauczyc sie czego zwiazanego z OOP to mi nie wychodzi snitch.gif
Cysiaczek
Masz, ale teraz to już naprawdę marsz do książek
Księga gości:

Księga gości ma za zadanie zbierać wpisy od gości odwiedzających naszą stronę. Można je przeglądać i dodawać nowe.

Zaznaczone słowa to kandydaci na obiekty
1. Księga gości (GuestBook - bo zawsze używamy angielskich nazw)
2. Wpis (GuestBookEntry)
3. Gość (użytkownik, którego tu pominiemy) (GusetBookUser)
4. Obiekt kolekcji wpisów (GuestBookEntryStack)
  1. <?php
  2. class GuestBookUser
  3. {
  4.  
  5. }
  6.  
  7. class GuestBook
  8. {
  9. private $collection;
  10.  
  11. public function __construct()
  12. {
  13. $this->collection=new GuestBookEntryStack();
  14. }
  15.  
  16. public function load()
  17. {
  18. $db=DB::getInstance();
  19. $result=$db->query("SELECT * FROM guest_book");
  20. $this->collection->loadFromArray(& $result->fetchAllRows());
  21. }
  22.  
  23. public function addEntry(GuestBookEntry $entry)
  24. {
  25. $entry->create();
  26. $this->collection->add($entry);
  27. }
  28.  
  29. public function getEntries()
  30. {
  31. return $this->collection->getCollection();
  32. }
  33.  
  34. public function getLastFiveEntries()
  35. {
  36. $db=DB::getInstance();
  37. $result=$db->query("SELECT * FROM guest_book LIMIT 5 DESC");
  38. $collection=new GuestBookEntryStack();
  39. $collection->loadFromArray(& $result->fetchAllRows());
  40. return $collection->getCollection();
  41. }
  42.  
  43. public function getEntry($id)
  44. {
  45. return $this->collection->get($id);
  46. }
  47.  
  48. }
  49.  
  50.  
  51. class GuestBookEntry
  52. {
  53. private $id;
  54. private $message;
  55. private $username;
  56.  
  57. public function __construct($misc=null)
  58. {
  59. if(is_integer($misc))
  60. {
  61. $sql="SELECT * FROM guest_book WHERE id='$misc'";
  62. $db=DB::getInstance();
  63. $result=$db->query($sql);
  64. $row=$result->fetchRow();
  65. }
  66. elseif(is_array($misc))
  67. {
  68. $row=& $misc;
  69. }
  70. $this->setId($row['id']);
  71. $this->setMessage($row['message']);
  72. $this->setUsername($row['username']);
  73. }
  74.  
  75. public function getId()
  76. {
  77. return $this->username;
  78. }
  79.  
  80. public function setId($value)
  81. {
  82. $this->id=$value;
  83. }
  84.  
  85. public function getMessage()
  86. {
  87. return $this->message;
  88. }
  89.  
  90. public function setMessage($value)
  91. {
  92. $this->message=$value;
  93. }
  94.  
  95. public function getUsername()
  96. {
  97. return $this->username;
  98. }
  99.  
  100. public function setUsername($value)
  101. {
  102. $this->username=$value;
  103. }
  104.  
  105. public function create()
  106. {
  107. $sql="INSERT INTO guest_book (id, message. username) VALUES ('', '".$this->getMessage()."', '".$this->getUsername()."')";
  108. $db=DB::getInstance();
  109. if($db->query($sql))
  110. {
  111. $this->setId($db->getLastInsertId());
  112. return true;
  113. }
  114. return false;
  115. }
  116.  
  117. public function save()
  118. {
  119. $sql="UPDATE guest_book SET message='".$this->getMessage()."'. username='".$this->getUsername()."'";
  120. $db=DB::getInstance();
  121. return $db->query($sql);
  122. }
  123. }
  124.  
  125.  
  126.  
  127. class GuestBookEntryStack
  128. {
  129. private $collection=array();
  130.  
  131. public function add(GuestBookEntry $entry)
  132. {
  133. $this->collection[$entry->getId()]=$entry;
  134. }
  135.  
  136. public function has($id)
  137. {
  138. if(isset($this->collection[$id]))
  139. {
  140. return true;
  141. }
  142. return false;
  143. }
  144.  
  145. public function get($id)
  146. {
  147. return $this->collection[$id];
  148. }
  149.  
  150. public function getCollection()
  151. {
  152. return $this->collection;
  153. }
  154.  
  155. public function remove($id)
  156. {
  157. unset($this->collection[$id]);
  158. }
  159.  
  160. public function loadFromArray(array $stack)
  161. {
  162. foreach($stack as $row)
  163. {
  164. $this->add(new GuestBookEntry($row));
  165. }
  166.  
  167. }
  168.  
  169. }
  170.  
  171. /*
  172.  * Użycie:
  173.  */
  174.  
  175. $gb=new GuestBook();
  176. $gb->load();
  177. foreach($gb->getEntries() as $entry)
  178. {
  179. print $entry->getMessage().'<br />';
  180. }
  181.  
  182. // Dodajemy?
  183. $gb=new GuestBook();
  184.  
  185. $data['username']=$_POST['username'];
  186. $data['message']=$_POST['message'];
  187.  
  188. $gb->addEntry(new GuestBookEntry($data));
  189.  
  190. ?>
marcio
Czyli ogolnie powinno sie tworzyc klasy dla kazdej operacji??Dzieki przeanalizuje skrypt i spruboje cos napisac smile.gif heh marsz do ksiazek tak szczerze czytam 5 kurs'ow o OOP i mecze ksiazke ale nic..... moze jestem tepy

P.S takie male pytanko tylko nie krzycz masz np takie cos
  1. <?php
  2. $db=DB::getInstance();
  3. //i to tez
  4. $this->setId($db->getLastInsertId());
  5. ?>

Etc czyli inne funckje ktorych w kodzie nie widze i czemu tak jest chyba ze nie dowidzialem tego w kodzie to sorki
Cysiaczek
Bo nie będę Ci przecież wszystkich funkcji pisał. Każdy ma jakieś własne, a to jest pseudokod, więc tylko sygnalizuje pewne rzeczy. Przeceż każdy rozumie o co chodzi z getLastInsertId i dlaczego zostało użyte.

Pozdrawiam
marcio
Wykombinowalem cos takiego bylbym wdzieczny jak ktos powie co jeszcze zle robie co moge poprawic zeby kod byl bardziej elastyczny etc

@Cysiaczek wielkie dzieki troche mi to rozjasnilo idee ale czemu tyle class?
  1. <?php
  2.  
  3. include('config.php');
  4.  
  5. class Guest {
  6.  
  7. public $data, $ip, $host, $nick, $message, $strona, $id;
  8. private $pasy, $action, $method, $db;
  9.  
  10. public function __construct($nick, $message, $action, $method) {
  11.  
  12. global $pasy;
  13.  
  14. $this -> action = $action;
  15. $this -> method = $method;
  16. $this -> strona = (int)$_GET['strona'];
  17. $this -> id = (int)$_GET['id'];
  18. $this -> data = date('j/n/Y H:i:s');
  19. $this -> nick = htmlspecialchars(addslashes($nick));
  20. $this -> message = htmlspecialchars(addslashes($message));
  21. $this -> ip = $_SERVER['REMOTE_ADDR'];
  22. $this -> host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  23. $this -> pasy = $pasy;
  24. }
  25.  
  26.  
  27. public function getnick() {
  28.  
  29. return $this -> nick;
  30. }
  31.  
  32. public function getmsg() {
  33.  
  34. return $this -> message;
  35. }
  36.  
  37. public function getdate() {
  38.  
  39. return $this -> data;
  40. }
  41.  
  42. public function getip() {
  43.  
  44. return $this -> ip;
  45. }
  46.  
  47. public function db_connect() {
  48.  
  49. if($this -> db = mysql_connect($this->pasy['host'], $this->pasy['login'], $this->pasy['haslo'])) {
  50. mysql_select_db($this->pasy['baza']);
  51. return true;
  52. }
  53.  
  54. else return false;
  55.  
  56. }
  57.  
  58.  
  59. public function db_close() {
  60.  
  61. mysql_close($this -> db);
  62.  
  63. }
  64.  
  65.  
  66. public function new_query($query) {
  67.  
  68. $this -> db_connect();
  69. if($result = mysql_query($query))
  70. return $result;
  71.  
  72. else return die(mysql_error());
  73. $this -> db_close();
  74.  
  75. }
  76.  
  77.  
  78. public function num_rows($resource) {
  79.  
  80. if($result = mysql_num_rows($resource)) return $result;
  81. else return false;
  82. }
  83.  
  84. public function fetch_assoc($resource) {
  85.  
  86. if($result = mysql_fetch_assoc($resource)) return $result;
  87. else return false;
  88. }
  89.  
  90. public function addentry() {
  91.  
  92. $this -> new_query("insert into ksiega_gosci(nick,message,data,ip,kod) values('".$this -> getnick()."', '".$this -> getmsg()."', '".$this -> getdate()."', '".$this -> getip()."', '')");
  93. $host = $_SERVER['HTTP_HOST'];
  94. $uri = rtrim(dirname($_SERVER['PHP_SELF']), '');
  95.  
  96. }
  97.  
  98. public function load_reply($on_page = 15) {
  99.  
  100. $wynik1 = $this -> new_query("select * from ksiega_gosci order by id desc limit ".$this -> strona*$on_page.",".$on_page);
  101.  
  102. while($tab = $this -> fetch_assoc($wynik1)) {
  103. echo('<table border="1" width="75%" align="center" style="border: 1px dotted red;"><tr><td width="40%">Dodal: '.stripslashes($tab['nick']).'</td><td width="26%">Dnia:'.$tab['data'].'</td></tr>
  104. <tr><td><b>'.stripslashes($tab['message']).'</b></td></tr></table></form>');
  105. }
  106. }
  107.  
  108. public function pager($on_page = 15) {
  109.  
  110. $wynik = $this -> new_query("select * from ksiega_gosci");
  111. $num = $this -> num_rows($wynik);
  112. $how_much = ceil($num/$on_page);
  113.  
  114. if(!isset($this -> strona)) $this -> strona = 0;
  115.  
  116. if($this -> num_rows($wynik) == 0) {
  117.  
  118. echo('<script>alert("Nie ma wpisow");</script>');
  119. }
  120.  
  121. echo('<Br><center><b>Strona: '.($this -> strona).' z '.($how_much-1).'</b></center>');
  122.  
  123. if(is_numeric($this -> strona) && !empty($this -> strona) && $this -> strona > 0) {
  124. echo('<center><a href="?strona='.($strona-1).'"><img src='rev.gif' /></a> ');
  125.  
  126. }
  127.  
  128. if(is_numeric($this -> strona) && !empty($this -> strona) && $this -> strona < $how_much) {
  129. echo('<a href="?strona='.($this-> strona+1).'"><img src='next.gif' /></a></center>');
  130.  
  131. }
  132.  
  133. else {
  134. echo('<center><a href="?strona='.($this -> strona+1).'"><img src='next.gif' /></a></center>');
  135.  
  136.  }
  137.  
  138. echo('<table align="center" style="border: 1px dotted red;"><tr><td align="center">');
  139.  
  140. for($i = 0; $i < $how_much; $i++) 
  141. echo('<a href="?strona='.$i.'">['.$i.']</a> ');
  142. echo('</td></tr></table>');
  143.  
  144. }
  145.  
  146. public function Wyswietl_form() {
  147.  
  148. echo('<html>
  149. <head><meta http-equiv="content-type" charset="utf-8" /><title>GuEsT bY MARCIO</title>
  150. <style type="text/css">
  151. a {color:#FDEDF2}
  152. body {color:#FDEDF2}
  153. </style>
  154. </head>
  155. <body bgcolor="#000000">
  156. <center><img src="gora.jpg" width="1240" height="100" alt="obrazek"/></center>
  157. <table align="center" width="75%">
  158. <form action="'.$this -> action.'" method="'.$this -> method.'">
  159. <tr><td align="center"><input type="text" name="nick" size="71" value="Nick" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;"/></td></tr>
  160. <tr><td align="center"><textarea name="message" rows="3" cols="70" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;">Tutaj wpisz wiadomosc</textarea></td></tr>
  161. <tr><td align="center"><input type="submit" name="dodaj" value="Dodaj wpis" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;" /></td></tr>
  162. </form></table>
  163. </body><html>'); 
  164. }
  165.  
  166.  
  167. public function Add_New_reply() {
  168.  
  169.  $this -> Wyswietl_form();
  170.  
  171.  if(!empty($this -> nick) && !empty($this -> message) && isset($_POST['dodaj'])) {
  172.  
  173.  setcookie("Spamer", "Spam", time() + 300);
  174.  
  175.  if($_COOKIE['Spamer'] != "Spam") {
  176.  
  177.  $this->addentry();
  178.  }
  179.  
  180.  else echo('<script>alert("Spadaj spamerze musisz odczekac 5min :)");</script>');
  181.  
  182.  }
  183.  }
  184.  
  185.  
  186. public function Show_All_reply() {
  187.  
  188. $this -> load_reply();
  189. $this -> pager();
  190. }
  191. };
  192.  
  193. $ksiega = new Guest($_POST['nick'], $_POST['message'], 'new_klasa.php', 'post');
  194. $ksiega -> Add_New_reply();
  195. $ksiega -> Show_All_reply();
  196.  
  197. echo('<Br><div style="background:#FFFFFF;color:#000000;text-align:center;border:2px solid:white;"><code><b>Powered by Marcio. GG(4854727)</b><img src="http://www.gadu-gadu.pl/users/status.asp?id=4854727&styl=1"/><Br><a style="color:#000000" href="http://ekmll.com" TARGET="_blank">My site</a></code></div>');
  198. ?>

Mam pytanie co zrobic z tym kodem html??
l0ud
marcio, ale dlaczego tym kodem robisz właściwie wszystko? Umieszczanie metod obsługujących bazę to jest przesada - od tego powinien być inny obiekt. Co do kodu html, to powinieneś oddzielić go poprzez jakiś system szablonów, a na pewno nie zawierać w klasie w ten sposób.
marcio
@l0ud a moglbys pokazac mniej wiecej jak ma wygladac taki system szablonow??Tzn szukam ale znalesc nic ciekawego i prostego nie potrafie

P.S funckje dla bazy mam dac do innej klasy tylko jak je potem polaczyc??Zeby te funckje do mysql dzialaly w innej klasie??Wystarczy samo publuc przy funckjach czy jak??
Xniver
Zobacz sobie Open Power Template albo Smarty

Cytat
P.S funckje dla bazy mam dac do innej klasy tylko jak je potem polaczyc??Zeby te funckje do mysql dzialaly w innej klasie??Wystarczy samo publuc przy funckjach czy jak??

Masz tu przykład:
  1. <?php
  2. class Db
  3. {
  4. static protected $instance = null;
  5.  
  6. static public function getInstance()
  7. {
  8. if(self::$instance === null)
  9. {
  10. self::$instance = new Db;
  11. }
  12.  
  13. return self::$instance;
  14. }
  15.  
  16. public function connect()
  17. {
  18. // Łączenie
  19. }
  20. // itd
  21. }
  22.  
  23. // Przykład korzystania
  24. $query = Db::getInstance()->query('SELECT * FROM test');
  25.  
  26. // 2 przykład
  27. $db = Db::getInstance();
  28.  
  29. $query = $db->query('SELECT * FROM test');
  30. ?>
marcio
OK Xniver wielkie dzieki zaraz lukne co robi ten self:: bo parent:: wywoluje metoda z glownej klasy dobrze mowie??

Mam jednak problem probuje zrobic to na 2 klasach i robie tak
  1. <?php
  2. include('config.php');
  3.  
  4. class Mysql_option {
  5.  
  6. public $db, $pasy;
  7.  
  8. public function __construct() {
  9.  
  10. $this -> db = $db;
  11. $this -> pasy = $pasy;
  12.  
  13. }
  14.  
  15. public function db_connect() {
  16.  
  17. if($this ->db = mysql_connect($this->pasy['host'], $this->pasy['login'], $this->pasy['haslo'])) {
  18. mysql_select_db($this->pasy['baza']);
  19. return true;
  20. }
  21.  
  22. else return false;
  23.  
  24. }
  25.  
  26.  
  27. public function db_close() {
  28.  
  29. mysql_close($this -> db);
  30.  
  31. }
  32.  
  33.  
  34. public function new_query($query) {
  35.  
  36. $this -> db_connect();
  37. $this -> new_query = $query;
  38. if($result = mysql_query($this -> new_query))
  39. return $result;
  40.  
  41. else return die(mysql_error());
  42. $this -> db_close();
  43.  
  44. }
  45.  
  46.  
  47. public function num_rows($resource) {
  48.  
  49. $this -> new_resource = $resource;
  50. if($result = mysql_num_rows($this -> new_resource)) return $result;
  51. else return false;
  52. }
  53.  
  54. public function fetch_assoc($resource) {
  55.  
  56. $this -> new_resource = $resource;
  57. if($result = mysql_fetch_assoc($this -> new_resource)) return $result;
  58. else return false;
  59. }
  60. };
  61.  
  62.  
  63. class Guest extends Mysql_option {
  64.  
  65. private $data, $ip, $host, $nick, $message, $strona, $id, $action, $method;
  66.  
  67. public function __construct($nick, $message, $action, $method) {
  68.  
  69. $this -> action = $action;
  70. $this -> method = $method;
  71. $this -> strona = (int)$_GET['strona'];
  72. $this -> id = (int)$_GET['id'];
  73. $this -> data = date('j/n/Y H:i:s');
  74. $this -> nick = htmlspecialchars(addslashes($nick));
  75. $this -> message = htmlspecialchars(addslashes($message));
  76. $this -> ip = $_SERVER['REMOTE_ADDR'];
  77. $this -> host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  78. $this -> pasy = $pasy;
  79. }
  80.  
  81.  
  82. public function getnick() {
  83.  
  84. return $this -> nick;
  85. }
  86.  
  87. public function getmsg() {
  88.  
  89. return $this -> message;
  90. }
  91.  
  92. public function getdate() {
  93.  
  94. return $this -> data;
  95. }
  96.  
  97. public function getip() {
  98.  
  99. return $this -> ip;
  100. }
  101.  
  102. public function addentry() {
  103.  
  104. $this -> new_query("insert into ksiega_gosci(nick,message,data,ip,kod) values('".$this -> getnick()."', '".$this -> getmsg()."', '".$this -> getdate()."', '".$this -> getip()."', '')");
  105. $host = $_SERVER['HTTP_HOST'];
  106. $uri = rtrim(dirname($_SERVER['PHP_SELF']), '');
  107.  
  108. }
  109.  
  110. public function load_reply($on_page = 15) {
  111.  
  112. $wynik1 = $this -> new_query("select * from ksiega_gosci order by id desc limit ".$this -> strona*$on_page.",".$on_page);
  113.  
  114. while($tab = $this -> fetch_assoc($wynik1)) {
  115. echo('<table border="1" width="75%" align="center" style="border: 1px dotted red;"><tr><td width="40%">Dodal: '.stripslashes($tab['nick']).'</td><td width="26%">Dnia:'.$tab['data'].'</td></tr>
  116. <tr><td><b>'.stripslashes($tab['message']).'</b></td></tr></table></form>');
  117. }
  118. }
  119.  
  120. public function pager($on_page = 15) {
  121.  
  122. $wynik = $this -> new_query("select * from ksiega_gosci");
  123. $num = $this -> num_rows($wynik);
  124. $how_much = ceil($num/$on_page);
  125.  
  126. if(!isset($this -> strona)) $this -> strona = 0;
  127.  
  128. if($this -> num_rows($wynik) == 0) {
  129.  
  130. echo('<script>alert("Nie ma wpisow");</script>');
  131. }
  132.  
  133. echo('<Br><center><b>Strona: '.($this -> strona).' z '.($how_much-1).'</b></center>');
  134.  
  135. if(is_numeric($this -> strona) && !empty($this -> strona) && $this -> strona > 0) {
  136. echo('<center><a href="?strona='.($strona-1).'"><img src='rev.gif' /></a> ');
  137.  
  138. }
  139.  
  140. if(is_numeric($this -> strona) && !empty($this -> strona) && $this -> strona < $how_much) {
  141. echo('<a href="?strona='.($this-> strona+1).'"><img src='next.gif' /></a></center>');
  142.  
  143. }
  144.  
  145. else {
  146. echo('<center><a href="?strona='.($this -> strona+1).'"><img src='next.gif' /></a></center>');
  147.  
  148.  }
  149.  
  150. echo('<table align="center" style="border: 1px dotted red;"><tr><td align="center">');
  151.  
  152. for($i = 0; $i < $how_much; $i++) 
  153. echo('<a href="?strona='.$i.'">['.$i.']</a> ');
  154. echo('</td></tr></table>');
  155.  
  156. }
  157.  
  158. public function Wyswietl_form() {
  159.  
  160. echo('<html>
  161. <head><meta http-equiv="content-type" charset="utf-8" /><title>GuEsT bY MARCIO</title>
  162. <style type="text/css">
  163. a {color:#FDEDF2}
  164. body {color:#FDEDF2}
  165. </style>
  166. </head>
  167. <body bgcolor="#000000">
  168. <center><img src="gora.jpg" width="1240" height="100" alt="obrazek"/></center>
  169. <table align="center" width="75%">
  170. <form action="'.$this -> action.'" method="'.$this -> method.'">
  171. <tr><td align="center"><input type="text" name="nick" size="71" value="Nick" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;"/></td></tr>
  172. <tr><td align="center"><textarea name="message" rows="3" cols="70" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;">Tutaj wpisz wiadomosc</textarea></td></tr>
  173. <tr><td align="center"><input type="submit" name="dodaj" value="Dodaj wpis" style="font-style:italic; background-color:#000000; color:#00A54E; border-color: #000000; border: #000000;" /></td></tr>
  174. </form></table>
  175. </body><html>'); 
  176. }
  177.  
  178.  
  179. public function Add_New_reply() {
  180.  
  181.  $this -> Wyswietl_form();
  182.  
  183.  if(!empty($this -> nick) && !empty($this -> message) && isset($_POST['dodaj'])) {
  184.  
  185.  setcookie("Spamer", "Spam", time() + 300);
  186.  
  187.  if($_COOKIE['Spamer'] != "Spam") {
  188.  
  189.  $this->addentry();
  190.  }
  191.  
  192.  else echo('<script>alert("Spadaj spamerze musisz odczekac 5min :)");</script>');
  193.  
  194.  }
  195.  }
  196.  
  197.  
  198. public function Show_All_reply() {
  199.  
  200. $this -> load_reply();
  201. $this -> pager();
  202. }
  203. };
  204.  
  205. $ksiega = new Guest($_POST['nick'], $_POST['message'], 'new_klasa.php', 'post');
  206. $ksiega -> Add_New_reply();
  207. $ksiega -> Show_All_reply();
  208.  
  209. echo('<Br><div style="background:#FFFFFF;color:#000000;text-align:center;border:2px solid:white;"><code><b>Powered by Marcio. GG(4854727)</b><img src="http://www.gadu-gadu.pl/users/status.asp?id=4854727&styl=1"/><Br><a style="color:#000000" href="http://ekmll.com" TARGET="_blank">My site</a></code></div>');
  210. ?>

Jednak mam takie bledy
Cytat
Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/new_klasa.php on line 20

Warning: mysql_query() [function.mysql-query]: Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/new_klasa.php on line 41

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /var/www/new_klasa.php on line 41
Access denied for user 'www-data'@'localhost' (using password: NO)

I nie wiem czemu przeciwz daje ze $pasy sa public i robie na nie construct'a na jednej klasie dzialalo czy ktos z was wie czemu tak sie dzieje??

P.S jesli kod jest zadlugi prosze mowic to go usune i wrzuce na jakis server
Xniver
IMHO gorzej tego zrobić nie mogłeś. Masz tutaj przykład poprawnego sterownika bazy MySQL(napisany specjalnie dla ciebie):
  1. <?php
  2. class Db
  3. {
  4. protected $link;
  5.  
  6. static protected $instance = null;
  7.  
  8. public function __construct()
  9. {
  10. require_once './config.php';
  11.  
  12. $this->link = @mysql_connect($pasy['host'], $pasy['login'], $pasy['haslo']);
  13.  
  14. if(!$this->link)
  15. {
  16. exit('Nie można połączyć z bazą danych');
  17. }
  18.  
  19. if(!mysql_select_db($pasy['baza'], $this->link))
  20. {
  21. exit('Nie można wybrać bazy danych');
  22. }
  23. }
  24.  
  25. public function __destruct()
  26. {
  27. mysql_close($this->link);
  28. }
  29.  
  30. public function fetchAssoc($query)
  31. {
  32. return mysql_fetch_assoc($query);
  33. }
  34.  
  35. public function getAll($query)
  36. {
  37. $query = $this->makeQuery($query);
  38.  
  39. $rows = array();
  40.  
  41. while($row = $this->fetchAssoc($query))
  42. {
  43. $rows[] = $row;
  44. }
  45.  
  46. return $rows;
  47. }
  48.  
  49. static public function getInstance()
  50. {
  51. if(self::$instance === null)
  52. {
  53. self::$instance = new Db;
  54. }
  55.  
  56. return self::$instance;
  57. }
  58.  
  59. public function getRow($query)
  60. {
  61. $query = $this->makeQuery($query);
  62. $query = $this->fetchAssoc($query);
  63.  
  64. if(!$query)
  65. {
  66. $query = array();
  67. }
  68.  
  69. return $query;
  70. }
  71.  
  72. public function makeQuery($query)
  73. {
  74. $query = mysql_query($query, $this->link);
  75.  
  76. if(!$query)
  77. {
  78. exit('Błąd zapytania');
  79. }
  80.  
  81. return $query;
  82. }
  83.  
  84. public function numRows($query)
  85. {
  86. return mysql_num_rows($query);
  87. }
  88. }
  89.  
  90. // ------------------
  91. // Przykłady
  92. // ------------------
  93. $db = Db::getInstance();
  94.  
  95. // Pobranie jednego wiersza z bazy danych
  96. $row = $db->getRow('SELECT * FROM `testowa_tabela`
  97. WHERE `id` = 1');
  98.  
  99. echo $row['id'];
  100.  
  101. // Pobranie wszystkich wierszy z bazy danych
  102. $rows = $db->getAll('SELECT * FROM `testowa_tabela`');
  103.  
  104. foreach($rows as $row)
  105. {
  106. echo $row['id'];
  107. }
  108.  
  109. // Wykonanie zapytania
  110. $db->makeQuery('Zapytanie do wykonania');
  111. ?>
marcio
Wiem ze tego najlepiej nie napisalem ale czy mozesz powiedziec dlaczego moj kod nie dziala na 2 klasach a na jednej tak??Bylbym wdzieczny bo wiesz uczy sie na wlasnych bledach

p.S ciekawy jestem tez czy powiedzialbyc na czym polega system szablonow dla kodu html tak jak napisal mi o tym jeden z user'ow ktory uczestniczyl w tej dyskusji zeby nie dawac kodu html do klas a zrobic system szablonow czyli??Tak w kilku slowach albo jakas alternatywe
Xniver
Jeśli chodzi o ten twój poprzedni kod to tam miałeś błąd w konstruktorze(zapomniałeś o global $pasy(a poza tym global niezbyt pasuje do OOP))

Re P.S: Po prostu chodzi o to ,żeby oddzielić warstwę logiki od warstwy prezentacji(zobacz sobie wzorzec MVC). Zobacz sobie jak to jest rozwiązane w jakimś frameworku(Symfony, Agavi, KohanaPHP)
marcio
O lol az mi siara probowalem dac global ale do glownej klasy smile.gif a nie do podklasy wielkie dzieki zapomnialo mi sie i teraz mam nastepne pytanie a nawet 2 na jakiej zasadzie ma dzialac ten parser/system szablonow czyli zostawic ten kod html w klasie czy lepiej jak zmienie to ale jak i jeszcze jedno czy teraz kod ktory dalem wyzej zbliza sie do idei OOP czy jeszcze mi do nie daleko jesli daleko to powiedz co jeszcze bym musial zmienic bo ten twoj kod jak narazie jest dla mnie zbyt skomplikowany ....sad.gif

EDIT:
P.S teraz przeczytalem twoj p.s zaraz lukne na framework'a i mvc smile.gif

EDIT2:
Myslalem ze stosujac public dla pierwszej klasy nie bede musial dawac global dlaczego tak sie dzieje??
Xniver
  1. <?php
  2. public function __construct() {
  3.  
  4. $this -> db = $db;
  5. $this -> pasy = $pasy;
  6.  
  7. }
  8. ?>


Zobacz na swój kod. Nie widzisz błędu?

  1. <?php
  2. $this -> pasy = $pasy;
  3. ?>


Skrypt musi skąd wziąć zmienną $pasy
marcio
no tak to jak zrobic zebym nie mysial uzywac global wiesz zdaje sie do bzdeta ale jak raz ktos pokarze co i jak to sie pamieta to na zawsze tongue.gif
Xniver
  1. <?php
  2. public function __construct()
  3. {
  4. require_once './config.php';
  5.  
  6. $this->link = @mysql_connect($pasy['host'], $pasy['login'], $pasy['haslo']);
  7.  
  8. if(!$this->link)
  9. {
  10. exit('Nie można połączyć z bazą danych');
  11. }
  12.  
  13. if(!mysql_select_db($pasy['baza'], $this->link))
  14. {
  15. exit('Nie można wybrać bazy danych');
  16. }
  17. }
  18. ?>


Jeśli zaincludujesz config.php w metodzie/funkcji to nie musisz używać global
marcio
AHa tak patrzac na ten twoj kod zastanawialem sie nad tym czyli juz rozumiem includujac to w construct i potem dziedziczac ot takiej klasy przy tworzeniu obiektu plik sie includuje i w podklasie a nie tylko w klasie glownej

Zrobilem tak bo w construkcie nie dzialalo i bym musial wszystko zmieniac
  1. <?php
  2. class Mysql_option {
  3.  
  4. protected $db, $pasy;
  5.  
  6. public function __construct() {
  7.  
  8. $this -> db = $db;
  9.  
  10. }
  11.  
  12.  
  13. public function db_connect() {
  14.  
  15. include('config.php');
  16. $this -> pasy = $pasy;
  17. if($this -> db = mysql_connect($this->pasy['host'], $this->pasy['login'], $this->pasy['haslo'])) {
  18. mysql_select_db($this->pasy['baza']);
  19. return true;
  20. }
  21.  
  22. else return false;
  23.  
  24. }
  25. //etc..
  26. ?>

Musze teraz poczytac o tym dostepie za pomoca :: o slowach kluczowych self/parent
Cysiaczek
@marcio - Pokazałem Ci, jak wyglądają klasy księgi gości zbliżone do OOP, a Ty dalej popełniasz te same błędy sad.gif. Jest tak dużo klas po to właśnie, aby było obiektowo. Każdy obiekt zajmuje się swoimi sprawami i posiada ograniczoną odpowiedzialność. Pokazałem Ci też, jak się wyszukuje obiekty (zaznacza się je w zwykłym tekście).

Pozdrawiam.
marcio
@Cysiaczek staram sie jak moge ale...jakos trudno mi tak odrazu to zrozumiem mysle ze z praktyka moja OOP sie poprawi

P.S znasz moze jakies fajne kursu online albo masz moze jakies ebook'i w PDF bo nie teraz nie ma mnie w polsce i ksiazki nie kupie dopiero w wakacje wielkie dzieki bo wiesz znalazlem kupe kursow ale byly krotkie smile.gif
Cysiaczek
Nie, nie posiadam e-booków, ani adresów, bo na łamach php.pl nie uprawiamy piractwa.

Pozdrawiam i powodzenia w nauce smile.gif
marcio
W sumie masz racje ale dzieki smile.gif no coz poucze sie jeszcze i zobacze co z tego bedzie mam nadzieje ze wkrotce zrozumie

P.S mam jeszcze jedno male pytanie czy bylbys tak wdzieczny i molgbys mi dac jakies twoje przykladowe klasy co kiedys napisales nie zadlugie i nie skomplikowane sciaglem pager'a Nospor'a ale jest zatrudnu i zadlugi a inne kody w sieci idem moze masz cos ciekawego??

Napisalem to na nowo na 3 klasach + system szablonow jak zwykle nie jest to OOP ale zawsze cos dziala dzialac jednak moze ktos pokazac co by zmienil

Mam jeszcze jedno pytanie probowalem to zrobic na interfejsach zeby nie robic tych wszystkich klas i nie dawac extends i robil np tak
Plik interface.php
  1. <?php
  2. interface Db {
  3.  
  4. public function db_connect();
  5. public funcion db_close();
  6. public function new_query();
  7. //etc wszystkie metody potrzebne do sql
  8. }
  9.  
  10. interface Html_code {
  11.  
  12. public function html();
  13. public function button();
  14. public function text_input();
  15. //etc wszystkie metody do szablonu html
  16. }
  17. ?>

Potem plik interface.php includowalem do new_klasa.php(glowna klasa) i robilem cos takiego
  1. <?php
  2. class Guest implements Db, Html_code {
  3. //tu wszystkie metodu pola etc...
  4. }
  5. ?>

I wywalalo jakis blad a nie wiem dlaczego tzn ze za db_connect prawidlo jest sie odwolywac Db::db_connect a nie Guest::db_connect i tak samo z innymi metodami wiec co zle robilem??

Czy piszac to na interfejsach kod bylby krotszy skoro nie musial bym pisac w kazdel klasie metody lecz tylko w klasie w ktorej je potrzebowalem

P.S i jeszcze jedno to co ja robie to jest dziedziczenie
Db
|
Html_code
|
Guest

Jednak dla kadzej klasu musialem pisac wlasne metody jednak stosujac interface wychodzi na wielodziedziczenie
czyli Klasa Guest dziedziczy od Db i Html_code naraz nawet ze wyczytalem ze nie jest to jednak takie wielodziedziczenie jak w C++/Java ale czy za pomoca interface nie bylo by mniej kodu i czy idzie tak zrobic bo wtedy pisze tylko metody gdzie mi sa potrzebne

Tu jest link klasy:http://rafb.net/p/IOORnq87.html
Xniver
Czemu cały czas dziedziczysz/implementujesz interfejs klasę/y Db? Nie możesz po prostu użyć jej jako zewnętrznej klasy?
marcio
Cytat
Nie możesz po prostu użyć jej jako zewnętrznej klasy?

Czyli bo nie bardzo rozumiem dac do osobnego pliku i co??

P.S kolge mi wytlumaczyl po co sa interfejsy sluza do pracy na obiektach nie na polach jednak nie wiem czy dobrze zrozumialem jak zle to napewno nie jego wina smile.gif
Xniver
Nie chodziło o to:
  1. <?php
  2. class Db
  3. {
  4. // Tutaj baza(z getInstance() itp.)
  5. }
  6.  
  7. class GuestBook
  8. {
  9. public function jakasFunkcja()
  10. {
  11. $query = Db::getInstance()->query('SELECT ...');
  12.  
  13. }
  14. ?>
marcio
Cytat(Xniver @ 11.03.2008, 15:24:24 ) *
Nie chodziło o to:
  1. <?php
  2. class Db
  3. {
  4. // Tutaj baza(z getInstance() itp.)
  5. }
  6.  
  7. class GuestBook
  8. {
  9. public function jakasFunkcja()
  10. {
  11. $query = Db::getInstance()->query('SELECT ...');
  12.  
  13. }
  14. ?>

Czyli wywolujac A::jaka_fuinckja(); daje to to ze z zwnetrza innej klasy mozna wywolac funckje z innej klasy nawet jesli sie nie dziedziczy jej metod tongue.gif dzieki ogolnie wyglada to bardziej profesjonalnie smile.gif to kiedy powinno sie uzywac extends a kiedy tego "::" questionmark.gif
carbolymer
Widze tu braki w podstawach OOP. Extends (jak sama nazwa wskazuje sic!) używasz jeżeli chcesz rozszerzyć możliwości klasy (np. sterownik bazy żeby mógł używać innego typu bazy). :: jest to operator dostępu. Używasz go przy dostępie do statycznych metod klasy, dosyć często w singletonach (tak jak tutaj). Dziedziczenie nie jest na wszystko rozwiązaniem. Czasem niepożądana jest obecność innych metod w obiekcie (np. obsługa formatowania tekstu w klasie od strumieniowania audio) dlatego nie można wszystkiego dziedziczyć. Inną sprawą jest wydajność. Gdybyśmy mieli 1001 klas a każda by dziedziczyła po klasie DB, to w każdym obiekcie jednej z tych 1001 klas byłby obiekt klasy DB (no, niedokładnie, ale tak można teoretyzować). Każdy obiekt DB tworzył by połączenie (no, można dać statyczne połączenie, ale i tak spora część obiektu typu DB jest kopiowana!), oddzielne cachowanie i kilka innych pierdół co zaowocuje w wysokim użyciu zasobów i zarżnięciu serwera na amen. :]
marcio
Dzieki czyli operator :: mozna powiedziec ze zastepuje w pewnym sensie extends jednak dobrze ze dziedzicze klase do formatowania tekstu z ta Guest??Rozjasniles mi idee jednak musze sie nauczyc podstaw czytam i czytam ale wycztac nie potrafie smile.gif
Xniver
Cytat
Dzieki czyli operator :: mozna powiedziec ze zastepuje w pewnym sensie extends

Nieeee, on służy do wywołania statycznych funkcji klasy(poza tym ty naprawdę się uparłeś na to extends tongue.gif)
marcio
No troche sie uparlem nie wiem czemu tongue.gif jakos tak w ksiazce tak jest to ty bys zrobil wszystko za pomoca ::questionmark.gif

Mam jeszcze jedno pytanie pozmienialem wszystko i zamiast dawac jako matke klas(czy jakos tam) Mysql_option dalem te :: w metodach w innych klasach gdzie je wywoluje ale stalo sie cos dziwnego przynajmniej dla mnie smile.gif
A praktycznie chodzi o to ze w funckji do wysylania zapytania sql musialem dac operator :: czyli mam tak
  1. <?php
  2. //klasa mysql_option
  3.  
  4. public function new_query($query) {
  5.  
  6. Mysql_option::db_connect();
  7. $this -> new_query = $query;
  8. if($result = mysql_query($this -> new_query))
  9. return $result;
  10.  
  11. else return die(mysql_error());
  12. $this -> db_close();
  13. }
  14. ?>

Jednak jak zamiast Mysql_option::db_connect dam $this -> db_connect(); wywala takiego error'a
Cytat
Fatal error: Call to undefined method Guest::db_connect() in /var/www/new_klasa.php on line 39

Gdzie linia 39 to ta co podalem wyzej a dlaczego nie daje tego error'a prz $this -> db_close();??
Myslalem ze ten operator sluzy tylko do wywolywania metod w innej klasie niz zostaly napisane z nie tez w danej klais eczyli mam taki kod teraz:http://rafb.net/p/pWJLp659.html
Moze ktyos wytlumaczyc dlaczego tak sie dzieje

P.S znacie jakies fajne kursu online??Chyba sobie w wakacje kupie ksiazki do OOP
Xniver
Bo $this wywołuje funkcje znajdujące się w aktualnej klasie. A Mysql_option::db_connect() wywołuje statyczną funkcje db_connect klasy Mysql_option
marcio
No tak ale ta funckja new_query znajduje sie w klasie Mysql_option i db_connect w niej zeby nie wywolywac 3 metod naraz w innej klasie wiec czemu tak myslalem ze mam uzywac tylko :: w innej klaise bo do $this -> db_close() sie nie pluje interpreter a w tym samym miejscy uzywam smile.gif
Noctrum
Cysiaczek moge prosic Ciebie o wyjasnienie tej linijki z twojego kodu:

  1. <?php
  2. $this->collection->loadFromArray(& $result->fetchAllRows());
  3. ?>


przerabiam kod ktory podales jako przyklad i wyskakuje mi taki blad:

Fatal error: Can't use method return value in write context in ...

pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.