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:

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

?>
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?
jiSh@n viết 01:56 ngày 10/10/2018
Dùng protected. Học OOP cho kỹ 1 chút đi
pigeeken viết 01:53 ngày 10/10/2018
Để đọc hay ghi giá trị cho 1 property, bạn nên cung cấp cho nó các cặp phương thức set/get tương ứng để đọc và ghi giá trị:
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 . . .
cái nick đó viết 01:51 ngày 10/10/2018
To jiSh@n: có lẽ bác hiểu lầm ý em nhỉ . Em đang tìm 1 giải pháp tối ưu cho việc tạo 1 class vừa có các properties:
- 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 .
binhvn viết 02:03 ngày 10/10/2018
xài hằng thử coi
PHP Code:
<?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 

?>
jiSh@n viết 01:56 ngày 10/10/2018
Quote Được gửi bởi cái nick đó View Post
- private read/write
- protected read/write
- protected read-only
- protected write-only
- public read/write
- public read-only
- public write-only
Những thứ này vốn ko tồn tại trong khái niệm scope của OOP. Muốn phục vụ cho mục đích "tự chế" thì phải "tự chế" code thôi
cái nick đó viết 01:58 ngày 10/10/2018
em cũng ko rõ lắm, tại thấy mấy khái niệm này khi code VB.NET nên mới hỏi thử PHP thế nào

Code:
Dim prop As String = "abc"

Public ReadOnly Property abc() As String
    Get
        Return prop
    End Get
End Property
Xem ra viết từng function set/get là tốt nhất nhẩy

PHP Code:
private $property 'abc';

function 
getProperty() {
    return 
$this->property;

Bài liên quan
0