Tôi cần tạo một lớp không thay đổi mà chỉ đơn giản là vùng chứa thành viên. Tôi muốn các trường của nó được khởi tạo một lần trong hàm tạo của nó (các giá trị sẽ được đưa ra như các tham số cho hàm tạo). Tôi muốn các lĩnh vực được công khai nhưng không thay đổi. Tôi có thể thực hiện nó với Java bằng cách sử dụng từ khóa final
trước mỗi trường. Làm thế nào là nó được thực hiện trong PHP?PHP: các trường thành viên công khai không thể thay đổi
10
A
Trả lời
16
Bạn nên sử dụng __set
và __get
magic method và kê khai tài sản đó như protected hay private:
class Example
{
private $value;
public function __construct()
{
$this->value = "test";
}
public function __get($key)
{
if (property_exists($this, $key)) {
return $this->{$key};
} else {
return null; // or throw an exception
}
}
public function __set($key, $value)
{
return; // or throw an exception
}
}
Cách sử dụng:
$example = new Example();
var_dump($example->value);
$example->value = "invalid";
var_dump($example->value);
Output:
string(4) "test"
string(4) "test"
2
Bạn có thể sử dụng phương pháp ma thuật __set()
và ném ngoại lệ khi ai đó cố gắng đặt thuộc tính trực tiếp.
class ClassName {
public function __set($key, $value) {
throw new Exception('Can't modify property directly.');
}
}
Tuy nhiên, điều này sẽ ngăn việc sửa đổi thuộc tính bất kể chúng có công khai hay không.
2
để bạn có thể làm tốt hơn - nếu bạn có một số dinamyc ruộng
class ClassName {
private $fields = array();
// use class : $cl = new ClassName(array('f'=>2,'field_4'=>5,''12));
// echo $cl->field_4; echo $cl->f;
public function __construct($data= array())
{
if (!is_array($data) || !count($data)) throw new Exception('Not enough args')
foreach ($data as $key=>$val)
{
if (is_numeric($key))
$this->fields['field_'.$key] = $val;
else
$this->fields[$key] = $val;
}
}
/* in this case you can use this class like $cl = new ClassName(12,14,13,15,12); echo $cl->field_1;
public function __construct()
{
$ata = funcs_get_args();
if (!count($data)) throw new Exception('Not enough args')
foreach ($data as $key=>$val)
{
if (is_numeric($key))
$this->fields['field_'.$key] = $val;
else
$this->fields[$key] = $val;
}
}
*/
public function __get($var) {
if (isset($this->fields[$var]))
return $this->fields[$var];
return false;
//or throw new Exception ('Undeclared property');
}
}
+4
'__set' không được gọi cho các thuộc tính công khai – sanmai
Các vấn đề liên quan
- 1. Tại sao xác định các thành viên riêng dưới các thành viên công khai trong C++?
- 2. Thành viên có thể thay đổi không cho phép tối ưu hóa const cho các thành viên không thể thay đổi không?
- 3. không thể truy cập vào thành viên của lớp org.springframework.aop.TruePointcut với công cụ sửa đổi công khai
- 4. biến thành viên có thể thay đổi tĩnh trong C++?
- 5. C++: Làm thế nào một hàm thành viên tĩnh công khai truy cập các biến thành viên cá thể riêng?
- 6. Các thành viên 'X' đã được thay đổi không phù hợp với các thành viên hiệp hội 'Y'
- 7. Tại sao biến thành viên riêng tư có thể được thay đổi bởi cá thể lớp?
- 8. Sự khác biệt giữa các thành viên lớp học công khai và công khai ở Delphi là gì?
- 9. Không phải thành viên công cộng cho giao diện C#
- 10. C# ghi đè lên thành viên công khai và đặt thành riêng tư
- 11. ClientBase không triển khai thành viên IDisposable
- 12. Không thể khai báo các thành viên cá thể trong một lớp tĩnh trong C#
- 13. Tự động thay đổi thành công khai thành riêng tư (Java)
- 14. Lỗi C++: Không khai báo thành viên
- 15. Các đối tượng không thể thay đổi trong PHP?
- 16. Có công cụ nào sẽ triển khai giao diện bằng cách gói một trường hoặc thuộc tính thành viên không?
- 17. PHP session_start không thành công
- 18. C#, bất biến và các trường chỉ đọc công khai
- 19. Triển khai VoltDB thành công
- 20. Chia sẻ lại các trường thay đổi thành chỉ đọc
- 21. Chức năng cha mẹ PHP không thể xem các thành viên của lớp con
- 22. Thay đổi các phím Array thành số trong PHP
- 23. Không thể thay đổi giá trị thành viên struct của bên bộ sưu tập chung
- 24. Trình tự các trường thành viên trong Enum
- 25. Tại sao có thuộc tính trống được đặt thay vì sử dụng biến thành viên công khai?
- 26. Tại sao lại sử dụng các thuộc tính công khai cho các trường riêng trong C#?
- 27. Thay đổi tên người dùng theo cách thủ công trong Thành viên Asp.Net
- 28. Không thể tạo tham chiếu tĩnh cho thành viên trường không tĩnhVariable với biến riêng
- 29. hook trước revprop-thay đổi hoặc không thành công
- 30. PHP thay đổi cũ mysql_query thành PDO
này là không thể trong PHP. – Sjoerd
Tại sao các trường phải được công khai? – Pete171
@ pete171 có lẽ vì vậy chúng chỉ đọc – fbstj