2012-06-14 33 views
5

Tôi đã nhận được các câu trả lời hỗn hợp về điều này tùy thuộc vào những gì tôi đọc,Làm cách nào để xác định các thuộc tính cho một lớp trong php?

Tôi đã xác định một lớp có 2 chức năng.

Tôi muốn cả hai chức năng được tiếp cận với các thông tin DB

Hiện nay, mã này không hoạt động trừ khi tôi Sao chép và dán các biến vào từng chức năng.

Tôi đang làm gì sai ở đây?

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

Trả lời

10

khối này:

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

Nên đến trước function(), không phải bên trong nó; nhưng vẫn nằm trong định nghĩa class.

Và đó là hình thức tốt để thêm hiển thị rõ ràng; tin để bắt đầu với:

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

Sau đó, các chức năng gọi chúng là:

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

Lý tưởng nhất, bạn sẽ muốn có những thông tin quan trọng được thông qua bằng các nhà xây dựng:

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

Thậm chí lý tưởng hơn, hãy tìm hiểu về PDO

+0

Và lý tưởng, những 'var's nên được thay thế với 'private' ... đây không phải là PHP4 nữa. Có thể 'tĩnh' quá, xem xét mã hóa của giá trị cứng (vì vậy mỗi trường hợp có cùng giá trị). – cHao

+0

@cHao cảm ơn lời nhắc, đã thêm :) –

+0

@Jack Tôi viết lại mã của mình để trông như thế này, –

3

Để truy cập vào tài sản đối tượng bạn cần phải sử dụng $ this-> property_name

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

Mã lớp sẽ đi như thế này:

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

Tạo kiểu mã sang một bên, bạn cần phải xác định các biến của mình bên ngoài các phương pháp lớp học nhưng vẫn nằm trong lớp. Một cái gì đó như:

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

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

Vì vậy, tôi cần phải tham khảo biến một lần nữa bên trong mỗi chức năng? Đầu tiên tôi liệt kê var $ username trong lớp gốc, sau đó tôi phải có $ this-> username bất cứ lúc nào tôi không thể gọi lại cho nó? –

+0

Vâng, gần như vậy. Bạn đang định nghĩa biến ở phạm vi lớp, vì vậy bạn sử dụng '$ this-> username' để truy cập nó. 'var' được đánh dấu không được chấp nhận trong một thời gian, cách" thích hợp "để định nghĩa các biến này thực sự là' public $ username', tương đương với 'var $ username'. – Crontab

2

bạn phải sử dụng các biến bên ngoài chức năng và sử dụng các chức năng constructdestruct, họ sẽ đảm bảo cho bạn những kết nối sẽ được mở và đóng cửa đúng

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

Đó là thực hành tốt để gán thuộc tính lớp và phương thức phạm vi của chúng, có thể là "công khai", "được bảo vệ" hoặc "riêng tư" thay vì sử dụng "var". Ngoài ra, các thuộc tính lớp được gán trong lớp nhưng bên ngoài bất kỳ hàm nào (phương thức a.k.a. ""). Dưới đây là lớp học của bạn 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

biến chỉ có sẵn được gọi là trong phạm vi họ được tạo ra trong

Nếu bạn tạo một biến trong một chức năng nó chỉ có thể được sử dụng trong chức năng đó, nhưng. cao hơn bạn xác định nó trên các bậc thang càng có nhiều nó có sẵn để.

toàn cầu Công Private Chức năng

Các vấn đề liên quan