2012-06-14 10 views
5

Otrzymałem różne odpowiedzi w zależności od tego, co przeczytałem,Jak zdefiniować właściwości klasy w php?

Zdefiniowałem klasę z 2 funkcjami.

Chcę obie funkcje, aby mieć dostęp do danych uwierzytelniających DB

Obecnie ten kod nie działa, chyba że skopiowanie i wklejenie zmiennych do każdej funkcji.

Co ja tu robię źle?

<?php 
class database { 
function connect() { 
var $username="my_username"; 
var $servername="localhost"; 
var $database="my_DB"; 
var $password="An_Awesome_Password"; 
var $con; 
    $con = mysql_connect($servername,$username,$password); 

    if (!$con) { 
    die('Could not connect: ' . mysql_error()); 
       } 
        } 

function disconnect() { 
    $con = mysql_connect($servername,$username,$password); 

    if (!$con) { 
    die('Could not connect: ' . mysql_error()); 
       } 
    mysql_close($con); 
         } 
      } 
?> 

Odpowiedz

10

Blok:

var $username="my_username"; 
var $servername="localhost"; 
var $database="my_DB"; 
var $password="An_Awesome_Password"; 
var $con; 

Powinien pojawić się przed function(), nie wewnątrz niego; ale nadal w definicji class.

Dobrze jest dodać wyraźną widoczność; prywatny zacząć:

class database { 
    private $username="my_username"; 
    private $servername="localhost"; 
    // etc. etc. 

Następnie funkcje odnoszą się do nich:

$this->username; 
$this->con; 
etc. 

Idealnie będzie chciał mieć te poświadczenia mają być przekazywane w przez konstruktora:

private $servername; 
private $database; 
private $username; 
private $password; 
private $con; 

function __construct($host, $user, $password, $dbname) 
{ 
    $this->servername = $host; 
    $this->username = $user; 
    $this->password = $password; 
    $this->database = $dbname; 
} 

Jeszcze lepiej, ucz się około PDO

+0

i idealnie te 'var's należy zastąpić' private' ... to nie jest już PHP4. Prawdopodobnie również "statyczny", biorąc pod uwagę zakodowane wartości (więc każda instancja ma tę samą wartość). – cHao

+0

@CHao dzięki za przypomnienie, dodano :) –

+0

@Jack Przepisuję mój kod tak, aby wyglądał tak, –

3

Aby uzyskać dostęp do właściwości obiektu trzeba użyć $ this-> property_name

$this->con = mysql_connect($this->servername,$this->username,$this->password); 

kod klasy pójdzie tak:

<?php 
class database { 
    var $username="my_username"; 
    var $servername="localhost"; 
    var $database="my_DB"; 
    var $password="An_Awesome_Password"; 
    var $con; 

    function connect() { 

     $this->con = mysql_connect($this->servername,$this->username,$this->password); 

     if (!$this->con) { 
      die('Could not connect: ' . mysql_error()); 
     } 
    } 

    function disconnect() { 
     $this->con = mysql_connect($this->servername,$this->username,$this->password); 

     if (!$this->con) { 
      die('Could not connect: ' . mysql_error()); 
     } 
     mysql_close($this->con); 
    } 
} 
?> 
3

Kodowanie na bok, musisz zdefiniować zmienne poza metod klasowych, ale nadal w klasie. Coś jak:

class database { 
    var $username = "my_username"; 
    // etc. 

    function connect() { 
     // connect code 
     // $this->username == "my_username" 
    } 
} 
+0

Muszę więc ponownie odwołać się do zmiennej w każdej funkcji? Najpierw wpisuję var $ username w katalogu głównym klasy, a potem muszę mieć $ this-> username, kiedy nie mogę do niej oddzwonić? –

+0

Tak, to mniej więcej tak. Definiując zmienną w zakresie klasy, użyjesz '$ this-> username', aby uzyskać do niej dostęp. 'var' został przez jakiś czas oznaczony jako przestarzały," właściwym "sposobem definiowania tych zmiennych jest w rzeczywistości wykonanie' public $ username', która jest równoważna 'var $ username'. – Crontab

2

trzeba użyć zmiennych poza funkcją i korzystać z funkcji construct i destruct, będą one zapewnić Państwu połączenie będzie otwarte i zamknięte prawidłowo

class database { 
    private $username = 'username'; 
    private $servername = "localhost"; 
    private $database = "my_DB"; 
    private $password = "An_Awesome_Password"; 
    private $conId; 

    public function __construct(){ 
     $con = mysql_connect($this->servername, $this->username, $this->password); 
     $this->conId = $con; 
     //.......... 
    } 


    public function __destruct(){ 
     mysql_close($this->conId); 
    } 
} 
1

Jest to dobra praktyka, aby przypisz właściwości i metody klasy ich zakres, który może być "publiczny", "chroniony" lub "prywatny" zamiast "var". Ponadto właściwości klasy są przypisywane w klasie, ale poza jakąkolwiek funkcją (a.k.a. "metoda"). Oto Twoja klasa refactored:

class database { 
    private $username="my_username"; 
    private $servername="localhost"; 
    private $database="my_DB"; 
    private $password="An_Awesome_Password"; 
    private $con; 

    public function connect() { 
     if (!$this->con) { 
      $this->con = mysql_connect(
        $this->servername, $this->username, $this->password); 

      if (!$this->con) { 
       die('Could not connect: ' . mysql_error()); 
      } 
     } 
    } 

    public function disconnect() { 
     if ($this->con) { 
      mysql_close($this->con); 
     } 
    } 
} 
0

Zmienne są dostępne tylko na miano w zakresie ich tworzenia w

Jeśli utworzyć zmienną w funkcji mogą być używane tylko w tej funkcji, ale. wyżej definiujesz go na drabinie, im bardziej jest on dostępny.

Globalny Public Prywatna Funkcja

Powiązane problemy