2012-06-14 20 views
5

He recibido respuestas mixtas sobre esto dependiendo de lo que haya leído,¿Cómo se definen las propiedades de una clase en php?

He definido una clase con 2 funciones.

quiero ambas funciones tengan acceso a las credenciales de DB

Actualmente, este código no funciona a menos que copiar y pegar las variables en cada función.

¿Qué estoy haciendo mal aquí?

<?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); 
         } 
      } 
?> 

Respuesta

10

Este bloque:

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

Debería venir antes que el function(), no dentro de él; pero aún dentro de la definición class.

Y es una buena forma de agregar una visibilidad explícita; privado a comenzar con:

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

Entonces, las funciones se refieren a ellos como:

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

Lo ideal es que quieren tener esas credenciales para ser aprobadas en el constructor:

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; 
} 

Aún más idealmente, aprenda sobre PDO

+0

e idealmente, esos 'var's deben ser reemplazados con' private' ... esto no es PHP4 más. Posiblemente 'estático' también, teniendo en cuenta que el valor está codificado de forma fija (por lo que cada instancia tiene el mismo valor). – cHao

+0

@cHao gracias por el recordatorio, agregó :) –

+0

@Jack Reescribí mi código para que se vea así, –

3

Para acceder propiedad de objeto es necesario utilizar $ this-> nombre_propiedad código de Clase

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

iría así:

<?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

estilo Código lado, es necesario definir las variables externas los métodos de la clase, pero aún dentro de la clase. Algo así como:

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

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

¿Debo volver a hacer referencia a la variable dentro de cada función? Primero enumero var $ username en la raíz de la clase, entonces tengo que tener $ this-> username cuando no puedo volver a llamar? –

+0

Sí, eso es más o menos. Está definiendo la variable en el alcance de la clase, por lo que usa '$ this-> username' para acceder a ella. 'var' se marcó en desuso durante un tiempo, la forma" correcta "de definir estas variables es hacer' public $ username', que es equivalente a 'var $ username'. – Crontab

2

usted tiene que utilizar las variables fuera de la función y el uso de los construct y destruct funciones, que van a garantizar que la conexión será abierto y cerrado correctamente

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

Es una buena práctica asigna propiedades y métodos de clase a su alcance, que puede ser "público", "protegido" o "privado", en lugar de usar "var". Además, las propiedades de clase se asignan dentro de la clase pero fuera de cualquier función (a.k.a. "método"). Aquí está tu clase refactorizado:

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

variables sólo están disponibles para ser llamados en el ámbito que se crean en

Si crea una variable en una función que sólo se puede utilizar en esa función, pero el. Cuanto más alto lo defina en la escalera, más disponible estará.

Global Pública privada Función

Cuestiones relacionadas