Avatar billede mxs Nybegynder
10. april 2004 - 14:26 Der er 56 kommentarer og
1 løsning

Hvordan kan jeg kalde en var fra en klasse ned i anden klasse?

Hey eksperter:)

Jeg har et spørgsmål som lyder:

Hvordan kan jeg hente en variabel som jeg har gemt i en anden klasse ned i en anden klasse og bruge den i min anden klasses funktion?

Her er min kode som jeg arbejder med:

<?php

class DB {

var $user;
var $database;

    function DB($user, $database) {
        $this->database = $database;
        $this->user = $user;
    }


    function MySQL() {

        $conn = mysql_connect("localhost","$this->user");
        mysql_select_db("$this->database",$conn);

    }

}//Class DB lukkes



class Sitewatcher {


var $url;
var $ip;
var $tid;



    function Sitewatcher() {
        $this->url = $_SERVER['PHP_SELF'];
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->tid = time();


    }

    function show_hits() {

        $taeller_db_hits = mysql_fetch_array(mysql_query("select count(ip) as tael_ip from where ip = '$this->ip' and url = '$this->url' "));
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");
    }
       


    function updateDB(){

        mysql_query("insert into site_watcher (ip, tid, url) values('$this->ip' , '$this->tid' , '$this->url') ");
        print("databasen er blevet opdateret");
    }


} //Class Sitewatcher lukkes



$a = new DB("root","site_watcher");
$a-> MySQL();
$b = new Sitewatcher();
$b-> updateDB();
$b-> show_hits();

?>

Som i kan se laver min constructor DB en $this->user og en $this->database.
Det er $this->database som jeg gerne vil bruge i min updateDB sql sætning som ligger i klassen, sitewatcher, men hvordan henter jeg variblen ned? Kan det overhovedet lade sig gøre?
Avatar billede dennismp Nybegynder
10. april 2004 - 14:38 #1
Jeg er ikke sikker på at jeg forstår dig.. Men updateDB skal jo have db-klassen, det kan du enten gøre ved at give den som parameter.

$b->updateDB($a); // $a = new DB(..);

og så bruger du bare $a i updateDB().

Alternativ kan du give den med når du opretter Sitewatcher.
$b = new Sitewatcher($a);
så retter du i klassen, så din konstruktør ser således ud:
class Sitewatcher {
var $url;
var $ip;
var $tid;
var $db;


    function Sitewatcher($_db) {
        $this->url = $_SERVER['PHP_SELF'];
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->tid = time();
        $this->db = $_db;
    }

    function show_hits() {
        nu kan du så bruge: $this->db til sql'en

    }
       


    function updateDB(){
        mysql_query("insert into site_watcher (ip, tid, url) values('$this->ip' , '$this->tid' , '$this->url') ");
        print("databasen er blevet opdateret");
    }
} //Class Sitewatcher lukkes
Avatar billede mxs Nybegynder
10. april 2004 - 14:45 #2
Undsyld mester, men jeg er ikke lige hel sikker på at jeg forstår dig:) Kan du ikke skære det mere ud i pap? Har sat og jongleret med den her kode i lidt tid nu og jeg føler at koden spiller mig et pus?!
Avatar billede mxs Nybegynder
10. april 2004 - 14:48 #3
Hmm jeg har gjort sådan her:

<?php

class DB {

var $user;
var $database;

    function DB($user, $database) {
        $this->database = $database;
        $this->user = $user;
    }


    function MySQL() {

        $conn = mysql_connect("localhost","$this->user");
        mysql_select_db("$this->database",$conn);

    }

}//Class DB lukkes



class Sitewatcher {


var $url;
var $ip;
var $tid;
var $database;




    function Sitewatcher() {
        $this->url = $_SERVER['PHP_SELF'];
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->tid = time();

    }

    function show_hits($database) {

        $taeller_db_hits = mysql_fetch_array(mysql_query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' "));
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");

    }
       


    function updateDB($database){

        mysql_query("insert into $database (ip, tid, url) values('$this->ip' , '$this->tid' , '$this->url') ");

    }


} //Class Sitewatcher lukkes



$a = new DB("root","site_watcher");
$a-> MySQL();
print("Databasen som er i brug:<b> ". $a->database."</b><br>");
$b = new Sitewatcher();
$b-> updateDB($a->database);
$b-> show_hits($a->database);

?>


Var det sådan du mente?
Avatar billede dennismp Nybegynder
10. april 2004 - 14:52 #4
Ja, men

$b-> updateDB($a->database);
$b-> show_hits($a->database);

ville jeg nok lave om til

$b-> updateDB($a);
$b-> show_hits($a);
Avatar billede dennismp Nybegynder
10. april 2004 - 14:54 #5
og hvis man er doven, så kan man jo:
<?
$a = new DB("root","site_watcher");
$a-> MySQL();
print("Databasen som er i brug:<b> ". $a->database."</b><br>");
$b = new Sitewatcher($a);
$b-> updateDB();
$b-> show_hits();

Det kræver jo så, at din sitewatcher-klasse gemme $a som en klasse.variabel, det var det jeg forsøgte at gøre før :)

?>
Avatar billede mxs Nybegynder
10. april 2004 - 14:56 #6
:D har lige gjort det som du sagde med hvis man var doven:) Men hvad mener du med at jeg skal skal lave den om til $a?
Avatar billede dennismp Nybegynder
10. april 2004 - 15:09 #7
Som dit scritp er nu, så skal du ikke lave det om. Men hvis du vil pakke alle mysql-funktionerne ind i DB-klassen, så bør sitewatcher you bruge denne.

F.eks.

<?php

class DBResult {
  var $res;
  function DBResult($res) {
    $this->res = $res;
  }

  function fetchRow() {
      return mysql_fetch_row($this->res);
  }
}

class DB {

var $user;
var $database;

    function DB($user, $database) {
        $this->database = $database;
        $this->user = $user;
    }


    function MySQL() {
        $conn = mysql_connect("localhost","$this->user");
        mysql_select_db("$this->database",$conn);
    }

    function query($sql) {
      $res = mysql_query($sql) or die(..);
      return new DBResult($res);
    }
}//Class DB lukkes

Nu er så alle dine mysql-pakket ind i DB klassen (og DBResult) og du kan i princippet skifte til en anden database, uden at skulle ændre andre steder en lige DB-klassen.

Din sitewatcher klasse skal jo så gøre brug af dette:

class ..

    function show_hits($database) {
        $res = $database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' ");
        $taeller_db_hits = $res->fetchRow();
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");

    }
     

Alt koden er utestet - men håber du kan se ideen.
Avatar billede mxs Nybegynder
10. april 2004 - 15:19 #8
Aha jeg tror at jeg fatter!! Du har lavet en klasse mere hvor jeg kan sætte mit sql ind?
Avatar billede dennismp Nybegynder
10. april 2004 - 15:26 #9
Jeg har lavet en klasse som er resultatet af en query. Og så har jeg lavet en metode ekstra i DB som kan udføre et sql statement og returnere et resultat-objekt.
Avatar billede mxs Nybegynder
10. april 2004 - 15:32 #10
Jeg har prøvet at sætte din stykke kode ind, men følgende fejl:

Parse error: parse error in c:\phpdev\www\kodning\class\site_watcher\site_watcher.php on line 39

Her er min kode nu (Jeg har lavet en funktion mere som hedder DoSetup()) Som jeg kalder til sidst for at gøre koden mere overskulig.

<?php

class DBresult {

var $res;

    function DBresult($res) {
        $this->res = $res;

    }

    function fetchRow() {
        return mysql_fetch_row($this->res);

    }

}


class DB {

var $user;
var $database;

    function DB($user, $database) {
        $this->database = $database;
        $this->user = $user;
    }


    function MySQL() {

        $conn = mysql_connect("localhost","$this->user");
        mysql_select_db("$this->database",$conn);

    }

    function query($sql) {
        $res = mysql_query($sql) or die(..);
        return new DBResult($res);

    }


}//Class DB lukkes



class Sitewatcher {


var $url;
var $ip;
var $tid;
var $database;




    function Sitewatcher($database) {
        $this->url = $_SERVER['PHP_SELF'];
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->tid = time();
        $this->database = $database;

    }





  function show_hits($database) {
        $res = $database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' ");
        $taeller_db_hits = $res->fetchRow();
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");

    }
     



    function updateDB(){

        mysql_query("insert into $this->database (ip, tid, url) values('$this->ip' , '$this->tid' , '$this->url') ");

    }

    function DoSetup() {
        Sitewatcher::updateDB();
        Sitewatcher::show_hits();
    }


} //Class Sitewatcher lukkes



$a = new DB("root","site_watcher");
$a-> MySQL();
$b = new Sitewatcher($a->database);
$b-> DoSetup();
?>
Avatar billede dennismp Nybegynder
10. april 2004 - 15:48 #11
$res = mysql_query($sql) or die(..);

skal ændres til ngoet fornuftigt :-)

fx:
$res = mysql_query($sql) or die("SQL-error: ".mysql_error());
Avatar billede mxs Nybegynder
10. april 2004 - 15:52 #12
Hehe jaaa det kunne ko være en idé:p

Nu kommer den med fejlene:

Warning: Missing argument 1 for show_hits() in c:\phpdev\www\kodning\class\site_watcher\site_watcher.php on line 65

Fatal error: Call to a member function on a non-object in c:\phpdev\www\kodning\class\site_watcher\site_watcher.php on line 67

Det er de her to linjer:

    function show_hits($database) {

        $res = $database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' ");

Forstår ikke lige hvad $database->query gør?
Avatar billede mxs Nybegynder
10. april 2004 - 15:56 #13
Hehe glemmer lige at sætte databasen i show_hits($database) Så nu før jeg kun denne fejl

Fatal error: Call to a member function on a non-object in c:\phpdev\www\kodning\class\site_watcher\site_watcher.php on line 67
Avatar billede dennismp Nybegynder
10. april 2004 - 15:56 #14
da du allerede i din constructor har en kopi af din database klasse, behøver du ikke at sende dem med som paramter til  show_hits().
Avatar billede dennismp Nybegynder
10. april 2004 - 15:57 #15
Prøv istedet med

  function show_hits() {
        $res = $this->database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' ");
        $taeller_db_hits = $res->fetchRow();
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");
    }

du skal bare kalde methoden med
$obj->show_hits();
Avatar billede mxs Nybegynder
10. april 2004 - 16:01 #16
Nu ser min kode sådan her ud:

<?php

class DBresult {

var $res;

    function DBresult($res) {
        $this->res = $res;

    }

    function fetchRow() {
        return mysql_fetch_row($this->res);

    }

}


class DB {

var $user;
var $database;

    function DB($user, $database) {
        $this->database = $database;
        $this->user = $user;
    }


    function MySQL() {

        $conn = mysql_connect("localhost","$this->user");
        mysql_select_db("$this->database",$conn);

    }

    function query($sql) {
        $res = mysql_query($sql) or die(mysql_error());
        return new DBResult($res);

    }


}//Class DB lukkes



class Sitewatcher {


var $url;
var $ip;
var $tid;
var $database;

    function Sitewatcher($database) {

        $this->url = $_SERVER['PHP_SELF'];
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->tid = time();
        $this->database = $database;

    }

    function show_hits($database) {

        $res = $this->database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url' ");
        $taeller_db_hits = $res->fetchRow();
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");

    }
     
    function updateDB(){

        mysql_query("insert into $this->database (ip, tid, url) values('$this->ip' , '$this->tid' , '$this->url') ");

    }




} //Class Sitewatcher lukkes



$a = new DB("root","site_watcher");
$a-> MySQL();
$b = new Sitewatcher($a->database);
$b-> updateDB();
$obj-> show_hits();
?>

Men nu kommer den med følgende fejl:

Fatal error: Call to a member function on a non-object in c:\phpdev\www\kodning\class\site_watcher\site_watcher.php on line 92
Avatar billede dennismp Nybegynder
10. april 2004 - 16:28 #17
Du skal give hele db-klassen, ikke selve resource-id'et
sp erstat:
$b = new Sitewatcher($a->database);
med
$b = new Sitewatcher($a);
Avatar billede mxs Nybegynder
10. april 2004 - 16:35 #18
Nu kommer den bare og melder at der er en fejl i min sql. Sys altså det her er for rodet!!
Avatar billede mxs Nybegynder
10. april 2004 - 16:38 #19
Altså jeg forstår godt den klasse du har lavet som hedder DBresult, men jeg forstår bare ikke hvordan du kalder de to funktioner!? Altså jeg regner med at det sker i:

    function show_hits() {

        $res = $this->database->query("select count(ip) as tael_ip from $database where ip = '$this->ip' and url = '$this->url'");
        $taeller_db_hits = $res->fetchRow();
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");

    }

Men du kalder den bare med $this->database->query (Kalder du så query i DBresult? Fatter ikke lige hel hvordan det hænger sammen.
Avatar billede mxs Nybegynder
10. april 2004 - 16:43 #20
Nu kalder jeg mine klasser sådan her:

$a = new DB("root","site_watcher");
$a-> MySQL();
$b = new Sitewatcher($a);
$b-> updateDB();
$b-> show_hits();

Jeg har rettet det der med at den kommer med en sql fejl.

Men nu kommer den med fejlen:

Table 'site_watcher.object' doesn't exist
Avatar billede dennismp Nybegynder
10. april 2004 - 16:52 #21
Jeg lidt ked af, hvis jeg har forvirret dig mere end hjulpet :-|.

Lad os se på:
$this->database->query(..);

$this->database er din $db-klasse (den blev tildelt i konstruktøren; "$this->database = $database;")..  Så nu har vi fat i den. På denne klasse kalder du så methoden query(..) (Dvs vi arbjeder "i" DB-klassen).

Da query() returnerer et DBResult objektet, bliver $res tildelt dette objekt.
$taeller_db_hits = $res->fetchRow();
henter så en række fra resultatet.(Dvs DBResult->fetchRow() kaldes).

prøv evt med denne linje istedet for den gamle:
$res = $this->database->query("select count(ip) as tael_ip from tabel-navn where ip = '{$this->ip}' and url = '{$this->url}'");

.. erstat tabel-navn med hvad din tabel hedder
Avatar billede mxs Nybegynder
10. april 2004 - 16:56 #22
Fatter det godt nu, men jeg troede ikke bare lige man kunne hente methoder fra en anden klasse bare lige sådan!!
Avatar billede mxs Nybegynder
10. april 2004 - 17:00 #23
Nu har jeg prøvet at sætte $res til det du har skrevet. Nu kommer den ikke og melder fejl, men den opdaterer ikke databasen:)

Min kode er nu:

<?php

class DBresult {

var $res;

    function DBresult($res) {
        $this->res = $res;

    }

    function fetchRow() {
        return mysql_fetch_row($this->res);

    }

}


class DB {

var $user;
var $database;

    function DB($user, $database) {
        $this->database = $database;
        $this->user = $user;
    }


    function MySQL() {

        $conn = mysql_connect("localhost","$this->user");
        mysql_select_db("$this->database",$conn);

    }

    function query($sql) {
        $res = mysql_query("$sql") or die(mysql_error());
        return new DBResult($res);

    }


}//Class DB lukkes



class Sitewatcher {


var $url;
var $ip;
var $tid;
var $database;

    function Sitewatcher($database) {

        $this->url = $_SERVER['PHP_SELF'];
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->tid = time();
        $this->database = $database;

    }

    function show_hits() {

$res = $this->database->query("select count(ip) as tael_ip from site_watcher where ip = '{$this->ip}' and url = '{$this->url}'");

        $taeller_db_hits = $res->fetchRow();
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");

    }
     
    function updateDB(){

        mysql_query("insert into $this->database (ip, tid, url) values('$this->ip' , '$this->tid' , '$this->url') ");

    }




} //Class Sitewatcher lukkes



$a = new DB("root","site_watcher");
$a-> MySQL();
$b = new Sitewatcher($a);
$b-> updateDB();
$b-> show_hits();
?>
Avatar billede dennismp Nybegynder
10. april 2004 - 17:01 #24
Jeg håber du kan se det smarte i at alle database-funktionerne er gemt i DB og DBResult - og det ikke kun er til besvær :-)
Avatar billede dennismp Nybegynder
10. april 2004 - 17:03 #25
Denne method i sitewatcher skal også bruge DB-klassen:

    function updateDB(){
        $this->database->query("insert into site_watcher (ip, tid, url) values('{$this->ip]' , '{$this->tid}' , '{$this->url}') ");
    }
Avatar billede mxs Nybegynder
10. april 2004 - 17:03 #26
Jamen jeg kan godt se det smarte. Det er bare måden man kalder de methods på. Det er dem jeg ikke lige kan se det smarte i:) Hvorfor skriver du fx
$this->database->query(...); Altså jeg kan ikke se hvorfor $this->database skal med!!
Avatar billede mxs Nybegynder
10. april 2004 - 17:05 #27
:)

Nu opdaterer med show_hits() Virker ikke. Den tæller ikke rækkerne og spytter dem ud!!
Avatar billede dennismp Nybegynder
10. april 2004 - 17:08 #28
$this->database->query("insert into site_watcher (ip, tid, url) values('{$this->ip]' , '{$this->tid}' , '{$this->url}') ");

skal være:

$this->database->query("insert into site_watcher (ip, tid, url) values('{$this->ip}' , '{$this->tid}' , '{$this->url}') ");
Avatar billede mxs Nybegynder
10. april 2004 - 17:08 #29
Vil det sige at når jeg gør sådan her $this->database så hopper den op i DB og begynder at arbejde der?
Avatar billede dennismp Nybegynder
10. april 2004 - 17:09 #30
Hvis du stadig har problemer:
Prøv at tjek din database og se om updateDB virker i første omgang (om der er nogle rækker i tabellen).
Avatar billede mxs Nybegynder
10. april 2004 - 17:12 #31
updateDB virker:) Den opdaterer databasen hvergang jeg reloader siden.

Men show_hits virker ikke lige!! Eller det gør den faktisk. Den skriver bare: "Du har set denne side gange" Uden at vise tallene!
Avatar billede dennismp Nybegynder
10. april 2004 - 17:12 #32
Ja. Du har DB gemt i sitewatcher-objektet. Så får at få fat i det (inde fra site_watcher) så skal du skrive $this->database. Nu skal du så bare kalde hvad du har lyst til af metoder i DB.. Hvis du syntes det er lidt langt, kan du sagents gøre:

$d = $this->database;  // kopiere din DB-objekt over i $d
$d->query("SELECT ..");

det vil være det samme som (borset fra kopieringen)
$this->database->query("SELECT ..");
Avatar billede dennismp Nybegynder
10. april 2004 - 17:15 #33
Det kan jo så skyldes flere ting.. Lad os se på det :-)

    function show_hits() {
$res = $this->database->query("select count(ip) as tael_ip from site_watcher where ip = '{$this->ip}' and url = '{$this->url}'");

    $taeller_db_hits = $res->fetchRow();
print "<pre>Taeller_db_hits indeholder:<br>";
print_r($taeller_db_hits); // Skriver indeholdet ud af $taeller_db_hits;
print "</pre>";
        $tael = $taeller_db_hits['tael_ip'];
        print("<br>Du har set denne side $tael gange");
    }

Nu skriver den lidt ekstra output ud, hvad står der?
Avatar billede mxs Nybegynder
10. april 2004 - 17:17 #34
Altså det vil sige når jeg gør sådan her

$a = new DB("root","site_watcher");
$b = new Sitewatcher($a);

Så lader jeg DB ind i Sitewatcher

Derefter kalder $this->database->query(...)
Avatar billede mxs Nybegynder
10. april 2004 - 17:20 #35
:)

NU skriver den

Taeller_db_hits indeholder:Array
(
    [0] => 7
)

Og den tæller op hver gang jeg opdaterer!!
Avatar billede dennismp Nybegynder
10. april 2004 - 17:20 #36
Jep

>>$b = new Sitewatcher($a);
kalder jo metoden her:

  function Sitewatcher($database) {
        $this->url = $_SERVER['PHP_SELF'];
        $this->ip = $_SERVER['REMOTE_ADDR'];
        $this->tid = time();
        $this->database = $database;
    }

og den sidste linje tildeler $this->database med det argument du giver den. Derfor skriver du så i de andre metoder $this->database for at få fat i "databasen"
Avatar billede dennismp Nybegynder
10. april 2004 - 17:22 #37
Prøv med:

    function show_hits() {
$res = $this->database->query("select count(ip) as tael_ip from site_watcher where ip = '{$this->ip}' and url = '{$this->url}'");

    $taeller_db_hits = $res->fetchRow();
        $tael = $taeller_db_hits[0];
        print("<br>Du har set denne side $tael gange");
    }

Det du så før er indholdet af rækken fra databasen. Som du kan se er nøglen 0 og værdien 7.. Så jeg har bare erstattet
$tael = $taeller_db_hits['tael_ip'];
med
$tael = $taeller_db_hits[0];

Nu burde det da virke :)
Avatar billede mxs Nybegynder
10. april 2004 - 17:27 #38
:) Nu virker den!!

Men det vil sige at $this->database->query fortæller at jeg vil bruge $this->database som database?
Avatar billede dennismp Nybegynder
10. april 2004 - 17:30 #39
Ja, og ->query() er den method du bruger på databasen.
Avatar billede mxs Nybegynder
10. april 2004 - 17:37 #40
Puha min tankegang holder ikke lige til det her. Altså jeg forstår det godt men så igen så sys jeg det virker lidt pløret!!

Undskyld jeg spørger, men hvordan finder query() så ud af at den skal bruge $this->database som database? er det fordi at den har jeg sat i DB klassen via mothoden MySQL()?
Avatar billede dennismp Nybegynder
10. april 2004 - 18:00 #41
Du tænker ikke objekt-orienteret..

Lad mig forsøge at lave et eksempel: Forstil dig at klasser en små sorte kasser.

Vi har en kasse database. Den ved nogle ting (fx. hvordan kommer den i kontakt med database) .. og du kan trykke på een knap der hedder query.
Hvad der sker i klassen er du ligeglad med, du vil bare evt have noget output. query bruger måske nogle interne ting i kassen, og i princippet kan du lave query helt om uden at du skal rette andre steder..

Man for at trykke på query skal du have kassen, så de interne ting der er i kassen følger altid med når du bruger query. (Fx. der er svært at trykke tænd på en radio, hvis du ikke har en radio :) )

Nu har du en anden kasse, sitewatcher. Den kan ligeledes nogle ting.

Det er også en kasse.. hvordan den virker er vi egenlig også ligeglad med. Men hvis vi kigger nærmere på den, så ved vi, at denne kasse bruger en anden kasse..

Forstil dig, at du er til fest. Der sidder en dj (lad os være lidt firkantet og kalde ham en musik-kasse. :)) .. Når du vil høre en sang, så er du egenlig kun interesseret i at høre musikken.. Om han trykker tænd på sin radio og spiller musikken derfra, er ligemeget.. Men nu da han har en radio, så kan han. Så denne kasse består af bl.a en anden kasse, radioen.

Det er sådan set nøjagtigt det samme der sker i din kode.. Sitewatcher har en "database-kasse" som den kan bruge.

Ligemeget hvem der har en radio kan vedkommende bruge den.. Det svarer til:
LIgemeget hvilken klasse der har en $database-objekt, så kan de bruge den.

Jeg aner ikke om det hjælper på forståelsen, men det var da muntert at prøve :)
Avatar billede mxs Nybegynder
10. april 2004 - 18:17 #42
Altså lad mig se om jeg forstår det:

jeg tager den bagfra

new Sitewatcher($a);

jeg finder $a

$a = new DB("root","site_watcher");

da Sitewatcher ser sådan ud Sitewatcher($database) og $this->database = $database og visa versa så er

$a = DB("root","site_watcher")

Nu er database sådan
$database = DB("root" , "site_watcher");

og da $this->database = $database så kan jeg godt skrive

$this->database->query(..) da jeg på den måde har inkluderet $DB() i Sitewatcher

Altså jeg har puttet databasen-kassen "DB" ind i Site-kassen "Sitewatcher" ved at sige Sitewatcher($a); og kan derfor kalde query(..) ved at bruge $this->database->query da $this->database bliver lavet i DB klassen?

Ved ikke lige om det første dur, da du sikker tolker det forkert:) Men det jeg vil frem til er at det kan finde hinanden fordi du har inkluderet $a i new Sitewatcher.
Avatar billede dennismp Nybegynder
10. april 2004 - 18:25 #43
Hvis jeg forstår dig korrekt, så ser det rigtigt ud.
Avatar billede mxs Nybegynder
10. april 2004 - 18:33 #44
Hehe forstår det godt nu!! Altså i constructoren Sitewatcher er der skrevet

$this->database = $database;

Det har jeg fjernet

Jeg troede det var den som blev kaldt når man skrev $this->database->query(..);
Avatar billede mxs Nybegynder
10. april 2004 - 18:41 #45
Ved ikke lige hvad jeg skrev der, men jeg mener ikke noget af det=)

Nu vil jeg så gerne vide hvorfor du skriver {$this->url} hvis jeg prøver uden {} så kommer den med en table object.site_watcher doesnt exist
Avatar billede dennismp Nybegynder
10. april 2004 - 20:12 #46
hvis du prøver:
print $this;

så vil den skrive object.

Så hvis man ikke skriver {} så vil php kun evaluerer $this, og så kommer der til at stå Object->url.. For at undgå det kan man enten bruge
..."insert into site_watcher (ip, tid, url) values('{$this->ip}' , ...
elller:
..."insert into site_watcher (ip, tid, url) values('" . $this->ip . "' , ...

Forestil dig at du gerne vil skrive
<-etnavn->
det kan du gøre med
print "<-$navn->";

Her skal php bedømme hvad variablen hedder. Det kan jo i princippet hedde
$navn,
$navn-,
$navn->.

Man har så sagt, at variabler er normalt kun karakter, så den første gælder (den stopper når den første ikke-karakter). Dette jo bare et problem, ved $this->url, så der hjælper {} php med at finde ud af hvad der er variable-navn og hvad der er tekst.

Det samme gælder også for f.x $str = "$_GET['id']"; vil ikke virke efter hensigten, med mindre man bruger {}.

Håber det gav mening :)
Avatar billede mxs Nybegynder
10. april 2004 - 20:55 #47
Jamen det gjorde det. Jeg har læst lidt om klasser og ret mig hvis jeg tager fejl

en funktion som er deffineret i en klasse kaldes for methods
en var (object) som kaldes for data members

Det vil altså sige at this-> er en object og $this->database er en object som pejer på en member?
Avatar billede dennismp Nybegynder
10. april 2004 - 21:39 #48
$this->database er en datamembers (for at bruge dine ord, der er desværre mange navne for den slags)
der er intet problem i at en datamember er et andet objekt.
Avatar billede dennismp Nybegynder
11. april 2004 - 11:12 #49
Antager at snakken er slut :)
Avatar billede mxs Nybegynder
11. april 2004 - 13:12 #50
Heh grunden til at jeg ikke skrev tilbage var jeg at skulle ned til min bedstemor og bedstefar og spise og det blev sent før jeg kom hjem igen.

Jeg har ledt lidt på nettet men jeg kan ikke finde ud af hvad en klasse hedder før man laver

new xx;

Og hvad hedder det når man så laver

new xx;

Laver man så bare en ny klasse? Er det så her det bliver Objekt Orienteret? for jeg går ud fra at hvis man bare laver en klasse fx

class Hello {

var $hej;

    function Hej($hej) {
        $this->hej = $hej;
        print $this->hej;
    }
}

Så er det ikke OO.
Eller er det hel forkert?
:) Jeg føler faktisk at jeg har lært noget her og at jeg kan huske det dagen efter!! Dennismp du skal mange tak!!
Avatar billede dennismp Nybegynder
11. april 2004 - 13:22 #51
class Hello {
...
}.

Nu har du en klasse.

$x = new hello();

nu har du et objekt ($x) du kan arbejde med, som er en instans af klassen Hello.

Du kan sige at klassen er ligesom skabelonen og objekterne er det du arbejder (normalt) med.

OO er ligeså meget en tankegang/struktur end bestemte kommandoer i dit script. Hvis samler funktioner der arbejder i samme område (fx tilgang til en database) i en klasse og får nogle fordele heraf - så er det OO. Men OO er ikke firkantet defineret, så det er svært at sige præcist hvornår noget bliver OO.
Avatar billede mxs Nybegynder
11. april 2004 - 13:28 #52
Ok det vil altså sige at man laver en skabelon som man så laver til et objekt som man kan arbejde med. Det forstår jeg godt!

Det vil sige at selvom man laver en klasse så behøves det ikke være OO (Selvom man jo laver et object)?
Avatar billede dennismp Nybegynder
11. april 2004 - 13:40 #53
Ja i princippet.. (Nogle vil måske argumentere for at det er OO, bare grimt. Andre vil sige at det ikke er OO)..

F.eks
<?php
class HerErMinHjemmeSide {
  function doStuff() {
    .. her laves så alt.
    ... 400 linjer senere
    print "</html>";
  }
}
$obj = new HerErMinHjemmeside();
$obj->doStuff();

Een klasse er ikke nok til at din kode er OO. Men hvis du generelt bruger klasser og forstår at udnytte dem så er det OO.

OO er ideen at man knytter logisk sammenhørende funktionalitet sammen i klasser.

Abstrakt eksempel igen :-)

Forstil dig legoklodser.. Der har du jo nogle forskellige klodser du kan arbejde med. Du kan lave et hus - der har du en dør..

Men i princippet kan du også bruge ler til at lave huset. Du tager en klump og former den. Men det bliver temmelig svært at tage døren ud og genbruge den andre steder, da den hænger sammen med resten af huset (måske har dit andet lerhus ikke samme størrelse, den er måske 0.4 cm højere). Lego har jo de dersens dupper som gør at du kan skifte ud som du har lyst til, da de har samme størrelse og gør een ting.. (Ler er een stor masse, legoklodser er mange små, der hver har en funktion.)

OO er at dele et problem (fx at lave en hjemmeside) op i små klodser som du så kan bygge en løsning til problemet.
Avatar billede mxs Nybegynder
11. april 2004 - 13:47 #54
Hehe abstakte eksempler, men gode!! Jeg forstår det godt!!
Altså jeg har set personer som fx bare laver en klasse og siger at det er OOP, men jeg kan ikke rigtig sige til dem at det er det altså ikke når jeg ikke en gang selv kan finde ud af at lave klasser osv. Men jeg er da på vej til at forstå det nu:)
Så vil jeg sige at den stykke kode du har hjulpet mig med er lidt mere OOP end bare HerErMinHjemmeSide klasse=)
Avatar billede dennismp Nybegynder
11. april 2004 - 14:03 #55
Jep, velkommen til OO :-)

mange af de nye ting i PHP5 er lige netop OO-delen - så det er nok noget man ser mere og mere til (kunne man håbe). Du kan jo lige lege med det du har lært, så kan vi altid skrive en 50 indlæg om et andet emne :-)
Avatar billede mxs Nybegynder
11. april 2004 - 14:05 #56
Hehe

Jeg leger lidt videre =)

Tak for introduktionen mester!!
Avatar billede mxs Nybegynder
11. juli 2005 - 19:24 #57
dennismp, jeg kan se hvor uvidende jeg har været. Ikke alene fatter jeg ikke min uvidenhed i et så simpelt projekt, men jeg vil dog sige at OOP delen i php gav mig et spark i den rigtige retning. Jeg arbejder lige nu med C++, OOP, mutex og tråde, og har skiftet min Win platform ud med en permanent gentoo linux, jaaa jeg nørder meget rundt.
Jeg har i dag meget, MEGET stor respekt for OOP delen. Min intense lege med OOP i C++ har dog fået mig til at snøfte lidt når jeg nu prøver mig frem med php. Mangler stadig meget, kan jeg se.
Men jeg vil lige sige tak for din hjælp. Det har været sjovt at læse dette gamle indlæg igennem og se at man er blevet mere moden på flere områder.
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