Avatar billede anderseiler Nybegynder
13. december 2008 - 11:38 Der er 17 kommentarer og
1 løsning

methods overskriver hinanden i extended klasse

Hey

Jeg har et problem med en extended class. Jeg har:

abstract class start {
  public $db;
  public function __construct() {
      $this->db = mysql_connect_lala;
  }
}

hvor jeg i min start klasse laver en forbindelse til databasen når den initialiseres. Så har jeg en anden klasse..

class login extends main {
  public function __construct($u, $p) {
      $q = $this->db->query(check login sql query snask);
  }
}

når jeg så kører min login class, så er det somom, at dens __construct OVERSKRIVER den __construct i min start klasse. Jeg kan i hvert fald ikke få adgang til  min $this->db variabel..

Nogen der kender et trick, så den __construct i min login klasse ikke disabler den i min start klasse?

tak :)
Avatar billede moddi100 Seniormester
13. december 2008 - 12:33 #1
Prøv dette:

abstract class start {
  public function start(){

  }
}


class login extends main {
  public function main($u, $p) {
  }
}
Avatar billede anderseiler Nybegynder
13. december 2008 - 12:54 #2
Det giver tilsyneladende desværre samme resultat :(
Avatar billede moddi100 Seniormester
13. december 2008 - 13:12 #3
Hvad udskriver dette? Ingenting?

class login extends main {
  public function __construct($u, $p) {
      var_dump($this->db);
  }
}
Avatar billede anderseiler Nybegynder
13. december 2008 - 13:40 #4
Den gir bare NULL
Avatar billede moddi100 Seniormester
13. december 2008 - 13:43 #5
Og du er sikker på at $this->db tildeles en værdi? Prøv dette.

abstract class start {
  public $db;
  public function __construct() {
      $this->db = 'Noget Tekst';
  }
}

class login extends main {
  public function __construct($u, $p) {
      var_dump($this->db);
  }
}
Avatar billede anderseiler Nybegynder
13. december 2008 - 13:46 #6
Lad mig sige sådan, hvis jeg sletter min __construct i login klassen, og laver f.eks.

public function doLogin($u, $p)

og bruger min $this->db deri, så virker det perfekt.

Jeg har som sagt en mistanke om, at den __construct jeg har i min login klasse, simpelthen sætter den __construct i min startklasse ud af spil, og dermed bliver $db aldrig tildelt en værdi.

Kan man ikke på en måde sige til den __construct i min login klasse, at den skal køre videre på __construct fra min start klasse? Eller i hvert fald ikke overskrive den..!
Avatar billede moddi100 Seniormester
13. december 2008 - 13:47 #7
Synes bare det lyder mærkeligt at den overskriver __construct. Har jeg ikke oplevet før. (Har ikke adgang til PHP5 lige nu)
Avatar billede anderseiler Nybegynder
13. december 2008 - 13:50 #8
Når jeg extender main ind i min login klasse, så giver det på en måde mening? Rent logisk i mit hoved i hvert fald :)

Men jeg ved ikke, om den overskriver den som sådan. Den bliver i hvert fald ikke eksekveret, når der er en __construct i min login klasse også.

Igen - mon der er en måde, hvorpå man kan fortælle __construct i min login klasse, at den lige skal lade __construct i main klassen køre først?
Avatar billede moddi100 Seniormester
13. december 2008 - 13:50 #9
Kan ikke lige komme på det. Men et alternativ ville være at omdøbe __construct i din login-class noget andet og så selv kalde den med $start->db->nyt_navn(). Jeg kan dog godt forstå hvis du ikke bryder dig om den løsning, men kan pt ikke komme på noget bedre
Avatar billede moddi100 Seniormester
13. december 2008 - 13:53 #10
Hvis du siger, at den også overskriver hvis du omdøber __construct i start-classen til start() og __construct i login-classen til main() altså så de hedder det samme som classen, burde den ikke overskrive.
Avatar billede anderseiler Nybegynder
13. december 2008 - 13:56 #11
Teknisk set jo, for at kalde en method for samme navn som klassen er i php5 det samme som at skrive __construct..

Jeg har testet, det virker heller ikke. :(
Avatar billede moddi100 Seniormester
13. december 2008 - 13:59 #12
Det er vel egentlig logisk nok. Når du extender den første classe, kalder du jo som sådan aldrig dens constructor. Du overskriver jo dens constructor. Så løsningen må være, at du når du opretter et objekt,

1) Du omdøber din anden constructor og kalder den efter at objektet er lavet

eller

2) Du bibeholder din anden constructor og udvider den, så den også gør det samme som den første
Avatar billede erikjacobsen Ekspert
13. december 2008 - 15:10 #13
Det står altsammen her: http://dk2.php.net/__construct
Avatar billede tjens Nybegynder
13. december 2008 - 16:10 #14
parent::__construct();
som første linie i din login's __construct skulle sørge for at superklassens constructer kode bliver kørt.

Eksempel:
class A {
    public $myType;
    public $baseType;

  function __construct() {
        $this->myType = 'typeA';
        $this->baseType = 'baseA';
  }
}

class B extends A {
    public $Bdata;
    function __construct()  {
        parent::__construct();
        $this->myType = 'typeB';
        $this->Bdata = "NewB";
    }
}

$a = new A;
echo '<p>A.myType:  '.$a->myType.'<br>A.baseType: '.$a->baseType.'</p>';

$b = new B;
echo '<p>B.myType:  '.$b->myType.'<br>B.baseType: '.$b->baseType.'<br>B.data: '.$b->Bdata.'</p>';

Giver følgende output:
A.myType:  typeA
A.baseType: baseA

B.myType:  typeB
B.baseType: baseA
B.data:    NewB

(I øvrigt forstår jeg ikke hvorfor første klasse hedder start, mens anden klasse extender main)
Avatar billede anderseiler Nybegynder
13. december 2008 - 16:20 #15
erikjakobsen og tjens, I har jo begge ret - og det virker endda.. I burde næsten dele point hvis det er OK?

tjens.. Den extender main fordi jeg er en knold og blander tingene sammen. Der burde selvfølgelig stå extends start i mit eksempel! :)
Avatar billede tjens Nybegynder
13. december 2008 - 16:51 #16
Godt du fik løst problemet.
Avatar billede erikjacobsen Ekspert
13. december 2008 - 20:01 #17
Ingen point til mig, tak.
Avatar billede anderseiler Nybegynder
13. december 2008 - 20:54 #18
Helt ok, 200 til tjensen så :)

Tak for hjælpen gutter ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester