Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Używanie konstruktora jako zwykłej metody
Forum PHP.pl > Forum > PHP > Object-oriented programming
BORG
Cześć, mam do was pytanie - czy mogę używać konstruktora jak normalnej metody? Chodzi mi o to, czy mogę np. wewnątrz metody użyć czegoś takiego: $this->__construct()?
Crozin
PHP umożliwia coś takiego, ale jest to bardzo zła praktyka.

1. Po co miałbyś robić coś takiego?
2. Wrzuć kod który chcesz wywołać do osobnej metody i wywołaj ją z konstruktora jak i ze swojej innej metody.
BORG
Otóż chciałbym napisać metodę, która pobierałaby danę z bazyb danych i następnie przypisywała je do obiektu. W moim wypadku wygląda to tak:
  1. function dbread($id)
  2. {
  3. $i = mysql_query("SELECT * FROM `items` WHERE `id`='$id'");
  4. $this->__construct($i['name'],$i['class'],$i['price'],$i['mindmg'],$i['maxdmg'],$i['hand'],$i['type']);
  5. }

czemu miałaby to być zła praktyka?
Crozin
1. Konstruktor jest w OOP dosyć specyficzną metodą. W PHP co prawda nie istnieją jakieś rygorystyczne "przepisy" odnośnie jego stosowania, ale nie zdziwiłbym się, gdyby używanie konstruktora jak zwykłej metody z czasem zaczęło skutkować jakimiś dziwnymi zachowaniami. Ponadto takie używanie konstruktora sprawiłoby, że Twój kod straciłby na czytelności.
2. Nic nie stoi na przeszkodzie aby zapisać to w taki sposób:
  1. public function __construct($a, $b, $c, $d) {
  2. $this->init($a, $b, $c, $d);
  3. }
  4.  
  5. public function readdb($id) {
  6. ...
  7. $this->init($row['a'], $row['b'], $row['c'], $row['d']);
  8. }
  9.  
  10. private function init($a, $b, $c, $d) {
  11. ...
  12. }
Nie tracisz absolutnie niczego, a Twój kod zaczyna być "standardowy" i czytelny.
3. Jednak, w ogóle metoda readdb() w żadnym wypadku nie powinna znaleźć się w tej kasie. Powinna być w innym obiekcie i zwracać (tworzyć) nowy obiekt:
  1. class Article {
  2. private $title;
  3. private $content;
  4.  
  5. public function __construct($title, $content) {
  6. ...
  7. }
  8.  
  9. gettery/setter
  10. }
  11.  
  12. class ArticleDao {
  13. private $conn;
  14.  
  15. public function __construct(PDO $conn) {
  16. $this->conn = $conn;
  17. }
  18.  
  19. public function findOne($pk) {
  20. ...
  21.  
  22. return new Article($row['title'], $row['content']);
  23. }
  24. }
4. Widzę, że ten kod ma służyć jako mapper rekordów z bazy danych na obiekty, tj. ORM. Od razu radzę skorzystać z gotowego, dobrego narzędzia (np. Doctrine), a nie pisać to samemu. ORM jest jednak dosyć rozbudowanym i skomplikowanym narzędziem, a zbudowanie którego potrzeba ogromu czasu, który można lepiej spożytkować.
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.