Method (phương thức), public,private,protected, method overriding trong hướng đối tượng PHP
- 17-03-2023
- Toanngo92
- 0 Comments
Trong thuật ngữ PHP OOP, các hàm thành viên của lớp được gọi là phương thức (method). Từ khóa function được sử dụng để khai báo các phương thức của lớp.
Mục lục
Gọi phương thức thành viên (calling member method)
OOP là một mô hình dựa trên khái niệm về các đối tượng giúp xây dựng các ứng dụng phức tạp và có thể tái sử dụng bằng cách sử dụng dữ liệu và mã. Các khái niệm hướng đối tượng chính trong PHP là class (lớp), object (đối tượng),inheritance (kế thừa), polymorphism (đa hình),overloading (nạp chồng), data abstraction (trừu tượng hóa dữ liệu), constructor (hàm khởi tạo) và destructor (hàm hủy). Một đối tượng được tạo trong PHP bằng cách sử dụng từ khóa new.
Khi các đối tượng được tạo, các biến và phương thức thành viên của lớp có thể được truy cập bằng toán tử ->. Các phương thức (hàm) thành viên có thể được truy cập để lấy thông tin về các thuộc tính của đối tượng.
OOP có một số từ khóa được gọi là access modifier (bổ từ truy cập) quyết định khả năng truy cập cho các phương thức và thuộc tính trong class. Một số từ khóa PHP đại diện cho các access modifier và được sử dụng để đặt quyền truy cập với các thành viên và class PHP của chúng. Công cụ sửa đổi truy cập PHP có thể được phân loại dựa trên ứng dụng với variable (biến – thuộc tính) và method (phương thức) và class (lớp).
Modifier | Methods | Variables(properties) | Classes |
public | Áp dụng | Áp dụng | Không áp dụng |
private | Áp dụng | Áp dụng | Không áp dụng |
protected | Áp dụng | Áp dụng | Không áp dụng |
abstract | Áp dụng | Không áp dụng | Áp dụng |
final | Áp dụng | Không áp dụng | Áp dụng |
Ví dụ:
class Car {
// Properties (also known as attributes or member variables)
private $make;
private $model;
private $year;
// Constructor
public function __construct($make, $model, $year) {
$this->make = $make;
$this->model = $model;
$this->year = $year;
}
// Getter Methods
public function getMake() {
return $this->make;
}
public function getModel() {
return $this->model;
}
public function getYear() {
return $this->year;
}
// Setter Methods
public function setMake($make) {
$this->make = $make;
}
public function setModel($model) {
$this->model = $model;
}
public function setYear($year) {
$this->year = $year;
}
}
$car = new Car("Toyota", "Camry", 2018);
echo $car->getMake(); // Output: Toyota
$car->setYear(2019);
echo $car->getYear(); // Output: 2019
Kế thừa (Inheritance)
Kế thừa là một nguyên tắc quan trọng trong OOP, vì nó cho phép một lớp sử dụng các phương thức và thuộc tính của các lớp khác. Trong lập trình, luôn có yêu cầu tạo một lớp mới với các chức năng của các lớp khác hoặc các lớp hiện có. Trong những tình huống như vậy, bạn có thể sao chép hoặc kế thừa tất cả các phương thức và thuộc tính của lớp hiện có sang một lớp khác.
Kế thừa có lợi cho khả năng sử dụng lại khi tạo nhiều lớp tương tự nhau. Thay vì tạo các lớp từ đầu, người dùng có thể xây dựng dựa trên các lớp hiện có và mở rộng chức năng của chúng. Lớp kế thừa được gọi là Lớp cha (lớp siêu hoặc lớp cơ sở) và lớp được kế thừa được gọi là Lớp con (lớp con hoặc lớp dẫn xuất). Các thuộc tính và phương thức phổ biến trong lớp cha có thể được kế thừa vào lớp con, dựa trên các access modifier (bổ từ truy cập).
Một số lưu ý khi sử dụng kế thừa:
- Lớp con chỉ có quyền truy cập vào các phương thức và thuộc tính không riêng tư trên lớp cha
- Các phương thức của lớp con không có sẵn cho lớp cha.
- Các phương thức được định nghĩa trong lớp cha có thể được lớp con ghi đè bằng cách triển khai riêng.
Trong PHP, người dùng có thể sử dụng từ khóa extends để chỉ định tên của lớp cha trong khi định nghĩa lớp con. Cú pháp:
class <Child> extends class <Parent>{
// todo
}
Trong đó, Parent là một lớp hiện có.
Ví dụ:
<?php
class SinhvienObj{
private $name;
public $classs;
public $birthday;
public $gender;
public $subject;
// property
// method
// constructor => ham nay se chi khi doi tuong bat dau khoi tao
public function __construct($name,$class,$birthday,$gender,$subject)
{
$this->name = $name;
$this->classs = $class;
$this->birthday = $birthday;
$this->gender = $gender;
$this->subject = $subject;
}
public function getName(){
return $this->name;
}
public function setName($name){
$this->name = $name;
}
}
class SinhvienAptech extends SinhvienObj{
}
$sv2 = new SinhvienObj('toan','Aptech','20/10/2000','Nam','Toan');
$sv2->setName('Test toan 3');
echo $sv2->getName();
$sv = new SinhvienAptech('toan','Aptech','20/10/2000','Nam','Toan');
$sv->setName('Test toan 2');
echo $sv->getName();
Lớp con với các phương thức và thuộc tính riêng
Một lớp con có thể truy cập các thành viên non-private (không riêng tư) của lớp cha. Một lớp con có thể có các thuộc tính và phương thức thành viên riêng.
<?php
class SinhvienObj{
private $name;
public $classs;
public $birthday;
public $gender;
public $subject;
// property
// method
// constructor => ham nay se chi khi doi tuong bat dau khoi tao
public function __construct($name,$class,$birthday,$gender,$subject)
{
$this->name = $name;
$this->classs = $class;
$this->birthday = $birthday;
$this->gender = $gender;
$this->subject = $subject;
}
public function getName(){
return $this->name;
}
public function setName($name){
$this->name = $name;
}
}
class SinhvienAptech extends SinhvienObj{
public $mark = 5;
public function getMark(){
return $this->mark;
}
public function setMark($mark){
$this->mark = $mark;
}
}
$sv = new SinhvienAptech('toan','Aptech','20/10/2000','Nam','Toan');
echo $sv->getMark();
$sv2 = new SinhvienObj('toan','Aptech','20/10/2000','Nam','Toan');
echo $sv2->getMark();
Các thuộc tính và phương thức được định nghĩa trong lớp cha có thể được sử dụng bởi lớp con mà không cần định nghĩa lại. Ngoài ra, lớp con có thể định nghĩa thêm các phương thức và thuộc tính riêng tương tự như bất kỳ lớp nào khác. Điều này có thể thực hiện được mặc dù nó kế thừa các thuộc tính của lớp cha.
Public members (thành viên công khai)
Các lớp và các thành viên của chúng được đối xử công khai, trừ khi được chỉ định. Để hiểu rõ hơn, cách tốt nhất là chỉ định các lớp và các thành viên của chúng là công khai (public).
Bằng cách định nghĩa các lớp và các thành viên của chúng là công khai, chúng có thể được truy cập từ bất kỳ cách nào sau đây:
- Ngoài phạm vi của một lớp.
- Trong phạm vi của một lớp.
- Một lớp khác trong lớp đã khai báo.
Private members (thành viên riêng tư)
Một lớp có thể được định nghĩa là private (riêng tư) hoặc protected (được bảo vệ) để giới hạn khả năng truy cập của các thành viên trong lớp. Các thành viên lớp riêng có thể được truy cập từ bên trong lớp.
Nó có nghĩa là một thành viên riêng không thể được truy cập từ bên ngoài lớp mà nó được khai báo cũng như lớp kế thừa.
Ví dụ:
// Define the base class
class Footwear {
private $price = "We have a fixed price of 3000";
private function show() {
echo "This is a private method of Footwear (base class)";
}
public function getPrice() {
return $this->price;
}
}
// Define the derived class
class Sneakers extends Footwear {
public function printPrice() {
echo $this->getPrice();
}
}
// Create an object of the derived class
$sneakersObj = new Sneakers();
// This will now throw an error because show() is private
$sneakersObj->show();
// This will work because printPrice() is public
$sneakersObj->printPrice();
Protected Members (thành viên được bảo vệ)
Một protected member (thành viên được bảo vệ) tương tự như private member. Các protected member có thể được truy cập từ các lớp dẫn xuất từ lớp cha. Chúng cũng có thể được truy cập trong các lớp con mà chúng được khai báo.
Ví dụ:
<?php
class Footwear{
protected $price1 = 5000;
protected $price2 = 15000;
function total(){
echo $sum = $this->price1 + $this->price2;
echo "<br/>";
}
}
class Sneakers extends Footwear{
function printBill(){
$tax = 100;
echo $sub = $this->price1 + $this->price2 + $tax;
echo "<br/>";
}
}
$obj = new Sneakers();
$obj->total();
$obj->printBill();
echo $obj->price1;
Trong mã trên, các biến $price1 và $price2 được khai báo với bộ xác định quyền truy cập được bảo vệ trong lớp cơ sở Footwear. Do đó, chúng chỉ có thể được truy cập trong cùng một lớp hoặc trong các lớp đang kế thừa lớp cơ sở. Chúng không thể được truy cập bên ngoài lớp dẫn xuất hoặc lớp cơ sở.
Các bổ từ truy cập private và protected thường được sử dụng để triển khai các nguyên tắc trừu tượng hóa và đóng gói trong OOP. Ví dụ: khi xác định các thư viện cài sẵn, nhà phát triển có thể muốn cấp cho người dùng một số quyền truy cập chứ không phải quyền truy cập đầy đủ. Họ có thể muốn ‘bảo vệ’ một số chức năng khỏi bị sửa đổi. Trong những trường hợp như vậy, các chỉ định này rất hữu ích.
Method overriding (ghi đè phương thức)
Ghi đè phương thức là một khái niệm OOP quan trọng trong PHP, trong đó cả lớp cha và lớp con đều có cùng tên phương thức. Mục tiêu chính là thay đổi hành vi của phương thức lớp cha.
Ghi đè phương thức hoặc chức năng được thông qua khi lớp muốn sử dụng phương thức của lớp cha theo cách khác. Phương thức được định nghĩa trong lớp cha bị ghi đè bằng một định nghĩa khác.
Ví dụ:
class Car{
public $title;
public function drive(){
echo "Driving a car <br/>";
}
}
class BMW extends Car{
public function drive(){
echo "Driving a BMW <br/>";
}
}
class HondaCity extends Car{
public function drive(){
echo "Driving a HondaCity <br/>";
}
}
$bmw = new BMW();
$bmw->title = "BMW 4 series (G20/G21)";
$bmw->drive();
$hondacity = new HondaCity();
$hondacity->title = "Honda City V MT";
$hondacity->drive();
Phạm vi của hàm bên trong Class
Các hàm theo mặc định là toàn cục. Sau đây là cú pháp để xác định một hàm PHP:
function funcName(){
// todo
}
Hàm Có thể bao gồm các tham số và câu lệnh return. Các hàm có phạm vi toàn cục và có thể được bắt đầu từ bất kỳ đâu trong chương trình. Chúng thậm chí có thể được gọi từ một instance của một class.
Nested function (hàm bên trong)
Các hàm bên trong, còn được gọi là các hàm lồng nhau, là các hàm toàn cục hoạt động giống như cách chúng được khai báo bên ngoài hàm chứa. Ví dụ: biến được xác định trong hàm là cục bộ của hàm đó. Tuy nhiên, theo quy tắc hàm toàn cục, hàm được xác định trong một hàm khác là một biến cục bộ.
function outerFunction() {
$outerVar = "I am accessible by innerFunction.";
function innerFunction() {
$innerVar = "I am only accessible within innerFunction.";
echo $innerVar; // This will output "I am only accessible within innerFunction."
echo $outerVar; // This will produce an error because $outerVar is not defined within the innerFunction's scope.
}
innerFunction();
}