Khái niệm thuộc tính và thuộc tính đặt ra nhiều câu hỏi cho những người làm việc với lập trình hướng đối tượng, bởi vì về mặt khái niệm, chúng sẽ bình đẳng với nhau
Theo Fowler [2005], một thuộc tính là một đặc điểm cấu trúc của một lớp,. e, nó xác định một cách hiệu quả đối tượng là gì. Nhưng thuộc tính khác cũng có thể đại diện cho những gì lớp có thể làm
Để làm cho nó rõ ràng để hiểu, chúng ta hãy đi đến một ví dụ thực tế. lớp 'nhân viên' có thuộc tính 'tên' và thuộc tính 'thẻ', trong trường hợp này được biểu diễn bằng lớp thứ hai lưu thông tin thẻ của nhân viên
lớp nhân viên
{
$ Tên = “”;
$ Thẻ = Thẻ mới[];
}
Thuộc tính 'Tên' được biểu thị bằng một chuỗi, vì thuộc tính 'Thẻ' được biểu thị bằng một đối tượng và đó là điểm khác biệt chính giữa chúng
Bất cứ khi nào một phần thông tin được xử lý một cách đơn giản, chẳng hạn như một giá trị số nguyên hoặc chuỗi, nó có thể được coi là một thuộc tính. Tuy nhiên, khi nó được đại diện bởi một đối tượng có thuộc tính, thuộc tính và phương thức, thì nó sẽ được coi là thuộc tính
Sự khác biệt này đôi khi tinh tế, không được chú ý trong nhiều phân tích. Khi thực hiện mô tả quy trình, cần đánh giá xem thuật ngữ được sử dụng có đúng không, trong phạm vi hiểu biết chung của nhóm
Cuối cùng, chúng ta có thể nói rằng thuộc tính xác định các đặc điểm xác định đối tượng thực sự là gì và thuộc tính có thể xác định nó là gì và cả các tính năng của nó, do đó được kế thừa từ một đối tượng phụ quy định thuộc tính đó
Xem thêm nội dung trên blog của chúng tôi
Tìm hiểu tất cả về Scriptcase
Bởi Vỏ tập lệnh,
1 Tháng sáu 2015
Chia sẻ bài đăng này
liên kết
Bạn cũng có thể thích…
Mã thấp. đó là tương lai, không phải là một xu hướng đã qua
Các công cụ mã thấp cho phép các chuyên gia phát triển các hệ thống nhanh, hiệu quả và chính xác. Hạ mã ha
Có gì mới trong PHP 8. 1
Trong bài viết này, chúng ta sẽ nói một chút về các tính năng, thay đổi và cải tiến mới sắp ra mắt.
9 Xu hướng phát triển web và CNTT cho năm 2022
Hãy xem trong bài viết này chín xu hướng CNTT và phát triển web quan trọng mà bạn nên theo dõi trong
Trong PHP, các biến thành viên của lớp còn được gọi là thuộc tính. Các biến này là một phần của định nghĩa lớp và được sử dụng để biểu diễn trạng thái của một thể hiện của lớp [i. e. , để phân biệt một thể hiện của lớp này với một thể hiện khác]. Trong thực tế, bạn có thể thường muốn xử lý việc đọc hoặc viết các thuộc tính theo những cách đặc biệt. Ví dụ: bạn có thể luôn muốn cắt một chuỗi khi nó được gán cho thuộc tính label
. Bạn có thể sử dụng đoạn mã sau để đạt được nhiệm vụ này
$object->label = trim[$label];
Hạn chế của đoạn mã trên là bạn sẽ phải gọi trim[]
ở mọi nơi trong mã của mình, nơi bạn có thể đặt thuộc tính label
. Nếu trong tương lai, thuộc tính label
có một yêu cầu mới, chẳng hạn như chữ cái đầu tiên phải được viết hoa, bạn sẽ lại phải sửa đổi từng đoạn mã gán giá trị cho label
. Việc lặp lại mã dẫn đến lỗi và là điều bạn muốn tránh càng nhiều càng tốt
Để giải quyết vấn đề này, Yii giới thiệu một lớp cơ sở gọi là yii\base\BaseObject hỗ trợ xác định các thuộc tính dựa trên các phương thức của lớp getter và setter. Nếu một lớp cần chức năng đó, nó sẽ mở rộng từ yii\base\BaseObject hoặc từ một lớp con
Thông tin. Gần như mọi lớp cốt lõi trong khung công tác Yii đều mở rộng từ yii\base\BaseObject hoặc một lớp con. Điều này có nghĩa là bất cứ khi nào bạn nhìn thấy một getter hoặc setter trong một lớp lõi, bạn có thể sử dụng nó như một thuộc tính
Phương thức getter là phương thức có tên bắt đầu bằng từ get
; . Tên sau tiền tố get
hoặc set
xác định tên của thuộc tính. Ví dụ: getter
namespace app\components;
use yii\base\BaseObject;
class Foo extends BaseObject
{
private $_label;
public function getLabel[]
{
return $this->_label;
}
public function setLabel[$value]
{
$this->_label = trim[$value];
}
}
1 và/hoặc setter namespace app\components;
use yii\base\BaseObject;
class Foo extends BaseObject
{
private $_label;
public function getLabel[]
{
return $this->_label;
}
public function setLabel[$value]
{
$this->_label = trim[$value];
}
}
2 xác định thuộc tính có tên label
, như được hiển thị trong đoạn mã saunamespace app\components;
use yii\base\BaseObject;
class Foo extends BaseObject
{
private $_label;
public function getLabel[]
{
return $this->_label;
}
public function setLabel[$value]
{
$this->_label = trim[$value];
}
}
Để rõ ràng, các phương thức getter và setter tạo thuộc tính label
, trong trường hợp này nội bộ đề cập đến một thuộc tính riêng có tên
namespace app\components;
use yii\base\BaseObject;
class Foo extends BaseObject
{
private $_label;
public function getLabel[]
{
return $this->_label;
}
public function setLabel[$value]
{
$this->_label = trim[$value];
}
}
5Các thuộc tính được xác định bởi getters và setters có thể được sử dụng như các biến thành viên của lớp. Sự khác biệt chính là khi thuộc tính đó được đọc, phương thức getter tương ứng sẽ được gọi; . Ví dụ
Một thuộc tính được xác định bởi một getter không có setter chỉ được đọc. Cố gắng gán một giá trị cho một thuộc tính như vậy sẽ gây ra UnlimitedCallException. Tương tự, một thuộc tính được xác định bởi setter không có getter chỉ được ghi và việc cố gắng đọc một thuộc tính như vậy cũng sẽ gây ra ngoại lệ. Không phổ biến khi có các thuộc tính chỉ ghi
Có một số quy tắc đặc biệt và giới hạn đối với các thuộc tính được xác định thông qua getters và setters
- Tên của các thuộc tính đó không phân biệt chữ hoa chữ thường. Ví dụ:
6 vànamespace app\components; use yii\base\BaseObject; class Foo extends BaseObject { private $_label; public function getLabel[] { return $this->_label; } public function setLabel[$value] { $this->_label = trim[$value]; } }
7 giống nhau. Điều này là do tên phương thức trong PHP không phân biệt chữ hoa chữ thườngnamespace app\components; use yii\base\BaseObject; class Foo extends BaseObject { private $_label; public function getLabel[] { return $this->_label; } public function setLabel[$value] { $this->_label = trim[$value]; } }
- Nếu tên của một thuộc tính như vậy giống với một biến thành viên của lớp, thì thuộc tính sau sẽ được ưu tiên. Ví dụ, nếu lớp
8 ở trên có một biến thành viên lànamespace app\components; use yii\base\BaseObject; class Foo extends BaseObject { private $_label; public function getLabel[] { return $this->_label; } public function setLabel[$value] { $this->_label = trim[$value]; } }
label
, thì phép gánlabel
0 sẽ ảnh hưởng đến biến thành viênlabel
; - Các thuộc tính này không hỗ trợ khả năng hiển thị. Phương thức getter hoặc setter xác định không có gì khác biệt nếu thuộc tính là công khai, được bảo vệ hoặc riêng tư
- Các thuộc tính chỉ có thể được xác định bởi getters và/hoặc setters không tĩnh. Các phương thức tĩnh sẽ không được xử lý theo cách tương tự
- Một cuộc gọi bình thường đến
label
3 không hoạt động để xác định các thuộc tính ma thuật. Bạn nên gọi hoặc tương ứng
Quay trở lại vấn đề được mô tả ở phần đầu của hướng dẫn này, thay vì gọi trim[]
ở mọi nơi mà giá trị label
được gán, thì bây giờ chỉ cần gọi trim[]
trong setter
namespace app\components;
use yii\base\BaseObject;
class Foo extends BaseObject
{
private $_label;
public function getLabel[]
{
return $this->_label;
}
public function setLabel[$value]
{
$this->_label = trim[$value];
}
}
2. Và nếu một yêu cầu mới khiến nhãn phải được viết hoa ban đầu, thì phương pháp namespace app\components;
use yii\base\BaseObject;
class Foo extends BaseObject
{
private $_label;
public function getLabel[]
{
return $this->_label;
}
public function setLabel[$value]
{
$this->_label = trim[$value];
}
}
2 có thể nhanh chóng được sửa đổi mà không cần chạm vào bất kỳ mã nào khác. Một thay đổi sẽ ảnh hưởng chung đến mọi nhiệm vụ đối với label