2008-12-31 72 views
6

Trong nhiệm vụ của tôi trong việc cố gắng tìm hiểu thêm về OOP trong PHP. Tôi đã đi qua các hàm xây dựng một vài lần tốt và chỉ đơn giản là không thể bỏ qua nó nữa. Theo sự hiểu biết của tôi, người xây dựng được gọi vào thời điểm tôi tạo ra một đối tượng, điều này có đúng không?Lợi ích của việc sử dụng một hàm tạo?

Nhưng tại sao tôi cần phải tạo hàm tạo này nếu tôi có thể sử dụng các hàm hoặc phương thức "bình thường" như được gọi?

cổ vũ, Keith

+0

Ngoài ra, hãy xem http://stackoverflow.com/questions/403756/benefits-of-using-a-constructor hỏi cùng một câu hỏi – Adam

+1

ha ha, thật vui nhộn. Đó là câu hỏi của tôi mà tôi hoàn toàn quên mất. Tôi đã xem xét các câu hỏi liên quan khi đặt câu hỏi của tôi và không thấy gì cả. Xin lỗi vì tôi không thể xóa câu hỏi này vì có quá nhiều câu trả lời. –

+0

2 năm bên trái, không có gì bị chận)) – zerkms

Trả lời

9

Có hàm tạo được gọi khi đối tượng được tạo.

Một ví dụ nhỏ của tính hữu ích của một constructor là này

class Bar 
{ 
    // The variable we will be using within our class 
    var $val; 

    // This function is called when someone does $foo = new Bar(); 
    // But this constructor has also an $var within its definition, 
    // So you have to do $foo = new Bar("some data") 
    function __construct($var) 
    { 
     // Assign's the $var from the constructor to the $val variable 
     // we defined above 
     $this->val = $var 
    } 
} 

$foo = new Bar("baz"); 

echo $foo->val // baz 

// You can also do this to see everything defined within the class 
print_r($foo); 

UPDATE: Một câu hỏi cũng hỏi tại sao điều này nên được sử dụng, một ví dụ thực tế đời sống là một lớp cơ sở dữ liệu, nơi mà bạn gọi đối tượng với tên người dùng và mật khẩu và bảng để kết nối, mà hàm tạo sẽ kết nối. Sau đó, bạn có các chức năng để thực hiện tất cả công việc trong cơ sở dữ liệu đó.

+0

Cảm ơn bạn đã trả lời Ólafur. Nếu có thể, bạn có thể bình luận từng dòng để tôi hiểu rõ hơn không? K –

+0

Cảm ơn bạn đã giải thích, nhưng không thể hiểu ví dụ thực tế về đời sống của bạn, bạn có thể giải thích thêm về nó không ?? cảm ơn bạn trước. – sradha

28

Hàm tạo cho phép bạn đảm bảo rằng đối tượng được đặt trong một trạng thái cụ thể trước khi bạn cố gắng sử dụng nó. Ví dụ, nếu đối tượng của bạn có một số thuộc tính được yêu cầu để nó được sử dụng, bạn có thể khởi tạo chúng trong hàm tạo. Ngoài ra, các nhà xây dựng cho phép một cách hiệu quả để khởi tạo các đối tượng.

6

Ý tưởng về hàm tạo là chuẩn bị chuỗi dữ liệu ban đầu cho đối tượng, vì vậy nó có thể hoạt động như mong đợi.

Just call a method không phải là giao dịch, vì bạn có thể quên làm điều đó và điều này không thể được chỉ định là "bắt buộc trước khi làm việc" theo cú pháp - vì vậy bạn sẽ nhận được đối tượng "bị hỏng".

+1

@Keith: Để trích dẫn Wikipedia (và tôi thường không viết, nhưng nó được viết tốt trong trường hợp đó): "[Các nhà xây dựng] có nhiệm vụ khởi tạo các thành viên dữ liệu của đối tượng và thiết lập bất biến của lớp, nếu không Một constructor viết đúng cách sẽ để đối tượng ở trạng thái hợp lệ." – netcoder

+1

@netcoder: yep, tôi đã tìm ở đó ngay sau khi tôi đã viết câu trả lời - để kiểm tra bản thân ;-) Vì không có sự khác biệt đáng kể và vì SO là một trang web nơi ** mọi người trả lời ** (không chỉ sao chép-dán) - Tôi sẽ để tôi, mặc dù nó được viết bằng tiếng Anh tồi tệ hơn ;-) – zerkms

2

Các nhà xây dựng rất tốt cho nhiều thứ. Chúng khởi tạo các biến trong lớp của bạn. Giả sử bạn đang tạo một lớp BankAccount. $ b = Tài khoản ngân hàng mới (60); có một hàm tạo cho tài khoản ngân hàng một giá trị ban đầu. Họ thiết lập các biến trong lớp cơ bản hoặc họ cũng có thể khởi tạo các lớp khác (kế thừa).

2

Hàm khởi tạo để khởi tạo được thực hiện khi một đối tượng được tạo.

Bạn sẽ không muốn gọi một phương pháp tùy ý trên đối tượng mới tạo vì điều này đi ngược lại ý tưởng đóng gói và sẽ yêu cầu mã sử dụng đối tượng này để có kiến ​​thức vốn có về hoạt động bên trong của nó (và đòi hỏi nhiều nỗ lực hơn).

+1

gọi một phương thức setter, ví dụ, sau khi đối tượng đã được tạo ra không vi phạm đóng gói ở tất cả. – netcoder

+0

@netcoder Đúng, nhưng nếu các nhà xây dựng có liên quan, nói rằng, kết nối với một cơ sở dữ liệu, bạn sẽ không nhất thiết phải mong đợi mã gọi phải gọi một phương thức để làm điều này, như bạn có thể thậm chí không muốn mã gọi để biết đối tượng nhận được thông tin từ đâu. – Adam

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