Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> [PHP][OOP]Walidacja, Klasa walidujaca,
MateuszS
post
Post #1





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Witam, zaczynam z OOP i napisałem prostą klasę walidującą dla małych formularzy, napiszcie co można poprawić, miałem ją zaopatrzyć w MVC i prezentować błędy widokiem ale to już na kiedy indziej.

  1. //wlasciwa klasa w moim nastepnym poscie w tym temacie ;P


Ten post edytował MateuszS 21.04.2010, 17:23:14


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Dlaczego ten kod się do niczego nie nadaje?

1) Powiedzmy, że mamy pole "treść" w dwóch formularzach: edycji sygnaturki oraz tworzenia nowego wpisu do np. bloga. Chcę by pole "treść" w sygnaturce miało pomiędzy 10, a 255 znaków oraz by nie można było podać w nim żadnego adresu URL. Natomiast "treść" w formularzu nowego wpisu ma mieć długość co najmniej 50 znaków.
W tym momencie to "narzędzie" poległo (czyt.: to w jaki sposób co sprawdzać nie powinno być zawarte w klasie).

2) Powiedzmy, że ponownie mam dwa pola "treść". Chcę by treść komunikatu w przypadku gdy podano za mało znaków w formularzu edycji sygnaturki była następująca: "ABC Sygnaturka musi mieć co najmniej 10 znaków", a w formularzu dodania nowego wpisu: "DEF +50 znaków proszę."
Ponownie Twój kod się nie spisuje (czyt.: treści komunikatów również poza klasą lub możliwość ich dowolnej modyfikacji)

3) Chcę dodać sobie nowy walidator - np. sprawdzający czy nr NIP jest poprawny. Muszę przebudowywać pół klasy? (czyt.: walidatory powinny być osobnymi obiektami implementującymi jakiś interfejs)

To tak na początek.
Go to the top of the page
+Quote Post
MateuszS
post
Post #3





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


To tak:
1. Miałem tragiczny błąd w metodzie, nie pozamieniałem z powrotem $this->zmienna na $zmienna, już to poprawiłem.
2. Dodałem metodę za pomocą której możesz bez przerabiania klasy dodawać nowe typy pól, np. ów nip.
3. Mógłbyś wytłumaczyć o co chodzi z

Cytat
walidatory powinny być osobnymi obiektami implementującymi jakiś interfejs


  1. <?
  2.  
  3. class Walidacja
  4. {
  5.  
  6. /* Dozwolone opcje:
  7.   * min_znakow - minimalna ilosc znakow
  8. * max_znakow - maksymalna ilosc znakow
  9. * wzor - wzor wg ktorego ma byc walidowana zmienna
  10.  
  11. Wywolanie obiektu
  12. $ob = new Walidacja;
  13. $ob->waliduj(zmienna, kryterium);
  14.  
  15. Mozna swobodnie dodawac nowe pola/typy pol do ustawien, np
  16. kod pocztowy i zaopatrzyc go w atrybut wzor w ktorym bylby
  17. wzor w postaci wyrazen regularnych, ktory mialby za zadanie
  18. sprawdzac zmienna czy ma poprawny format.
  19. */
  20.  
  21. public $ustawienia = array(
  22. "login" => array(
  23. "min_znakow" => 3,
  24. "max_znakow" => 25
  25. ),
  26. "haslo" => array(
  27. "min_znakow" => 5,
  28. "max_znakow" => 15
  29. ),
  30. "email" => array(
  31. "wzor" => "^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$",
  32. ),
  33. "zabronione" => array()
  34.  
  35. );
  36.  
  37. private $bledy = array();
  38.  
  39. public function dodaj($typ, $min = null, $max = null, $wzor = null)
  40. {
  41. if(!isset($min) and !isset($max) and !isset($wzor)) {
  42. throw new Exception("Musisz podac dodatkowy atrybut(maksymalna ilosc znakow, minimalna lub wzor");
  43. } else {
  44. $typ = (string)$typ;
  45. if(isset($min)) $this->ustawienia[$typ]["min_znakow"] = (int)$min;
  46. if(isset($max)) $this->ustawienia[$typ]["max_znakow"] = (int)$max;
  47. if(isset($wzor)) $this->ustawienia[$typ]["wzor"] = $wzor;
  48. }
  49.  
  50. }
  51.  
  52. public function zabron($zabronione)
  53. {
  54. if(!is_array($zabronione)) {
  55. array_push($this->ustawienia["zabronione"], $zabronione);
  56. } else {
  57. foreach($zabronione as $wartosc)
  58. array_push($this->ustawienia["zabronione"], $wartosc);
  59. }
  60. }
  61.  
  62. public function waliduj($zmienna, $typ = null)
  63. {
  64.  
  65. if(is_array($zmienna)) {
  66. throw new Exception("Weryfikowana zmienna nie moze byc tablica. Bo tak.");
  67. }
  68.  
  69. $zmienna = trim(strip_tags($zmienna));
  70.  
  71. foreach($this->ustawienia["zabronione"] as $zabronione) {
  72. if(preg_match("#".$zabronione."#", $zmienna)) {
  73. $this->bledy[] = "Formularz zawiera niedozwolone znaki/slowa: ".$zabronione.".";
  74. break;
  75. }
  76. }
  77.  
  78. if(isset($typ)) {
  79. if(isset($this->ustawienia[$typ])) {
  80. $ustawienia = $this->ustawienia;
  81.  
  82. foreach($this->ustawienia[$typ] as $klucz => $wartosc) {
  83. if($klucz == "min_znakow") {
  84. if(strlen($zmienna) < $this->ustawienia[$typ]["min_znakow"])
  85. $this->bledy[] = ucfirst($typ)." musi miec conajmniej ".$this->ustawienia[$typ]["min_znakow"]." znakow.";
  86. }
  87. if($klucz == "max_znakow"){
  88. if(strlen($zmienna) > $this->ustawienia[$typ]["max_znakow"])
  89. $this->bledy[] = ucfirst($typ)." moze miec conajwyzej ".$this->ustawienia[$typ]["max_znakow"]." znakow.";
  90. }
  91. if($klucz == "wzor"){
  92. if(!preg_match("#".$this->ustawienia[$typ]["wzor"]."#", $zmienna))
  93. $this->bledy[] = ucfirst($typ)." ma niepoprawny format.";
  94. }
  95.  
  96. }
  97. }
  98. }
  99.  
  100.  
  101. return $zmienna;
  102. }
  103.  
  104. public function pokazbledy()
  105. {
  106. return $this->bledy;
  107. }
  108. }
  109.  
  110. try {
  111.  
  112.  
  113. $obWaliduj = new Walidacja();
  114. $obWaliduj->dodaj("tresc", 1, 10);
  115. $obWaliduj->waliduj("hesdsadsaddads", "tresc");
  116. $obWaliduj->dodaj("tresc", 4, 7);
  117. $obWaliduj->waliduj("aa", "tresc");
  118. $bledy = $obWaliduj->pokazbledy();
  119. foreach($bledy as $blad) {
  120. echo $blad."<br />";
  121. }
  122.  
  123. } catch(Exception $e) {
  124. echo "Blad: ".$e->getMessage();
  125. }


Ten post edytował MateuszS 21.04.2010, 18:36:42


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Spawnm
post
Post #4





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




destruct masakryczny , echo w modelu ?
Dodatkowo lepiej by wyglądała całość gdybyś dał angielskie nazwy.
rozbił bym walidację na metody np valid::mail('adf@dsaf.pl');
Go to the top of the page
+Quote Post
Wicepsik
post
Post #5





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


Walidacja NIPu nie polega tylko na policzeniu jego długości. http://pl.wikipedia.org/wiki/NIP/Implementacja

Ten post edytował Wicepsik 21.04.2010, 17:43:07


--------------------
Go to the top of the page
+Quote Post
MateuszS
post
Post #6





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Spawnm, tak wiem, to nie jest problem zamienić na ang, echo dałem bo jak napisałem, nie mam klasy widoku, więc na szybko wyświetlam błędy,

Wicepsik, gdybyś zobaczył kod, byś wiedział że można dodać do metody 4 parametr którym jest wyrażenie regularne. W każdym razie jeżeli wyrażenia nie wystarczą to dodam jeszcze metodę sprawdzającą nip.

edit:: dodałem prostą metodę zwracania błędów.

Ten post edytował MateuszS 21.04.2010, 18:37:01


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
3. Mógłbyś wytłumaczyć o co chodzi z
Cytat
walidatory powinny być osobnymi obiektami implementującymi jakiś interfejs
Chodzi o to, że walidatory powinny być osobnymi obiektami wyspecjalizowanymi w walidacji konkretnego rodzaju. Daje to możliwość, bym utworzył sobie swój własny walidator, niewpisany na sztywno w kod Twojej klasy - innymi słowy: zwiększamy elastyczność narzędzia.

Tutaj masz przykładowy kod, który ilustruje jak mogło by to wyglądać (oczywiście brak tutaj dziesiątek rzeczy (ustawienia czytelnej treści błędu, wielu walidatorów dla jednego elementu, przedefiniowanych opcji dla walidatorów i całej masy innych rzeczy)):
  1. <?php
  2.  
  3. namespace Crozin\Validation {
  4. interface Validatable {
  5. public function configure(array $params = array());
  6. public function getOptions();
  7. public function getOption($key);
  8.  
  9. public function isValid($subject);
  10. }
  11.  
  12. class Validator {
  13. protected $subjects = array();
  14. protected $validators = array();
  15.  
  16. protected $errors = array();
  17. protected $data = array();
  18.  
  19. public function isValid() {
  20. $isValid = true;
  21.  
  22. foreach ($this->subjects as $key => $subject) {
  23. $result = $this->validators[$key]->isValid($subject);
  24.  
  25. if ($result instanceof Response) {
  26. $isValid = false;
  27. $this->errors[$key] = $result;
  28. } else {
  29. $this->data[$key] = $result;
  30. }
  31. }
  32.  
  33. return $isValid;
  34. }
  35.  
  36. public function addSubjects(array $subjects) {
  37. foreach ($subjects as $key => $subject) {
  38. $this->addSubject($key, $subject);
  39. }
  40. }
  41.  
  42. public function addSubject($key, $subject) {
  43. $this->subjects[$key] = $subject;
  44. }
  45.  
  46. public function addValidators(array $validators) {
  47. foreach ($validators as $key => $validator) {
  48. $this->addValidator($key, $validator);
  49. }
  50. }
  51.  
  52. public function addValidator($key, Validatable $validator) {
  53. $this->validators[$key] = $validator;
  54. }
  55.  
  56. public function getData() {
  57. return $this->data;
  58. }
  59.  
  60. public function getErrors() {
  61. return $this->errors;
  62. }
  63. }
  64.  
  65. class Response {
  66. protected $msg;
  67. protected $subject;
  68. protected $validator;
  69.  
  70. public function __construct($msg, $subject, Validatable $validator) {
  71. $this->msg = $msg;
  72. $this->subject = $subject;
  73. $this->validator = $validator;
  74. }
  75.  
  76. public function getMsg() {
  77. return $this->msg;
  78. }
  79.  
  80. public function getSubject() {
  81. return $this->subject;
  82. }
  83.  
  84. public function getValidator() {
  85. return $this->validator;
  86. }
  87. }
  88. }
  89.  
  90. namespace Crozin\Validation\Validator {
  91. use \Crozin\Validation\Validatable;
  92. use \Crozin\Validation\Response;
  93.  
  94. abstract class Base {
  95. protected $options = array();
  96.  
  97. public function __construct(array $options = array()) {
  98. $this->configure($options);
  99. }
  100.  
  101. public function configure(array $options = array()) {
  102. $this->options = $options;
  103. }
  104.  
  105. public function getOptions() {
  106. return $this->options;
  107. }
  108.  
  109. public function getOption($key) {
  110. return isset($this->options[$key]) ? $this->options[$key] : null;
  111. }
  112. }
  113.  
  114. class NIP extends Base implements Validatable {
  115. public function isValid($subject) {
  116. /* NIP ma nieprawidłowy format (np. podano litery) */
  117. if (1 == mt_rand(1, 2)) {
  118. return new Response('format', $subject, $this);
  119. }
  120.  
  121. /* NIP ma nieprawidłową sumę kontrolną */
  122. if (1 == mt_rand(1, 2)) {
  123. return new Response('control.sum', $subject, $this);
  124. }
  125.  
  126. return $subject;
  127. }
  128. }
  129.  
  130. class String extends Base implements Validatable {
  131. public function isValid($subject) {
  132. if ($this->getOption('trim')) {
  133. $subject = trim($subject);
  134. }
  135.  
  136. if (($min = $this->getOption('min')) && strlen($subject) < $min) {
  137. return new Response('min', $subject, $this);
  138. }
  139.  
  140. if (($max = $this->getOption('max')) && strlen($subject) > $max) {
  141. return new Response('max', $subject, $this);
  142. }
  143.  
  144. return $subject;
  145. }
  146. }
  147.  
  148. class Email extends Base implements Validatable {
  149. public function isValid($subject) {
  150. /* Nieprawidłowy format */
  151. if (1 == mt_rand(1, 2)) {
  152. return new Response('format', $subject, $this);
  153. }
  154.  
  155. /* Jeżeli wpisy MX nie są dobre */
  156. if (1 == mt_rand(1, 2)) {
  157. return new Response('mx', $subject, $this);
  158. }
  159.  
  160. return $subject;
  161. }
  162. }
  163.  
  164. class NumberRange extends Base implements Validatable {
  165. public function isValid($subject) {
  166. if ($this->getOption('natural.only') && false == ctype_digit($subject)) {
  167. return new Response('not.natural', $subject, $this);
  168. }
  169.  
  170. if ($subject < $this->getOption('min') || $subject > $this->getOption('max')) {
  171. return new Response('out.of.range', $subject, $this);
  172. }
  173.  
  174. return $subject;
  175. }
  176. }
  177. }
  178.  
  179. namespace {
  180. use \Crozin\Validation\Validator;
  181. use \Crozin\Validation;
  182.  
  183. error_reporting(E_ALL | E_STRICT);
  184.  
  185. $_POST = array(
  186. 'firstname' => ' Krzysiek ',
  187. 'nickname' => 'Crozin',
  188. 'age' => '7',
  189. 'mail' => 'k...s@gmail.com'
  190. );
  191.  
  192. $v = new Validator();
  193. $v->addSubjects($_POST);
  194. $v->addValidators(array(
  195. 'firstname' => new Validator\String(array('trim' => true, 'min' => 6)),
  196. 'nickname' => new Validator\String(),
  197. 'age' => new Validator\NumberRange(array('natural.only' => true, 'min' => 9, 'max' => 99)),
  198. 'mail' => new Validator\Email()
  199. ));
  200.  
  201. if ($v->isValid()) {
  202. var_dump('Poprawne dane:');
  203. var_dump($v->getData());
  204. } else {
  205. foreach ($v->getErrors() as $error) {
  206. var_dump(sprintf('%s - %s - %s - %s', get_class($error->getValidator()), $error->getSubject(), $error->getMsg(), print_r($error->getValidator()->getOptions(), 1)));
  207. }
  208. }
  209. }
Ale dlaczego to rozwiązanie jest o niebo lepsze? Chcę utworzyć nowy walidator... wystarczy mi obiekt dowolny, który implementuje interfejs \Crozin\Validation\Validatable; Chcę spersonalizować dany walidator? Podaję mu parametr. Itp. itd.

PS. Całość pisana "z palca" bez zastanowienia (jedynie sprawdziłem czy w ogóle działa) - więc jest to na pewno kod do poprawki (przemyślenia sposobu działania, przerobienia), ale daje jako taki zarys pewnej elastyczności.

Ten post edytował Crozin 21.04.2010, 22:03:19
Go to the top of the page
+Quote Post
MateuszS
post
Post #8





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Niestety jest to dla mnie czarna magia co napisałeś, te interfejsy, klasy abstrakcyjne, nigdy nie mogłem załapać o co w nich chodzi, nie sądziłem że mi się prędko przydadzą.
Poza tym wywala błędy z tym namespace, nieoczekiwany string, no i czy ten system waliduje chociaż pod kątem tagów HTML w polach? Bo widzę setki dziwnych rzeczy ale nigdy bym nie zgadł że to ma coś wspólnego z walidacją.


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Poza tym wywala błędy z tym namespace
Widocznie masz PHP w wersji poniżej 5.3 - ale przestrzenie nazw można stąd wywalić na dobrą sprawę.
Cytat
no i czy ten system waliduje chociaż pod kątem tagów HTML w polach
Nie, dlaczego miałby to robić? A jeżeli jest Ci takie coś potrzebne wystarczy zrobić sobie walidator, który będzie sprawdzać coś takiego.

Cytat
Niestety jest to dla mnie czarna magia co napisałeś, te interfejsy, klasy abstrakcyjne, nigdy nie mogłem załapać o co w nich chodzi, nie sądziłem że mi się prędko przydadzą.
W takim razie radzę sobie na chwilę obecną darować jakiekolwiek pisanie i skupić się wyłącznie na teorii i możliwościach języka (swoją drogą bardzo ograniczonych pod względem OOP).

Ten post edytował Crozin 21.04.2010, 20:18:39
Go to the top of the page
+Quote Post
MateuszS
post
Post #10





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Cytat
Widocznie masz PHP w wersji poniżej 5.3 - ale przestrzenie nazw można stąd wywalić na dobrą sprawę.

No mam PHP 5.2.6.

Cytat
Nie, dlaczego miałby to robić? A jeżeli jest Ci takie coś potrzebne wystarczy zrobić sobie walidator, który będzie sprawdzać coś takiego.

No ja przecież napisałem skrypt który ma za zadanie walidować dane z formularza, myślałem że twój też to robi tongue.gif Bo o to mi głównie chodzi, napisać dobrą klasę która sprawdza takie rzeczy

Cytat
W takim razie radzę sobie na chwilę obecną darować jakiekolwiek pisanie i skupić się wyłącznie na teorii i możliwościach języka (swoją drogą bardzo ograniczonych pod względem OOP).

Nie no wiesz, logiczne że najpierw teoria, ale w mojej książce są zaledwie 2 strony o interfejsach i brak jakichkolwiek przykładów praktycznego zastosowania, stąd mój brak wiedzy na ten temat... a podobno najlepsza jest praktyka.

Wiele osób radzi żebym zajął się jakimś frameworkiem, ale co mi po frameworku jak wg was nie umiem napisać najprostrzej rzeczy w OOP



--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
No ja przecież napisałem skrypt który ma za zadanie walidować dane z formularza, myślałem że twój też to robi
Jeżeli mu rozkażesz to i to będzie Ci robić tylko dlaczego miałby z automatu blokować elementy HTMLa w tych polach? Że niby nie mogę w treści wątku wpisać <p> to akapit w HTMLu? Takimi rzeczami jak wyświetlanie wprowadzonych przez użytkowników danych (by uniemożliwić wstawienie własnego kodu HTML itp.) też trzeba się zająć - ale to nie jest robota dla walidatora.
Cytat
Nie no wiesz, logiczne że najpierw teoria, ale w mojej książce są zaledwie 2 strony o interfejsach
No na dobrą sprawę to o interfejsach nie ma się co wiele rozpisywać. Nie jest to jakaś skomplikowana część języka.
Cytat
i brak jakichkolwiek przykładów praktycznego zastosowania
No to to co Ci podałem możesz potraktować jako konkretny przykład zastosowania interfejsów - metoda \Crozin\Validation\Validator::addValidator() wymaga by drugi parametr był obiektem implementującym interfejs \Crozin\Validation\Validatable. Wymaga tego ponieważ później wykonywane są operacje na tych walidatorach (a dokładnie to wywoływanie metody isValid()). Dzięki temu mamy pewność, że to co przekazujemy jako walidator jest ów walidatorem, albo przynajmniej potrafi się zachowywać jak takowy.

Cytat
Wiele osób radzi żebym zajął się jakimś frameworkiem, ale co mi po frameworku jak wg was nie umiem napisać najprostrzej rzeczy w OOP
Również uważam, że branie się za FW w momencie gdy nie zna się nawet elementów języka jest głupotą.
Go to the top of the page
+Quote Post
MateuszS
post
Post #12





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Cytat
Również uważam, że branie się za FW w momencie gdy nie zna się nawet elementów języka jest głupotą.


No nie przesadzajmy, podstawy pewne mam


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Crozin
post
Post #13





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
No nie przesadzajmy, podstawy pewne mam
Tego negować nie będę, ale jeżeli nie znasz elementów języka (interfejsy, klasy abstrakcyjne, przestrzenie nazw, Type Hinting (nie wiem jaka można by to po polsku nazwać) itp) nie wspominając o podstawowych paradygmatach obiektówki (abstrakcja bytów, polimorfizm, hermetyzacja itp.) to ciężko jest mówić o tym, że ma się opanowane podstawowe założenia programowania obiektowego.

Zacznij od manuala - przebrnij przez paskudnych kilkanaście stron teorii - potem polecałbym poczytać nieco artykułów dotyczących OOP (nie koniecznie nastawionego na PHP, gdyż te idee są wspólne dla wszystkich języków obiektowych).
Czasami dobrze też zacząć pisanie od końca czyli od interfejsu (chodzi tutaj o to w jaki sposób będziesz danego narzędzia używać (czyli to co jest w liniach 192 - 199 mojego kodu)). Tworzysz sobie jak najbardziej skomplikowane przykłady użycia danego narzędzia, a dopiero potem bierzesz się za implementację.
Go to the top of the page
+Quote Post
zzeus
post
Post #14





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

Ostrzeżenie: (0%)
-----


@Crozin mógłbyś rzucić kilka linków do artykułów które dotyczą OOP ? Chodzi mi o artykuły które są sprawdzone i dobre według Ciebie.


--------------------
Go to the top of the page
+Quote Post
marcio
post
Post #15





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Cytat
@Crozin mógłbyś rzucić kilka linków do artykułów które dotyczą OOP ? Chodzi mi o artykuły które są sprawdzone i dobre według Ciebie.

Nie ma zlych artykulow sa tylko dobre i bardzo dobre :]
Zamiast czytania art'ow polecam manual zeby zapoznac sie z kontrukcjami OOP w PHP 5-6.
Potem sciagnac jakis gotowy Fw/klasy przeanalizowac je i probowac pisac samemu od jakis prostych systemow.
Dawac kod na forum i pytac co mozna lepiej napisac.
Kursy zabardzo nie pomagaja przyklady ktore zawieraja sa troche kulawe jak i te zawarte w ksiazkach jednak do teorii sa OK.

P.S @MateuszS zajzyj tutaj: Temat: klasaphp Validation masz tam az 3 klasy do tego

Ten post edytował marcio 22.04.2010, 13:52:54


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
MateuszS
post
Post #16





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Crozin, to że nie użyłem w mojej klasie np. dziedziczenia to nie znaczy że nie wiem jak to używać smile.gif
marcio, potiwerdzam, kursy nie mają dobrych przykładów, w książki też trochę zainwestowałem ale chyba nie bardzo się opłacało. Manual może i jest dobry, ale trzeba znać perfekcyjnie angielski ja puki co jeszcze się kształcę w tym kierunku.



--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Crozin
post
Post #17





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Crozin, to że nie użyłem w mojej klasie np. dziedziczenia to nie znaczy że nie wiem jak to używać
Wszystkie te moje wywody opieram na:
Cytat
Niestety jest to dla mnie czarna magia co napisałeś, te interfejsy, klasy abstrakcyjne, nigdy nie mogłem załapać o co w nich chodzi, nie sądziłem że mi się prędko przydadzą.


Cytat
Manual może i jest dobry, ale trzeba znać perfekcyjnie angielski ja puki co jeszcze się kształcę w tym kierunku.
A bzdura...! Wcale nie musisz znać dobrze tego angielskiego. Fakt - pewnie co jakiś czas trafi Ci się słówko, którego nie znasz, ale jeżeli jako tako potrafisz czytać w tym języku to nie widzę powodów, dla których nie miałbyś właśnie z tego źródła korzystać.
Go to the top of the page
+Quote Post
MateuszS
post
Post #18





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


No a jak wy się OOP uczyliście? Też mieliście takie problemy? ;/ Może ponaśladuję tongue.gif


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
marcio
post
Post #19





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Cytat(MateuszS @ 22.04.2010, 20:31:53 ) *
No a jak wy się OOP uczyliście? Też mieliście takie problemy? ;/ Może ponaśladuję tongue.gif

Ja czytalem kursy,ksiazki i zadawalem glupie pytania i brali mnie za debila i tlumaczyli jak debilowi az wkoncu posciagalem pare fw, roznych klas poprobowalem sam cos pokodzic az weszlo mi w krew oop.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
MateuszS
post
Post #20





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


He czyli głupie pytania kluczem do sukcesu biggrin.gif To kolejne:

Jaka jest praktyczna różnica pomiędzy dziedziczeniem a wywołaniem obiektu klasy w klasie, przykład:

  1. class a
  2. {
  3. public $c = 1;
  4. }
  5. class b extends a
  6. {
  7. function bla()
  8. {
  9. echo $this->c;
  10. }
  11.  
  12. }


a

  1. class a
  2. {
  3. public $aa=1;
  4. }
  5.  
  6. class b
  7. {
  8. function __construct()
  9. {
  10. $this->ob = new a;
  11. echo $this->ob->aa;
  12. }
  13. }


Ten post edytował MateuszS 22.04.2010, 20:59:13


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 19:10