OOP trong php hướng dẫn code PHP bằng cách dùng object, class để xử lý. Nhiều vấn đề được đề cập: construct, extends, constant, $this…
OOP trong php
- Khai báo class trong php
- Tạo đối tượng
- Truy xuất thuộc tính của đối tượng
- Cấp độ truy xuất (access level) của thuộc tinh
- Hàm construct và desctruct trong class
- Anonymous class trong PHP
- Sử dụng hằng trong class
- Hàm static trong class
- sp_autoload_register
OOP viết tắt của Object Oriented Programming là một kỹ thuật lập trình trong đó, bạn tạo các object để lưu trữ và xử lý thông tin.
Object là một biến có cấu trúc dùng để lưu trữ thông tin. Ví dụ tạo object để lưu thông tin một khách hàng, một học sinh, một cái điện thoại, một con thú cưng.
$tc1 = new thucung;
$dt1 = new dienthoai;
Nhưng để tạo được object, bạn cần khai báo class trước. Class là hình mẫu, là cấu trúc. Cần khai báo class trước để khi tạo object bằng lệnh new thì nó sẽ theo cấu trúc đã khai báo mà tạo object.
Khai báo class trong php
<?php class dienthoai { public $tenDT; public $giausd; function giavnd(){ } } ?>
Sau từ khóa class là tên của class, bên trong class là các thuộc tính của class. Các thuộc tính của class có thể là biến hoặc là hàm.
Bạn có thể tạo class con có sự kế thừa từ class cha bằng từ khóa extends. Khi đó các đối tượng được tạo theo class con sẽ có luôn các thuộc tính của class cha.
<?php class dienthoaiVIP extends dienthoai { public $tínhnăng; public $chấttliệuvỏ; } ?>
Tạo đối tượng
Việc tạo đối tượng là rất cơ bản của lập trình OOP trong php, đơn giản thôi: Bạn dùng lệnh new tênclass để tạo object. Sau khi tạo object xong, có thể gán giá trị cho các thuộc tính của nó, gọi hàm trong nó.
<?php $dt1= new dienthoai; $dt1->tenDT = "LG Gaming G15 15 eg2082TU"; $dt1->giausd =570; ?>
Truy xuất thuộc tính của đối tượng
Sau khi object đã được tạo, muốn truy xuất thuộc tính của object thì dùng cú pháp $object->tênthuộctính. Hoặc gọi hàm trong object bằng cú pháp $object->tênhàm()
Nếu khi code trong class, muốn truy xuất thuộc tính của class thì dùng cú pháp $this->tênthuộctính
<?php class dienthoai { public $tenDT, $giausd; function giavnd(){ $vnd = $this->giausd*25000; return $vnd; } } //class ?>
<?php $dt1= new dienthoai; $dt1->tenDT = "LG Gaming G15 15 eg2082TU"; $dt1->giausd = 570; echo $dt1->giavnd(); ?>
Cấp độ truy xuất (access level) của thuộc tinh
Với mỗi thuộc tính của 1 class. Khi khai báo bạn có thể chỉ định 1 trong 3 cấp độ truy xuất cho nó. Đó là public, private hoặc protected
Thuộc tính public thì có thể truy xuất đến nó bên ngoài class, thuộc tính private chỉ có thể truy xuất bên trong class, thuộc tính protected chỉ có thể tuy xuất bên trong class và những class con
<?php class hocsinh { public $hoten; private $dtb; protected $xeploai; public function gandiem($t){ $this->dtb= $t; if ($this->dtb>=8) $this->xeploai="Giỏi"; else if ($this->dtb>=7) $this->xeploai="Khá"; else $this->xeploai="Trung Bình"; } } class hocsinhgioi extends hocsinh{ public $hocbong; function xuatthongtin(){ echo $this->hoten,"<br>"; //ok echo $this->xeploai,"<br>"; //ok echo $this->dtb; //lỗi Undefined property: hocsinhgioi::$dtb } } $hs1 = new hocsinh; $hs1->hoten="Trần Tri Túc"; //ok $hs1->xeploai="Khá"; //lỗi Cannot access protected property $hs1->dtb= 9; //lỗi Cannot access private property $hsg1 = new hocsinhgioi; $hsg1->hoten = "Tiêu Dao"; //ok $hsg1->gandiem(8.5); $hsg1->xuatthongtin(); ?>
Hàm construct và desctruct trong class
Khi lập trình với OOP trong php, các hàm __construct() , __destruct() trong các class rất hữu dụng. Hàm __construct() là hàm chạy tự động khi new 1 object, đây là nơi rất tốt để khởi tạo giá trị các biến trước khi dùng đối tượng. Còn hàm có tên __destruct() cũng chạy tự động , nhưng là khi bạn hủy 1 object, thích hợp khi cần đóng kết nối, đóng file đã mở, trả tài nguyên đã dùng.
<?php class sanpham{ private $id; function __construct() { echo "<h3>Đây là hàm construct của class sanpham. Hế lô</h3>"; $this->id= 1; } function __destruct() { echo "<h5>Hàm desstruct của class sanpham. Bye bye.</h5>"; $this->id= 1; } } $sp = new sanpham; //Đây là hàm construct của class sanpham unset($sp); //Hàm desstruct của class sanpham. Bye bye. echo "Chào bạn"; ?>
Nếu hàm __construct bạn có định nghĩa tham số thì khi new 1 object, bạn phải truyền giá trị vào (hàm construct sẽ đón nhận)
<?php class sanpham{ public $id; function __construct($id) { echo "<h3>Đây là hàm construct của class sanpham</h3>"; $this->id= $id; } } $sp = new sanpham(10); echo $sp->id; //10 ?>
Nếu cả class con và class cho đều cần đến hàm construct thì bạn nhớ chạy lệnh parent::__construct() trong class con để cho hàm __construct() trong class cha cũng được chạy, nếu không thì hàm __construct() trong class cha sẽ bị che lại, không chạy, mất tác dụng.
<?php class sanpham{ public $id; function __construct($id) { echo "<h3>Đây là hàm construct của class sanpham. Hế lô</h3>"; $this->id= $id; } } class sanphamhong extends sanpham{ public $ngay; function __construct($id) { parent::__construct($id); echo "<h4>Hàm construct của class sanphamhong</h3>"; $this->ngay = time(); } } $sp = new sanphamhong(3); echo $sp->id; //3 ?>
Anonymous class trong PHP
Anonymouse class là class ẩn danh, tức không có tên. Dùng cáh này khi class chỉ dùng để new 1 lần , tạo 1 object đơn lẻ.
<?php $config = new class{ const DB_HOST="localhost"; const DB_NAME="laptop"; public $tygia=25000; function __construct() { echo "<h5>Đây là class config</h5>"; } }; echo $config::DB_NAME . "<br>" . $config->tygia; ?>
Sử dụng hằng trong class
Khi dùng OOP trong php, có khi bạn dùng tới các hằng trong class. Dùng từ khóa const khi khai báo hằng. Còn khi cần truy xuất tới hằng thì sao?
Bên trong class, truy xuất tới hằng thì dùng cú pháp self::tênhằng . Bên ngoài class, truy xuất tới hằng bằng cú pháp tênclass::tênhằng
<?php class core { const ROOT_URL="http://localhost/nc_test"; const PAGE_SIZE = 20; const PS = self::PAGE_SIZE/2; //10 function __construct() { $url = self::ROOT_URL; //http://localhost/nc_test } } $c = new core; echo core::PAGE_SIZE; //20 ?>
Hàm static trong class
Hàm static (static method) là các hàm trong class mà bạn có thể gọi trực tiếp thông qua tên class mà không cần phải tạo đối tượng (instance của class) .
Định nghĩa hàm static và gọi nó
Static method được định nghĩa trong class bằng từ khóa static
ở phía trước. Có thể gọi hàm static bên ngoài class, thậm chí gọi hàmm staic từ trong class khác cũng được. Dùng cú pháp thế này tênclass::tênhàm() .
<?php class Database { static function query() { echo "Hàm query!"; } } Database::query(); //Hàm query! ?>
Trong class, các function thông thường có thể gọi hàm static thông qua từ khóa self:: như sau
<?php class Database { static function query() { echo "Hàm query!"; } function __construct(){ self::query(); //Hàm query! } } new Database; ?>
Gọi hàm trong class bằng hàm call_user_func
Với hàm đã có trong class, bạn có thể gọi chạy bằng hàm call_user_func. Hàm static không cần new class, còn hàm bình thường phải dùng new. Mời xem ví dụ sau:
<?php class Database { static function query() { echo "Hàm query!"; } function queryOne() { echo "Hàm queryOne!"; } } call_user_func( [Database::class, 'query' ]); //Hàm query call_user_func( [new Database, 'queryOne' ]); //Hàm queryOne ?>
sp_autoload_register
Trong lập trình với oop trong php, dùng hàm spl_autoload_register sẽ giúp bạn tiện lợi hơn vì nó giúp tự động nạp 1 class.
<?php //sanpham.php class sanpham { function __construct() { echo "<h4>class sanpham</h4>"; } } ?>
Khi bạn new 1 đối tượng , nếu php không thấy class phù hợp thì php sẽ tìm xem trong trang web của bạn có hàm spl_autoload_register hay không. Nếu có hàm này thì php sẽ đưa tên class cho hàm này để nhờ spl_autoload_register nạp class. Xem ví dụ sau :
<?php //spl_autoload_register_test.php spl_autoload_register( function($filename) { require $filename.".php"; } ); $sp = new sanpham; //filename ?>
Hàm spl_autoload_register đem lại tiện lợi lớn cho các dự án tạo nhiều class (hàng chục, hàm trăm class) , lúc này bạn không cần require từng class để sử dụng.
Bạn có thể tham khảo thêm về oop trong php bằng cách xem link này: