Hướng dẫn which properties cannot be declared as final in php? - Thuộc tính nào không thể được khai báo là cuối cùng trong php?

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

Hướng dẫn which properties cannot be declared as final in php? - Thuộc tính nào không thể được khai báo là cuối cùng trong php?

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

Hướng dẫn which properties cannot be declared as final in php? - Thuộc tính nào không thể được khai báo là cuối cùng trong php?

Machavity ♦ MachavityMachavity

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

Hướng dẫn which properties cannot be declared as final in php? - Thuộc tính nào không thể được khai báo là cuối cùng trong php?

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

Hướng dẫn which properties cannot be declared as final in php? - Thuộc tính nào không thể được khai báo là cuối cùng trong php?

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

Phương thức Run () có thể được khai báo là cuối cùng?

ANS) Có, phương pháp cuối cùng được kế thừa nhưng bạn không thể ghi đè nó.Ví dụ: class Bike {Final void Run () {System.out.println ("Chạy ...");}Yes, final method is inherited but you cannot override it. For Example: class Bike{ final void run(){System.out.println("running...");}

Các thuộc tính của một lớp cuối cùng là gì?

Một lớp cuối cùng chỉ đơn giản là một lớp không thể mở rộng ...
Một lớp cuối cùng không thể được mở rộng bởi bất kỳ lớp nào khác ..
Một biến cuối cùng không thể được chỉ định lại một giá trị khác ..
Một phương pháp cuối cùng không thể bị ghi đè ..

Phương pháp cuối cùng trong PHP là gì?

Phương pháp cuối cùng: Một phương thức được coi là một phương thức cuối cùng nếu nó được đặt trước với từ khóa cuối cùng.Các phương pháp cuối cùng là các phương pháp không thể được ghi đè.Vì vậy, các phương pháp này không thể được ghi đè trong các lớp con/con.methods that cannot be overridden. So, these methods can't be overridden in child/subclasses.

Chúng ta có thể tuyên bố biến là cuối cùng không?

Các biến cuối cùng Nếu một biến được khai báo với từ khóa cuối cùng, giá trị của nó không thể được thay đổi sau khi khởi tạo.Lưu ý rằng biến không nhất thiết phải được khởi tạo tại thời điểm khai báo.Nếu nó được khai báo nhưng chưa được khởi tạo, nó được gọi là biến cuối cùng trống.If a variable is declared with the final keyword, its value cannot be changed once initialized. Note that the variable does not necessarily have to be initialized at the time of declaration. If it's declared but not yet initialized, it's called a blank final variable.