09/10/2018, 23:48
Class trong PHP5: tạo thuộc tính private & read-only
Chào các bác,
Em có vấn đề thế này: em muốn tạo một class với một số property là private (ko được truy cập) và một số property là chỉ đọc (được truy cập nhưng ko được gán giá trị). Đây là giải pháp của em:
Làm thế nào để khi truy cập tới một property là private thì nó tự động báo lỗi thay vì check thủ công từng cái 1 và trả về null như đoạn code trên?
Em có vấn đề thế này: em muốn tạo một class với một số property là private (ko được truy cập) và một số property là chỉ đọc (được truy cập nhưng ko được gán giá trị). Đây là giải pháp của em:
PHP Code:
<?php
class System {
private $private = 'private';
private $readOnly = 'read-only';
public function __get($varName) {
$result = null;
if ($varName != 'private') {
$result = $this->$varName;
}
return $result;
}
}
$system = new System();
echo $system->private; // trả về null
echo $system->readOnly; // trả về 'read-only'
$system->readOnly = 'New Value'; // báo lỗi
?>
Bài liên quan
VD:
class System {
private $iProperty1 = 0;
private $sProperty2 = '';
function setProperty1($iProperty1) {
$this->iProperty1 = $iProperty1;
}
function getProperty1() {
return $this->iProperty1;
}
function getProperty2() {
return $this->sProperty2;
}
}
Nhìn VD trên thì bạn thấy Property1 đươc phép đọc/ghi trong khi Property2 chỉ được đọc ra . . . Tùy mục đích của bạn . . .
- private read/write
- protected read/write
- protected read-only
- protected write-only
- public read/write
- public read-only
- public write-only
Xài cái protected thì khi truy cập $system->protected từ public nó cũng chạy cái callback __get() thôi, vẫn phải check như private mà
To pigeeken: cách đó em cũng nghĩ rồi, có lẽ nó chắc ăn nhất nhưng mà dài quá, ko biết PHP có cách nào đơn giản hơn không . Nếu không có thì phải xài tới kiểu dài đó thôi .
<?php
class System {
private $private = 'private';
const readOnly = 'read-only';
public function __get($varName) {
$result = null;
if ($varName != 'private') {
$result = $this->$varName;
}
return $result;
}
}
$system = new System();
echo $system->private; // trả về null
echo System::readOnly; // trả về 'read-only'
System::readOnly = 'New Value'; // báo lỗi
?>
private $property = 'abc';
function getProperty() {
return $this->property;
}