Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasy php 4 dziedziczenie?
Forum PHP.pl > Forum > PHP
pirat
dobra napisalem sobie pliczek klasa.class.php
  1. <?php
  2.  
  3. class db {
  4.  
  5. var $db;
  6.  
  7.  
  8.  
  9. function db() {
  10.  
  11. $db[user] = &#092;"tws\";
  12. $db[haslo] = &#092;"haslo\";
  13. $db[host] = &#092;"localhost\";
  14. $db[dbname] = &#092;"tws\";
  15.  
  16. $this->db = mysql_pconnect ($db[host], $db[user], $db[haslo]);
  17.  
  18.  mysql_select_db ($db[dbname], $this->db);
  19.  
  20.  
  21.  
  22. }
  23. }
  24.  
  25. ?>

Teraz napisalem druga klase i chcialbym z niej dostac sie do $this->db z pierwszej
  1. <?php
  2.  
  3. class html extends db {
  4.  
  5.  
  6. var $html;
  7.  
  8.  
  9.  
  10. function html() { //konstruktor clasy
  11.  
  12. $query_content = &#092;"SELECT * FROM strony\"; //jakies zapytanko
  13. $this->szablon = mysql_query($query_content, $this->db); // TU CHCE SIE DOSTAC DO MOJEGO THISA Z POPRZEDNIEJ KLASY i cos mi nie wychodzi
  14.  
  15. $linia = mysql_fetch_array($this->szablon); //never mind
  16. $this->szablon = $linia; //never mind
  17.  
  18. }
  19.  
  20.  
  21. ?>

co wy na to snitch.gif
crash
Yy, nie wiem czy to pomoże bo obiektówki zacząłem się uczyć dopiero od PHP5: w konstruktorze klasy html:
  1. <?php
  2. parent::db();
  3. ?>
NuLL
W czwórce to nie przejdzie :/

Pehap nie skstruuje obietktu kiedy ty go potrzebujesz. Klasa ktora dziedzicyz posaida tylko własności i metody tej od której dziedziczy - nic więcej.
DeyV
chyba w żadnym języku coś takiego by nie przeszło. A jednak nie stanowi to żadnego problemu.
Dlaczego?
Ponieważ zarówno w php4 jak i php5 należy wymuszać wywołanie konstruktora z klasy po której się dziedziczy, jeżeli pojawi się taka potrzeba.

A więc w takim przypadku należałoby zrobić tak:
  1. <?php
  2. class html extends db {
  3. function html() { //konstruktor clasy
  4. { 
  5. parent::db();
  6. }
  7. }
  8. ?>


w php5 jest o tyle łatwiej, że nie musisz pamietać nazwy kostruktora, można bowiem wykorzystać stałą nazwę konstruktora __construct()

Wtedy taki zapis wyglądałby tak.
  1. <?php
  2.  
  3. class Db {
  4.  function __construct() {
  5. // cos tam
  6.  }
  7. }
  8. class Html extends Db {
  9.  function __construct() {
  10.  parent::__construct();
  11.  }
  12. }
  13. ?>
bela
Cytat(DeyV @ 2005-01-16 13:25:25)
w php5 jest o tyle łatwiej, że nie musisz pamietać nazwy kostruktora, można bowiem wykorzystać stałą nazwę konstruktora __construct()

ale przeciez piszesz extends klasa więc widzisz jak się nazywa konstruktor winksmiley.jpg
pirat
ooo o to chodziło dzięki
Kod
DeyV


Tego mi brakowało :] i tak przy okazji mam pytanie czy wg. was wielkim grzechem jest używanie zmiennych globalnych, bo zawsze staram sie ten problem omijac ale chyba doszedlem do takiej zlozonosci ze nie bede mogl ich uniknac, ale to cos na osobny post, jeszcze sie zastanowie i napisze ;]

dziex
bela
zmienne globalne są nieobiektowe smile.gif dzieki nim masz dostep wszedzie, a oop zaklada ekapsulacje, zawsze da się ominąć globale, np przez singleton czy stałe
DeyV
Cytat
ale przeciez piszesz extends klasa więc widzisz jak się nazywa konstruktor


A wyobraź sobie taką sytuację. (w php4)
  1. <?php
  2.  
  3. class Db {
  4. function Db() {
  5. // construkctor
  6. }
  7. }
  8.  
  9. class Article extends Db {
  10.  // brak własnego konstruktora
  11. }
  12.  
  13. class News extends Article {
  14. function News(){
  15.  parent:: questionmark.gifquestionmark.gif () // jaki konstruktor parenta wywołać? 
  16.  // a jeśli ktoś kiedyś dopisze konstruktor dla Artile, który w rzeczywistości będz
  17. e lepsiejszy;) niż ten z Db ? 
  18.  
  19. }
  20. }
  21.  
  22. ?>


To jest bardzo prosty przykład, ale wydaje mi się, że dosyć dobrze pokazuje zaletę korzystania z __construct() w php5.
A nawet w php4 można to zasymulować, dzięki zapisowi
  1. <?php
  2.  
  3. class test {
  4. function test() { //construktor
  5. }
  6. function __construct{
  7. selt::test();
  8. // albo 
  9. $this->test();  // nie pamietam, jak powino być
  10. // w każdym razie możliwość wywołania konstruktora przez __construct()
  11. }
  12. }
  13. ?>
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.