Hàm khởi tạo PHP Laravel
Mọi người cho em hỏi thế nào là hàm khởi tạo? và khi nào chúng ta dùng hàm khởi tạo? Hàm khởi tạo được sử dụng như thế nào ?
3 CÂU TRẢ LỜI
Có một điểm khác biệt trong hàm khởi tạo của Laravel với PHP, đó là Laravel hỗ trợ việc tự động binding object để thực hiện dependency injection, nên khi code rất tiện. kaka.
Hàm khởi tạo
Đó chính là constructor trong PHP. Hàm khởi tạo cũng là một hàm bình thường nhưng có điểm đặc biệt là nó luôn luôn được gọi tới khi ta khởi tạo một đối tượng. Nghĩa là bạn có class A và có hàm khởi tạo __construct, thì tất cả các biến trong hàm khởi tạo sẽ được tạo ra khi bạn gọi đến nó. Bạn hãy dùng thử nó để biết tại sao lại dùng hàm này. Trên viblo có rất nhiều tài liệu về hàm tạo, hàm hủy. Mình có 1 số link cho bạn tham khảo. https://viblo.asia/p/lap-trinh-huong-doi-tuong-trong-phpphan-2-bJzKmkePl9N
cảm ơn anh
anh có thể giải thích cho e hiểu vì sao ở đây mình lại dùng hàm khởi tạo không ạ? và cách mà nó gọi tới model? và các giá trị trong hàm _contrucct được không ạ
$this->room = $room
ở đây tức là bạn gán cái $this->room chính là một "tham chiếu" của cái model Room kia. Bạn có thể tìm đọc về Dependency Injection để hiểu về cái chỗ binding này:
(Room $room)
Vì vậy khi bạn gọi $this->room = $room tức là ở đây $this->room chính là cái model Room kìa. và bạn có thể sử dụng các methods của Room.
Hàm khởi tạo trong các ngôn ngữ lập trình hỗ trợ lập trình hướng đối tượng (OOP) nói chung và PHP nói riêng là một hàm được tự động thực thi khi tạo mới một đối tượng qua từ khóa new
. Hàm khởi tạo được sử dụng mục đích khởi tạo các giá trị ban đầu cho đối tượng sau khi tạo mới. Trong PHP, khởi tạo có tên là __construct
và là một trong các magic method của PHP mặc dù nó cũng ko có tí nào là magic cả. Lưu ý là trong __construct
thì không có dùng return
nhé bạn!
class Student
{
protected $name;
// Đây là hàm khởi tạo, được tự động thực thi khi khởi tạo instance của một class
public function __construct($name)
{
$this->name = $name;
}
}
$student = new Student('Nguyen Huu Kim');
protected $name;
// Đây là hàm khởi tạo, được tự động thực thi khi khởi tạo instance của một class public function __construct($name) { $this->name = $name; } Trong hàm khởi tạo anh đưa ra ví dụ thì mình có thể thêm giá trị hay thuộc tính ngoài thuộc tính khai báo trước đó không ạ
@PhanNhuHuyen Có em, arguments
là tùy mình định nghĩa nhé. Nhưng mục đích vẫn ko đổi, chỉ là khởi tạo dữ liệu cho các thuộc tính của object đấy.
@PhanNhuHuyen hihi. Dục tốc bất đạt. Em cứ học chắc các kiến thức cơ bản của PHP cái đã, ví dụ như OOP là điển hình. Lúc ấy tìm hiểu Laravel sẽ nhanh và dễ dàng hiểu hơn nhiều nếu em chưa hiểu những cái căn bản.
@huukimit dạ cơ bản php thì e thấy ổn rồi ạ còn oop em thấy còn mơ hồ quá nên vô làm laravel thấy hơi rối ạ!!!
@huukimit anh có thể giải thích cho e hiểu vì sao ở đây mình lại dùng hàm khởi tạo không ạ? và cách mà nó gọi tới model? và các giá trị trong hàm _contrucct được không ạh !!!
Mình tóm cái váy lại một chút nhé:
- Bạn chỉ cần nhớ rằng,
__construct
trong PHP là một constructor. Trong các ngôn ngữ lập trình hướng đối tượng thì constructor luôn luôn được gọi khi bạn thực hiện tạo mới mộtinstance
củaClass
qua từ khóanew
. VD:
class Developer
{
protected $fullName;
public function __constructor($fullName)
{
$this->fullName = $fullName;
}
public function getFullName()
{
return $this->fullName;
}
}
// Tạo mới một instance $huukimit và khởi tạo ngay giá trị cho property $fullName = 'Nguyen Huu Kim':
$huukimit = new Developer('Nguyen Huu Kim');
echo $huukimit->getFullName();
- Cái
Room $room
bạn thêm vào hàm khởi tạo của Controller, lúc này Laravel lúc tạo một instance cho cái Controller đấy nó sẽ thực hiện như sau:
$room = new Room(..);
$controller = new IndexController($room);
Sau đó nó dùng $controller
để gọi vào method tương ứng với route hiện tại. Như bạn thấy, kỹ thuật tự bind arugment như kia được gọi là Dependency Injection nhé! Nó được áp dụng trong cả __constructor của Controller và trong action
của Controller và một số chỗ khác nữa.
Qua Dependency Injection thì Laravel tự new Room
rồi truyền vào hàm khởi tạo của Controller. Trong hàm khởi tạo của controller bạn gán cái $room
được Laravel đưa cho vào một property để có thể sử dụng lại $room
trong các method của controller thông qua $this->room
.