Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Używanie konstruktora jako zwykłej metody
BORG
post
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2006

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


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()?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
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%)
-----


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.
Go to the top of the page
+Quote Post
BORG
post
Post #3





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 18.12.2006

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


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?
Go to the top of the page
+Quote Post
Crozin
post
Post #4





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

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


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ć.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.08.2025 - 06:52