// Kế thừa từ lớp xe
class XeHonda extends Xe{ function hienThiThongTin(){
// lệnh này đúng echo $this->tenxe;
// lệnh này sai vì thuộc tính loaixe là
// private trong lớp cha echo $this->loaixe;
// lệnh này đúng
$this->setLoaixe('Wave S');
// lệnh này đúng
echo $this->getLoaixe();
/// Lệnh này sai vì hàm xoaLoaixe là
Có thể bạn quan tâm!
- Lập trình mã nguồn mở - 10
- Trừu Tượng Hoá Dữ Liệu Ví Dụ: Xây Dựng Chương Trình Quản Lý Sinh Viên
- Các Đối Tượng Trong Trong Thế Giới Thực
- Tính Đóng Gói Trong Lập Trình Hướng Đối
- Truyền Và Xử Lý Dữ Liệu Trong Php
- Lập trình mã nguồn mở - 16
Xem toàn bộ 270 trang tài liệu này.
// private trong lớp cha
$this->xoaLoaixe();
}
}
// -------------------
// Chương trình chính//
// -------------------
// Khởi Tạo mới lớp xe hon da
$xehonda = new XeHonda();
// Gọi hàm hienThiThongTin trong lớp XeHonda
// Các bạn kiểm tra trong hàm này để xem các
// lỗi mà tôi đã ghi chú
$xehonda->hienThiThongTin();
// Lệnh này đúng vì lớp XeHonda kế thừa lớp Xe nên
// nó được kế thừa các thuộc tính và hàm của lớp cha
$xehonda->setLoaixe('Suzuki'); echo $xehonda->getLoaixe();
// Lệnh này sai vì hàm xoaLoaixe trong lớp Xe là
// private nên lớp XeHonda không được kế thừa
$xehonda->xoaLoaixe();
2) Mức truy cập protected
Mức truy cập protected chỉ cho phép truy xuất trong lớp đó và lớp kế thừa nó nên bên ngoài lớp đó sẽ không truy cập vào được. Thường được dùng cho những lớp có khả năng bị kế thừa.
Ví dụ:
// Lớp Xe class Xe
{
protected $loaixe;
}
// Kế thừa từ lớp xe
class XeHonda extends Xe{ function hienThiThongTin()
{
// Lệnh này đúng vì loaixe đang ở
// mức protected nên nó được kế thừa
$this->loaixe = 'Wave S';
}
protected function suaChuaXe()
{
// Lệnh
}
}
// ------------------//
// Chuong Trình Chính//
// ------------------//
$honda = new XeHonda();
// Lệnh này sai vì loaixe đang
// ở mức protected nên ở bên ngoài lớp
// không được truy xuất vào
$honda->loaixe = 'Wave Tàu';
// Lệnh này đúng
$honda->hienThiThongTin();
// Lệnh này sai vì: function suaChuaXe đang
// ở mức protected nên không thể truy xuất
// từ ngoài lớp XeHonDa
$honda->suaChuaXe();
3) Mức truy cập public
Thành phần có thể truy cập bất kỳ ở đâu từ trong bản thân lớp đó đến lớp kế thừa và cả bên ngoài.
Khi khai báo thuộc tính là public ta có thể dùng từ khóa var để thay thế cho public.
Ví dụ
class Xe
{
private $loaixe; // Mức private protected $tenxe; // Mức protected var $sokhung; // Mức public public $soseri; // Mức public
}
Khi khai báo với hàm là public nếu ta không đặt từ public ở đầu thì php sẽ tự hiểu hàm này là public.
Ví dụ
class Xe
{
// Ở dạng public vì ta không có từ khóa gì ở trước function showTenXe()
{
// lệnh
}
// Ở dạng public vì có từ khóa public ở trước public function showHangXe(){
// lệnh
}
// Ở dạng private vì có từ khóa private ở trước private function setTenxe(){
// lệnh
}
// Ở dạng protected vì có từ khóa protected ở trước protected function getTenXe(){
// lệnh
}
}
2.11.6. Kế thừa lồng
1) Kế thừa lồng
Kế thừa lồng hay còn gọi là kế thừa nhiều lớp là một lớp được kế thừa từ nhiều lớp, lớp B kế thừa lớp A, lớp C kế thừa lớp B và thế là ta có đường đi A -> B -> C.
Một ví dụ khác giả sử Ông mình sinh ra Bố mình, Bố mình sinh ra mình như vậy mình kế thừa dòng máu của Ông mình và Bố mình.
Ví dụ:
class A {
}
class B extends A {
}
class C extends B {
}
2) Các mức độ truy cập trong kế thừa lồng
Có ba mức độ truy cập hay dùng nhất đó là private, public và protected. Cũng như trong kế thừa một cấp tất cả những biến (thuộc tính) và hàm (phương thức) ở dạng public thì ở tất cả các lớp con dù ở cấp độ nào nó cũng có thể truy xuất vào được. Nếu ở dạng private thì chỉ dùng trong lớp đó. Nếu ở dạng protected thì tất cả các lớp kế thừa nó dù là lồng bao nhiêu lần thì cũng có thể sử dụng.
Ví dụ:
// Lớp A class A{
protected $protected_A = 'Protected'; private $private_A = 'Private';
public $public_A = 'Public'; private function showPrivate(){ echo $this->private_A;
}
protected function showProtected(){ echo $this->protected_A;
}
public function showPublic()
{
echo $this->public_A;
}
}
// Lớp B Kế Thừa Lớp A class B extends A{ public function ClassB()
{
echo $this->protected_A;
}
}
// Lớp C Kế Thừa Lớp B class C extends B{
public function showInfo(){
// Lệnh này đúng vì nó truy xuất vào thuộc tính protected
$this->protected_A = 'Nguyễn Văn A';
// Lệnh này đúng vì nó truy xuất vào thuộc tính public
$this->public_A = 'Nguyễn Văn B';
// Lệnh này sai vì nó truy xuất vào thuộc tính private
$this->private_A = 'Lệnh sai';
}
}
// ------------------//
// Chương trình chính//
// ------------------//
// Khởi tạo lớp C
// Lớp C được kế thừa từ lớp B
// mà lớp B kế thừa từ lớp A nên
// suy ra nó kế thừa từ 2 lớp A, B
$c = new C();
// Lệnh này đúng vì gọi đến hàm public của lớp cha A
$c->showPublic();
// Lệnh này sai vì nó gọi hàm protected của lớp cha A
$c->showProtected();
// Lệnh này sai vì nó gọi hàm private của lớp cha A
$c->showPrivate();
// Lệnh này đúng vì nó truy xuất vào hàm public của lớp cha B
$c->ClassB();
2.11.7. Cách sử dụng private, protected và public
1) Cách khai báo tên thuộc tính để nhận dạng cấp độ truy cập
Cách chọn từ đặt cho tên biến và tên hàm
Thông thường tên biến (thuộc tính) phải là một danh từ hoặc tình từ, còn tên của hàm (phương thức) bắt đầu bằng một động từ.
class A{
public $username; public $password;
public function getUsername(){
}
public function getPassword(){
}
public function checkLogin(){
}
}
Khai báo tên biến dạng private
Thông thường nếu biến ở dạng private thì tên biến nên đặt hai dấu gạch dưới rồi mới đến tên biến.
Ví dụ:
class A{
private $ _private;
private function _func_private(){
}
}
Khai báo tên biến dạng protected
Thường nếu ở dạng protected thì nên đặt một dấu gạch dưới rồi mới tới tên biến.
Ví dụ:
// Lớp A class A
{
protected $_protected;
protected function _func_protected(){
}
}
Khai báo tên biến dạng public
Nếu ở dạng này chỉ cần khai báo tên bình thường.
class A{
public $public;
public function func_public(){
}
}
2) Sử dụng hàm set và hàm get
Các thuộc tính trong đối tượng ta dùng để gán dữ liệu và lúc cần thiết sẽ lấy dữ liệu, có những thuộc tính khi thiết lập ta muốn có những biến đổi nó trước khi gán giá trị vào thuộc tính. Ví dụ muốn khi thiết lập mật khẩu cho người dùng thì mật khẩu sẽ được tự động thêm một số ký tự đặc biệt và mã hóa để an toàn và bảo mật hơn, như vậy mỗi lần gán giá trị cho thuộc tính mật khẩu phải thêm một đoạn sau:
class A{
public $username; public $password;
}
$a = new A();
$a->password = md5('thehalfheart' . 'ky_tu_muon_them');
Như vậy giả sử trong quá trình code có sử dụng phép gán này 100 lần thì làm sao để nhớ ký tự thêm vào, chưa tính đến chuyện sau này muốn sửa ký tự thêm vào thành một chuỗi và mã hóa khác thì phải vào 100 dòng code đó để sửa. Giả sử muốn khi lấy giá trị username thì có thêm một đoạn là Xin Chào + Username, như vậy mỗi lần lấy giá trị username phải thêm nó vào, 100 dòng code thì rất là phiền. Vì vậy giải pháp là ta tạo những hàm SET và GET dùng cho việc gán và lấy dữ liệu cho các thuộc tính username và password để sau này sửa thì sửa có một dòng trong hàm đó.
Quy tắc đặt tên như sau:
setThuoctinh(), getThuoctinh()
Ví dụ:
class A{
private $__username; private $__password; function getUsername(){
return 'Xin chào ' . $this->username;
}
function setUsername($username){
$this->__username = $username;
}
function getPassword(){ return $this->__password;
}
function setPassword($password){
$this->__password = md5($password.'ky_tu_muon_them');
}
}
// Sử dụng
$a = new A();
$a->setUsername('TheHalfheart'); echo $a->getUsername();
$a->setPassword('matkhau');
echo $a->getPassword();
3) Sử dụng cấp độ truy cập private
Để an toàn dữ liệu các thuộc tính đều ở dạng private nhưng phải tạo thêm các hàm SET và GET nên các lập trình viên cũng ít chú trọng đến nó. Tuy nhiên có những trường hợp sau ta bắt buộc phải dùng ở dạng private để an toàn cho đối tượng.
- Những thuộc tính có tính biến đổi dữ liệu khi nhập và lấy dữ liệu như ví dụ thuộc tính Username và Password.
- Những phương thức dùng trong nội bộ trong lớp, không sử dụng bên ngoài lớp. Đó là hai đặc điểm cơ bản để chọn độ truy cập là private
4) Sử dụng cấp độ truy cập protected
Protected thường được dùng khi biết chắc là có lớp khác sẽ kế thừa lớp này và những phương thức, thuộc tính đó chỉ được dùng trong lớp kế thừa nó.
Giả sử khai báo lớp Động Vật, trong đó có hàm lưu dữ liệu động vật vào database, hàm này dùng chung cho tất cả các lớp kế thừa nó và để bảo mật sẽ không muốn nó có thể gọi từ bên ngoài, vì thế sẽ khai báo là protected.
Thực tế thì cũng tùy vào từng bài toán cụ thể mà lựa chọn.
5) Sư dụng cấp độ truy cập public
Public là cấp độ có thể gọi ở mọi nơi từ trong nội bộ của lớp đến lớp kế thừa nó, thậm chí cả bên noài cũng gọi được.
Những hàm này thường được dùng để lấy dữ liệu và xuất dữ liệu ra bên ngoài, hay là những hàm xử lý dữ liệu, những hàm này mang tính chất là hàm thao tác cuối cùng với người coder. Ví dụ như các hàm SET và GET được để ở dạng public
2.11.8. Tính đa hình trong lập trình hướng đối tượng php
Tính đa hình trong php hay còn gọi là tính đa hình trong lập trình hướng đối tượng là sự đa hình của mỗi hành động cụ thể ở những đối tượng khác nhau. Ví dụ hành động ăn ở các loài động vật hoàn toàn khác nhau như: con heo ăn cám, hổ ăn thịt, con người thì .. ăn hết.
Đó là sự đa hình trong thực tế, còn đa hình trong lập trình thì được hiểu là Lớp Con sẽ viết lại những phương thức ở lớp cha (ovewrite).
Ví dụ:
// Lớp Cha class DongVat{
// Động Vật Ăn public function An(){
echo 'Động Vật Đang Ăn';
}
}