Hướng dẫn readonly php - chỉ đọc php

  • PHP.Watch
  • Phiên bản
  • 8.1

Php 8.1 mang lại hỗ trợ cho các thuộc tính lớp chỉ đọc. Một thuộc tính lớp được tuyên bố chỉ đọc chỉ được phép khởi tạo một lần và không được phép thay đổi thêm đối với tài sản.

Thuộc tính lớp chỉ đọc được khai báo với từ khóa

$user = new User(42);
$user->uid = 56;
2* trong một thuộc tính được đánh máy.

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}

$user = new User(42);

Các giá trị thuộc tính chỉ đọc chỉ có thể được đặt từ chính lớp, từ hàm tạo hoặc phương thức khác. Sau khi được đặt, không có sửa đổi nào được phép cho thuộc tính đó, ngay cả từ trong lớp.

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
$user = new User(42);
$user->uid = 56;
Error: Cannot modify readonly property User::$uid in ...:...

$user = new User(42); $user->uid = 56;2 dưới dạng tên hàm

Từ Php 8.1 trở lên,

$user = new User(42);
$user->uid = 56;
2 là từ khóa PHP dành riêng. Tuy nhiên, nó rõ ràng cho phép khai báo các chức năng với tên
$user = new User(42);
$user->uid = 56;
2 để phù hợp với các ứng dụng PHP hiện có khai báo các hàm
$user = new User(42);
$user->uid = 56;
2 của riêng chúng, chẳng hạn như WordPress.

Trình xây dựng $user = new User(42); $user->uid = 56;2 thuộc tính

Các thuộc tính của hàm tạo, được giới thiệu trong PHP 8.0 cũng hỗ trợ cờ

$user = new User(42);
$user->uid = 56;
2 mới trong hàm tạo.

class User {
    public function __construct(public readonly int $uid) {}
}

Tuyên bố ở trên tương đương với:

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}

Khởi tạo tài sản

Một thuộc tính được khai báo

$user = new User(42);
$user->uid = 56;
2 có thể được khởi tạo từ bất cứ nơi nào bên trong lớp. Nó có ý nghĩa hơn để khởi tạo các thuộc tính chỉ đọc từ hàm tạo, nhưng nó không bắt buộc phải làm như vậy.

class User {
    public readonly int $uid;

    public function fetch(int $uid) {
        $this->uid = $uid;
    }
}

$user = new User();
$user->fetch(42);

Đoạn trích ở trên là hợp lệ, vì thuộc tính

$user = new User(42);
$user->uid = 56;
2
Error: Cannot modify readonly property User::$uid in ...:...
1 chỉ được viết một lần, từ phương thức
Error: Cannot modify readonly property User::$uid in ...:...
2. Tuy nhiên, một cuộc gọi thứ hai đến hàm
Error: Cannot modify readonly property User::$uid in ...:...
2 đã gây ra lỗi, bởi vì nó liên quan đến việc ghi đè thuộc tính
Error: Cannot modify readonly property User::$uid in ...:...
1.

$user = new User();
$user->fetch(42);
$user->fetch(16);
Error: Cannot modify readonly property User::$uid in ...:...

Không được phép khởi tạo một thuộc tính

$user = new User(42);
$user->uid = 56;
2 bên ngoài phạm vi của lớp: không được phép:outside the scope of the class is not allowed:

class User {
    public readonly int $uid;
}
$user = new User();
$user->uid = 9;
class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
0

Thực thi chỉ đọc

PHP chủ động từ chối sửa đổi thuộc tính

$user = new User(42);
$user->uid = 56;
2. Điều này bao gồm việc đặt trực tiếp một giá trị, tăng cường nó, tài liệu tham khảo và các hoạt động mảng.

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}

$user = new User(42);

Không cho phép danh sách các thay đổi không khởi động sau đây:

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
2
class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
3
class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
4

Tháo thuộc tính $user = new User(42); $user->uid = 56;2

Hơn nữa, việc không giải quyết được một thuộc tính

$user = new User(42);
$user->uid = 56;
2 đã được khởi tạo cũng không được phép:

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
5
class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
6

Giới hạn

$user = new User(42);
$user->uid = 56;
2 Thuộc tính có thể giảm đáng kể mã nồi hơi thường được sử dụng để giới hạn quyền truy cập ghi vào các thuộc tính của lớp, giờ đây có thể được đơn giản hóa bằng thuộc tính
class User {
    public function __construct(public readonly int $uid) {}
}
0. Tuy nhiên, cờ
$user = new User(42);
$user->uid = 56;
2 có thể không phù hợp lý tưởng trong các trường hợp sử dụng nhất định.

Chỉ được hỗ trợ trên các thuộc tính gõ

Các thuộc tính chỉ đọc chỉ được hỗ trợ trên thuộc tính gõ. Điều này là do các thuộc tính được khai báo mà không có loại được ngầm

class User {
    public function __construct(public readonly int $uid) {}
}
2 cho đến khi một giá trị được đặt và không tương thích với hạn chế chỉ đọc. Các thuộc tính được đánh máy được "không chính thức hóa" cho đến khi một giá trị được đặt.

Cố gắng khai báo thuộc tính

$user = new User(42);
$user->uid = 56;
2 mà không có loại dẫn đến lỗi:

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
7
class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
8

Tính đột biến

Một thuộc tính

$user = new User(42);
$user->uid = 56;
2 không cung cấp tính bất biến cho các đối tượng. Ví dụ: nếu thuộc tính
$user = new User(42);
$user->uid = 56;
2 giữ một đối tượng, chính đối tượng đó có thể thay đổi:

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
9

Trong đoạn trích ở trên, lớp

class User {
    public function __construct(public readonly int $uid) {}
}
6 được lưu trữ một thuộc tính
$user = new User(42);
$user->uid = 56;
2
class User {
    public function __construct(public readonly int $uid) {}
}
8. Bản thân đối tượng
class User {
    public function __construct(public readonly int $uid) {}
}
9 có thể thay đổi và thuộc tính
$user = new User(42);
$user->uid = 56;
2 không ngăn chặn các sửa đổi cho chính đối tượng.

Nếu cần có tính bất biến, hãy đảm bảo

class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
1 đối tượng trước khi gán:

$user = new User(42);
$user->uid = 56;
0

Tác động tương thích ngược

$user = new User(42);
$user->uid = 56;
2 là một từ khóa dành riêng trong Php 8.1. Bất kỳ lớp hiện có hoặc các ký hiệu khác sử dụng tên
$user = new User(42);
$user->uid = 56;
2 (trường hợp không nhạy cảm) sẽ dẫn đến lỗi cú pháp trong Php 8.1.

Không thể chuyển chức năng

$user = new User(42);
$user->uid = 56;
2 cho các phiên bản PHP cũ hơn. Tuy nhiên, các chú thích
class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
5 /
class User {
    public readonly int $uid;

    public function __construct(int $uid) {
        $this->uid = $uid;
    }
}
6 được hiểu bởi các máy phân tích tĩnh như thánh vịnh.

$user = new User(42);
$user->uid = 56;
1

Thực hiện thảo luận RFC