5
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi không thể phát hiện ra, hoặc có thể tôi đang nghĩ sai nhưng tôi cần tạo một biến không thể thay đổi, như chỉ đọc, một cái gì đó như:
final $finalVar = 'extremely secret number'; // don't change
$finalVar = 'hacked...'; // THROW I GIANT BIG ERROR HERE !
Đã hỏi ngày 29 tháng 12 năm 2016 lúc 14:16Dec 29, 2016 at 14:16
Vdegennevdegennevdegenne
Huy hiệu vàng 11K1414 gold badges75 silver badges101 bronze badges
9
Ngoài các hằng số [như đã đề cập trong bình luận], cách duy nhất tôi có thể nghĩ đến để làm điều này là sử dụng mối quan hệ cha mẹ và con cái với biến private
class ParentC {
private $var = 'bob';
}
class ChildC extends ParentC {
public function setVar[] {
// Fatal error: Uncaught Error: Cannot access private property ParentC::$var
echo parent::$var;
}
}
Lưu ý rằng có một cách hacky xung quanh việc sử dụng lớp phản xạ. Nhưng, phần lớn, bạn không thể chạm vào biến phụ huynh private
từ lớp con
Đã trả lời ngày 29 tháng 12 năm 2016 lúc 14:36Dec 29, 2016 at 14:36
Machavity ♦ Machavity♦Machavity
30.2k26 Huy hiệu vàng87 Huy hiệu bạc98 Huy hiệu đồng26 gold badges87 silver badges98 bronze badges
2
Bạn có thể sử dụng các hằng số nếu bạn muốn tạo các biến mà bạn không muốn thay đổi:
class MyClass {
const VERSION = '2.1'; // This constant can be view outside the class,
// but its value can't be changed even in this class
function myMethod [] {
echo self::VERSION; // Inside class
}
}
hoặc bên ngoài lớp học:
echo MyClass::VERSION;
Phương pháp tiếp cận chức năng:
define ['VERSION', '2.1'];
echo VERSION;
Đã trả lời ngày 3 tháng 8 năm 2019 lúc 15:03Aug 3, 2019 at 15:03
AcunaacunaAcuna
1.59715 Huy hiệu bạc19 Huy hiệu đồng15 silver badges19 bronze badges
Mặc dù đã có cuộc nói chuyện về các biến chỉ đọc kể từ ít nhất là năm 2012, với thậm chí RFC đề xuất nó trên các đối tượng, nhưng sự hỗ trợ không tồn tại trong ngôn ngữ.
Một cách để đạt được một biến chỉ đọc [hoặc bộ sưu tập các biến chỉ đọc, vì có thể quan trọng với các giá trị cấu hình nhất định] là với một thùng chứa trung gian:
class Readonly {
public function __construct[...$vars] {
$this->vars;
}
public function __set[$var, $value] {
if [array_key_exists[$var, $this->vars]] {
throw new \LogicException["Variable $var is read-only"];
} else {
$this->vars[$var] = $value;
}
}
public function __get[$var] {
return array_key_exists[$var, $this->vars] ? $this->vars[$var] : null;
}
protected $vars = [];
}
Cho phép bạn tạo một thùng chứa các biến chỉ đọc:
$config = new Readonly['apikey'];
$config->apikey = 'A01AB020'; // this works, first time set
echo $config->apikey;
$config->apikey = '00000000'; // boom! it's "final"
Đã trả lời ngày 29 tháng 12 năm 2016 lúc 14:40Dec 29, 2016 at 14:40
Giám mụcbishop
35.6K10 Huy hiệu vàng100 Huy hiệu bạc133 Huy hiệu đồng10 gold badges100 silver badges133 bronze badges
3
Sử dụng không đổi:
defined['VARIABLE'] OR define['VARIABLE', 'value'];
Tài liệu: Xác định được xác định
Blaztix
1.1651 Huy hiệu vàng18 Huy hiệu bạc28 Huy hiệu đồng1 gold badge18 silver badges28 bronze badges
Đã trả lời ngày 19 tháng 2 năm 2019 lúc 11:43Feb 19, 2019 at 11:43
0
Với Php 8.1, giờ đây bạn có thể khai báo một biến là Readonly:
class MyClass{
public readonly string $prop;
public function __construct[string $val] {
// Can be intialized only once.
$this->prop = $val;
}
}
$myclass = new MyClass['Foo'];
$myclass->prop; // Read the property
$myclass->prop = 'Bar'; // Error: Cannot modify readonly property
Lưu ý rằng bạn chỉ có thể áp dụng các thuộc tính được gõ.
Đã trả lời ngày 26 tháng 11 năm 2021 lúc 9:50Nov 26, 2021 at 9:50
Grunkgrunkgrunk
14.4K14 Huy hiệu vàng65 Huy hiệu bạc107 Huy hiệu đồng14 gold badges65 silver badges107 bronze badges