Avatar billede gimo Nybegynder
19. august 2009 - 17:32 Der er 7 kommentarer

PHP OOP: 'T_VARIABLE'

Halløjsa alle eksperter.
Jeg står i det problem, at jeg er ret ny til OOP i PHP. Jeg har derfor kastet mig ud i et mindre projekt, og allerede inden for den første time, er jeg løbet ind i problemer.
Når jeg forsøger at afvikle min kode (se neden for), får jeg følgende fejlmeddelse:

Parse error: parse error, expecting `T_VARIABLE' in C:\Programmer\wamp\www\gCMS\includes\class_mysql.php on line 4

Hvis jeg derimod sætter mine variabler inden for min funktion (hvilket jeg egentlig helst vil, da variablerne ikke behøves at blive sat, medmindre funktionen bliver kørt), får jeg følgende meddelse:

Parse error: parse error in C:\Programmer\wamp\www\gCMS\includes\class_mysql.php on line 6

Jeg har disse 3 filer:

-------------------------------------

index.php

<?php include('includes/class_mysql.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1" />
<title>Testing index</title>
</head>
<body>
<br /> <br />
<?php
    $db = new Mysql();
    $db->connect();
?>
</body>
</html>


-------------------------------------

includes/class_mysql.php:

<?php
include('config.php');
class Mysql {
      private db_host = $db_host; 
    private db_user = $db_user; 
    private db_pass = $db_pass; 
    private db_name = $db_name;
    public function Connect() {
        if(!$this->conn) {
                    $myconn = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
                    echo "SUCCES: connected to MySQL";
                    if($myconn) {
                        $selectdb = mysql_select_db($this->db_name, $myconn);
                        echo "SUCCES: connected to database";
                        if($selectdb) {
                            $this->$conn = true;
                            echo "SUCCES: database IS connected. conn is sat";
                        } else { echo "FEJL: selectdb blev ikke sat"; }
                    } else { echo "FEJL: myconn blev ikke sat"; }
                } else { echo "FEJL: this->conn blev ikke sat"; }
    }
}
?>

-------------------------------------

includes/config.php

<?php
    /* MySQL host: */
    $db_host = "localhost";
    /* MySQL username: */
    $db_user = "root";
    /* MySQL password: */
    $db_pass = "";
    /* MySQL database: */
    $db_name = "gCMS";
    echo "Config loaded!";
?>

-------------------------------------

Jeg håber inderligt, at i kan hjælpe mig! Jeg virkelig ikke finde nogle fejl!

//GiMo
Avatar billede repox Seniormester
19. august 2009 - 23:53 #1
Det er fordi det du skriver ikke giver mening.
Din syntaks er helt forkert, du har ikke styr på dine scopes og der må absolut også være noget output før dit HTML med det echo du laver i config.php.

En mere rigtig måde at gøre det på ville være noget ala:
<?php
    include('config.php');
    class Mysql
    {
        private $db_host;
        private $db_user;
        private $db_pass;
        private $db_name;
        private $conn;
       
        public function __construct($db_host, $db_user, $db_pass, $db_name)
        {
            $this->db_host = $db_host;
            $this->db_user = $db_user;
            $this->db_pass = $db_pass;
            $this->db_name = $db_name;
        }
       
        public function Connect()
        {
       
            if(!$this->conn)
            {
                $myconn = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
                echo "SUCCES: connected to MySQL";
               
                if($myconn)
                {
                    $selectdb = mysql_select_db($this->db_name, $myconn);
                    echo "SUCCES: connected to database";
                    if($selectdb)
                    {
                        $this->$conn = true;
                        echo "SUCCES: database IS connected. conn is sat";
                    }
                    else
                    {
                        echo "FEJL: selectdb blev ikke sat";
                    }
                }
                else
                {
                    echo "FEJL: myconn blev ikke sat";
                }
            }
            else
            {
                echo "FEJL: this->conn blev ikke sat";
            }
        }
    }
?>

og så skrive
<?php
    $db = new Mysql($db_host, $db_user, $db_pass, $db_name);
    $db->connect();
?>

Men... altså... Al det echo'en ud - hvad skal det til for?
Avatar billede gimo Nybegynder
20. august 2009 - 14:20 #2
Kan du uddybe "Din syntaks er helt forkert, du har ikke styr på dine scopes og der må absolut også være noget output før dit HTML med det echo du laver i config.php." lidt bedre? Jeg forstår ikke helt hvad det er du mener :-)!

Det er sådan set første gang jeg er kastet mig ud i noget OOP, så derfor smed jeg en masse echo's ind for at kunne fejlfinde (og se hvor langt mit script nåede, før det evt. crashede).

Jeg havde sådan set bare tænkt mig, at jeg i min index fl bare skulle skrive "connect" også connectede den til MySQL via de info's der står i config'en, så jeg behøves at skrive login oplysninger hver gang jeg vil connecte til MySQL. Men kan man ikke bruge variabler man har includet i sin class?

Men mange tak for hjælpen, indtil videre! Jeg vil tage et kig på det igen, men svar hellere end gerne :-)!!!
Avatar billede repox Seniormester
20. august 2009 - 21:49 #3
For mig virker det som om det er en af dine første gange med PHP - når jeg skriver at din syntaks er forkert mener jeg at det du skriver er ganske enkelt forkert.


    class Mysql
    {
        private db_host = $db_host;
        ...
    }

Her har du to fejl; en syntaks fejl og en manglende forståelse for dit variabel scope. Scopet er det område hvori en variabel er tilgængelig; Variabler er kun tilgængelige i den kontekst de er oprettet i. En grundlæggende variabel i scriptet er kun tilgængeligt i scriptet selv (og inkluderede filer). Variabler oprettet i en funktion, er kun tilgængelig i funktionen. Variabler oprettet i en klasse er kun tilgængelig i klassen.
Superglobale variabler og konstanter er ikke omfattet af de begrænsninger.


    class Mysql
    {
        private $db_host;
        ...
    }


Ovenstående er korrekt syntaks. Hvordan du får indhold i din private $db_host variabel er jo så op til din fremgangsmetode. Hvis det er fordi at variablet skal sættes automatisk vil jeg mene det mest naturlige var at bruge en klasses konstruktør til formålet - eventuelt sammen med superglobale variabler eller konstanter.

I forbindelse med din config; du laver en echo hvor du skriver "Config loaded!" ud. Den streng skrives før din DOCTYPE erklæring i HTML'en - det giver valideringsproblemer.
Avatar billede gimo Nybegynder
20. august 2009 - 22:36 #4
Tusind tak for den fyldestgørende forklaring repox! Jeg er ikke helt ny i PHP, men jeg har åbenlyst misset nogle af grundbegreberne. Tak!

Jeg har dog et enkelt spørgsmål tilbage. Hvis jeg vil undgå at hente MySQL oplysninger i min index.php fil,

(new Mysql($db_host, $db_user, $db_pass, $db_name);)

hvordan kan jeg så integrere mine variabler (fra config.php) ind i en variabel i min klasse (Rent hypotetisk. Jeg har omkodet det hele, da jeg godt kan se, at det er latterligt lavet.)? Altså $this->db_host = <indholdet af min variabel $db_host i config-php>, så jeg kan benytte config oplysningerne i min klasse?
Avatar billede repox Seniormester
22. august 2009 - 11:31 #5
Personligt har jeg selv gjort det at jeg bruger konstanter til den slags.
min config.inc.php indeholder en række af konstanter som jeg bruger hen over hele min applikation.
Så det er den vej jeg ville gå.

<?php

    define("DB_HOST", "localhost");
    define("DB_USER", "root");
    define("DB_PASS", "mitkodeord");
    define("DB_NAME", "gCMS");

?>

og så i klassen...

<?php
    include('config.php');
    class Mysql
    {
        private $db_host;
        private $db_user;
        private $db_pass;
        private $db_name;
        private $conn;
     
        public function __construct()
        {
            $this->db_host = DB_HOST;
            $this->db_user = DB_USER;
            $this->db_pass = DB_PASS;
            $this->db_name = DB_NAME;
        }
     
        public function Connect()
        {
            ...
Avatar billede gimo Nybegynder
22. august 2009 - 11:39 #6
Ahaaa! Tusind tak repox!
Avatar billede repox Seniormester
22. august 2009 - 20:34 #7
Jamen, selv tak, da.
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