2012-06-28 26 views
5

tôi đang tìm kiếm thông qua các tài liệu PHP và thấy một số ý kiến ​​mà một biến được khởi tạo bên ngoài của nhà xây dựng của một lớp, tương tự như sau:biến khởi tạo bên ngoài của PHP constructor

classMyClass { 
    private $count = 0; 

    public function __construct() { 
     //Do stuff 
    } 
} 

Trong Objects PHP, Patterns, và Thực hành, tác giả đề xuất chỉ sử dụng cấu trúc cho việc khởi tạo thuộc tính, trì hoãn bất kỳ việc nâng hạng nặng hoặc logic phức tạp nào lên các phương pháp chuyên ngành. Hướng dẫn này (ví dụ nhanh mà tôi tìm thấy trên Google) cũng khuyên bạn nên sử dụng các hàm tạo để khởi tạo các thuộc tính: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php.

Tại sao bạn muốn khởi tạo biến bên ngoài hàm tạo? Đây có phải chỉ là mã hóa cẩu thả, hay có lý do để làm điều gì đó như thế này? Tôi phải nói rằng cho đến gần đây, tôi đã khởi tạo các giá trị mặc định bên ngoài hàm khởi tạo, và dường như không có bất kỳ lợi thế có lập trình nào của một cách so với cách khác.

+2

Đó chỉ là thực hành lập trình tốt. – Brian

+0

khi bạn chỉ muốn khởi tạo các biến đơn giản, nó khá rõ ràng khi thực hiện bên ngoài hàm tạo, để khởi tạo phức tạp hơn sử dụng hàm tạo –

+0

Ví dụ bạn đã đăng đang cung cấp giá trị mặc định cho biến số đếm $. Một ý tưởng hay là cung cấp một giá trị mặc định - theo cách này bạn sẽ biết những gì cần kiểm tra để tìm hiểu xem việc gán trong constructor của bạn hay ở nơi khác đã thành công. – blearn

Trả lời

5

Khi bạn khởi tạo biến bên ngoài hàm tạo, nó phải được khởi tạo dưới dạng hằng số. Bạn không thể thực hiện bất kỳ thao tác nào để khởi tạo nó. Do đó, giá trị ban đầu của thành viên đó thực sự là một phần của chữ ký lớp.

Ví dụ, đây là hợp lệ:

private $var = $othervar; 
private $var = func(); 

Bạn có thể làm điều đó trong các nhà xây dựng là tốt, nhưng nó sẽ là một chút tiết hơn và thêm một số lộn xộn để các nhà xây dựng trừ khi có một số loại của logic đang xảy ra.

+0

Vì vậy, không có lý do gì để * không * khởi tạo một biến bên ngoài của hàm tạo nếu chúng được gán một giá trị đã biết, chẳng hạn như một chuỗi? – Nate

2

thêm một bình luận hơn là một câu trả lời, nhưng xin hãy giải thích ở đây một chút:

Kể từ khi nó được khuyến khích để sử dụng nhà thầu chỉ khởi tạo bất động sản,

Ai nói này và tại sao? Tôi giả định chỉ liên quan đến một cái gì đó khác với định nghĩa thuộc tính với các giá trị mặc định.


Một phần câu trả lời:

Theo mặc định trong các biến PHP không cần phải được định nghĩa bởi vì các biến này sau đó được xác định khi lần đầu tiên truy cập trong một bối cảnh ghi. Tất cả các biến, bao gồm cả những người không xác định có chứa NULL (Demo):

class A {} 

$a = new A; 

var_dump($a->property); # NULL 

biến lớp Giới thiệu (tài sản) PHP sau đó cho phép để thực sự xác định các biến. Những vẫn trở NULL theo mặc định, nhưng họ định nghĩa (Demo):

class A { 
    public $property; 
} 

$a = new A; 

var_dump($a->property); # NULL 

Trong bước tiếp theo của quá trình tiến hóa, cấu trúc ngôn ngữ này cũng cho phép chỉ định một biểu thức hằng. Đó là hằng số vì định nghĩa là thời gian biên dịch (không phải là thời gian chạy khi hàm tạo được gọi). Một ví dụ (Demo):

class A { 
    public $property = 'hello'; 
} 

$a = new A; 

var_dump($a->property); # string(5) "hello" 

Vì đây là compile- nhưng constructor của bạn chạy thời gian, tôi thấy khó để so sánh cả hai tính năng với nhau. Ngoài ra nó không rõ ràng lý do tại sao bạn nói rằng khởi tạo thông qua các nhà xây dựng được khuyến khích.

+0

Vui lòng xem nội dung cập nhật của tôi cho câu hỏi của tôi - Tôi đã thêm nguồn tôi đã lưu ý cho khiếu nại đó. – Andrew

+0

Được rồi: Trang web có tên "Killer PHP" và khẩu hiệu "Hướng dẫn PHP dành cho nhà thiết kế web" có thể không đi sâu vào chi tiết như bạn muốn biết. Tôi không thể thấy bất cứ điều gì sai trong việc xác định các thuộc tính đối tượng. Bạn có thể khởi tạo sau này nếu muốn, nhưng bạn nên định nghĩa chúng. Nếu giá trị ban đầu của chúng phải là một cái gì đó khác với 'NULL' nhưng một biểu thức không đổi, hãy xác định chúng bằng giá trị ban đầu. Đó là không có gì sai. Thật vậy, nó làm cho constructor của bạn ít phức tạp hơn * là * một điều tốt. Các nhà xây dựng nên câm, không nên làm nhiều. – hakre

+0

Cảm ơn. Tôi chủ yếu bối rối vì tôi đã nhìn thấy mã tốt chủ yếu được viết với khởi tạo bên ngoài constructor, nhưng có vẻ như hầu hết những thứ mà tôi đã đọc đều được đề nghị khởi tạo trong constructor. Tôi có thể thấy nó ít lộn xộn như thế nào (đó là lý do đủ để làm điều đó), nhưng tôi đã không tìm thấy bất kỳ lợi thế thực tế nào khác trong PHP vì đã thiết lập một giá trị mặc định cho thuộc tính instance bên ngoài constructor. Cảm ơn bạn cho câu trả lời cũng nghĩ ra của bạn. – Andrew

0

Cách xa sự cẩu thả ... đó là thực hành lập trình tốt. Như bạn cũng sẽ làm trong Java/C++, nó chỉ thiết lập chúng, và sau đó bạn có thể thực hiện bất kỳ khởi tạo nào trong hàm tạo - thường là gửi chúng tới các giá trị mặc định như vậy.

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