PHP lấy tên đối tượng

Chúng ta có thể lấy tên lớp không gian tên đủ điều kiện của một đối tượng bằng cách sử dụng hàm

get_class[$object] === $object::class;
2. Giả sử rằng lớp đối tượng của chúng ta có ít nhất một không gian tên. Nếu chúng ta chỉ muốn lấy tên lớp, chúng ta có thể sử dụng lớp phản chiếu để lấy tên viết tắt của lớp

>>> get_class[$obj];
=> "App\Models\Project"
>>> [new \ReflectionClass[$obj]]->getShortName[];
=> "Project"

Một tùy chọn khác là thực sự lấy tên lớp được đặt tên đủ điều kiện của đối tượng và lấy tên lớp thông qua thao tác chuỗi

>>> end[explode['\\', get_class[$obj]]];
=> "Project"

Xin lưu ý rằng chúng ta cần thoát khỏi dấu gạch chéo ngược

get_class[$object] === $object::class;
3

get_class[$object] === $object::class;
4

get_class[$object] === $object::class;
5

get_class[$object] === $object::class;
6

get_class[$object] === $object::class;
7

PHP có hằng số ma thuật

get_class[$object] === $object::class;
8 phân giải tên lớp thành tên lớp đủ điều kiện của nó. Khi được sử dụng với một tên lớp, các câu lệnh
get_class[$object] === $object::class;
9 và
$object = array[];
$object::class;

// Fatal error: Uncaught TypeError: Cannot use ::class on value of type array in ...:...
0 sẽ được giải quyết hoặc không gian tên hiện tại sẽ được thêm tiền tố để làm cho nó trở thành một tên lớp đủ điều kiện

Thí dụ


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"

Cho đến PHP 8. 0, hằng số ma thuật

get_class[$object] === $object::class;
8 không được phép trên các đối tượng

$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.

Với PHP8. 0, bây giờ bạn có thể sử dụng hằng số

get_class[$object] === $object::class;
8 trên các đối tượng và nó sẽ được giải quyết chính xác trong thời gian chạy

$object = new Foo\Bar[];
echo $object::class;

// PHP 8.0+:
// "Foo\Bar"

Kết quả tương tự như
$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
1

Hằng số

get_class[$object] === $object::class;
8 trên một đối tượng được khởi tạo sẽ trả về giá trị trả về chính xác giống như một lệnh gọi
$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
1

get_class[$object] === $object::class;

Không phải đối tượng không được phép

Không được phép sử dụng

get_class[$object] === $object::class;
8 trên một đối tượng không phải đối tượng

________số 8

Nếu bạn cần lấy kiểu của bất kỳ biến nào, PHP 8. 0 đi kèm với một hàm

$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
5 mới mà bạn có thể gọi để lấy tên lớp, loại vô hướng, loại tài nguyên, v.v. tất cả từ một hàm tiện dụng

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

Trong các phiên bản PHP trước 8. 0, sử dụng

get_class[$object] === $object::class;
8 trên một đối tượng sẽ gây ra lỗi nghiêm trọng. Bởi vì PHP 8. 0 đang nới lỏng lỗi này, điều này sẽ không tạo ra bất kỳ sự cố BC mới nào. Tuy nhiên, điều này sẽ làm cho mã của bạn yêu cầu PHP 8. 0 để chạy mà không có cách nào để bổ sung chức năng này cho các phiên bản cũ hơn

Hàm get_class[] là một hàm có sẵn trong PHP được sử dụng để trả về tên lớp của một đối tượng

cú pháp

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
0

Thông số. Hàm này chấp nhận tham số duy nhất $object chứa đối tượng cần kiểm tra. Giá trị của tham số này có thể được bỏ qua bên trong lớp

Giá trị trả về. Hàm này trả về tên lớp của đối tượng nào là một thể hiện. Nó trả về FALSE nếu đối tượng không phải là đối tượng. Nếu đối tượng bị bỏ qua khi ở trong lớp thì tên lớp được trả về

PHP hiện đại chủ yếu dựa vào kiểu hướng đối tượng để cấu trúc mã. Bạn sẽ tìm thấy phong cách này trong nhiều thư viện, khuôn khổ và dự án

Đối tượng là gì?

Trong PHP

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
17 là một trong những kiểu nguyên thủy. Nó mô tả một giá trị là một gói dữ liệu và thường logic để hoạt động trên dữ liệu đó

Một đối tượng cho phép bạn xử lý các cấu trúc dữ liệu phức tạp dưới dạng các giá trị đơn lẻ. Hãy lấy một địa chỉ làm ví dụ. Nó bao gồm một số mẩu dữ liệu

  • đường phố
  • số nhà
  • thành phố
  • mã bưu điện
  • quốc gia

Với các kiểu nguyên thủy đơn giản hơn, chúng tôi không thể lưu trữ địa chỉ theo cách có ý nghĩa, vì vậy chúng tôi cần cấu trúc dữ liệu để lưu trữ địa chỉ trong một giá trị duy nhất để đảm bảo, chúng tôi theo dõi mọi phần dữ liệu thuộc về nó

Chúng tôi cũng cần đảm bảo rằng tất cả các địa chỉ đều có cùng cấu trúc để các phần của ứng dụng xử lý địa chỉ có thể dựa vào. Ví dụ: thuộc tính

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
18 của một địa chỉ phải luôn có cùng tên. Nếu đôi khi nó được gọi là
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
19, nó sẽ dẫn đến sự không nhất quán và các lỗi nguy hiểm tiềm ẩn

Để đảm bảo một cấu trúc đối tượng nhất định, chúng tôi sử dụng "lớp", một loại bản thiết kế cho một đối tượng

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
4
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
50 và định nghĩa rằng tất cả các đối tượng của lớp này đều có năm thuộc tính giống nhau mà chúng ta cần lưu trữ một địa chỉ

Tên lớp được viết theo phong cách gọi là

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
51. như
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
52

Để tạo một đối tượng địa chỉ từ lớp này, chúng ta sử dụng toán tử

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
53

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
1

đầu ra

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
5

Đầu ra cho chúng ta biết, nó là một

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
17 của lớp
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
55 và nó có 5 thuộc tính.
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
56 là ID nội bộ mà PHP gán cho mọi đối tượng để theo dõi chúng

Của cải

Bây giờ, mọi thuộc tính của đối tượng của chúng ta là

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
57, đây là giá trị đặc biệt của PHP cho "không có gì ở đây". Để điền giá trị địa chỉ này bằng dữ liệu thực tế, chúng tôi có thể đặt từng thuộc tính riêng lẻ


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
5

đầu ra


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
6

Để truy cập một thuộc tính của một đối tượng, PHP sử dụng toán tử

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
58, vì vậy
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
59 có nghĩa là "thuộc tính

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
50 của đối tượng trong biến

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
51"

phương pháp

Nhưng việc thiết lập từng thuộc tính đơn lẻ rất tẻ nhạt và không dễ đọc. Điều gì sẽ xảy ra nếu chúng ta có thể thiết lập tất cả cùng một lúc?

$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
1

đầu ra


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
6

Những gì chúng tôi đã thêm, là một phương pháp. Một hàm được thêm vào mọi đối tượng trong lớp của chúng tôi. Bên trong một phương thức, có một biến đặc biệt gọi là


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
52, nó tham chiếu đến đối tượng mà phương thức đó được gọi, trong trường hợp này là đối tượng địa chỉ

Phương thức


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
53 chỉ sao chép các giá trị mà nó nhận được thông qua các đối số của nó sang các thuộc tính đối tượng tương ứng

nhà xây dựng

Tạo một đối tượng địa chỉ mà không có bất kỳ dữ liệu nào ngay từ đầu không thực sự có ý nghĩa. Sẽ hữu ích và dễ sử dụng hơn nếu chúng ta có thể đặt dữ liệu ngay khi chúng ta tạo đối tượng. Có một phương pháp đặc biệt để làm điều đó, nó được gọi là "hàm tạo"

$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
5

Đầu ra sẽ vẫn như cũ một lần nữa. Nhưng lần này, chúng ta không cần gọi thêm một phương thức để khởi tạo đối tượng của mình. Nếu một lớp có một phương thức có tên chính xác là


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
54, nó sẽ được gọi khi đối tượng được tạo bằng toán tử
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
53. Tất cả các đối số từ cuộc gọi
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
53 cũng sẽ được chuyển đến hàm tạo

Hiển thị

Hiện tại, mọi thứ trong đối tượng

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
55 của chúng tôi đều có thể truy cập được từ bên ngoài. Một đoạn mã không hoạt động tốt có thể làm điều này

$object = new Foo\Bar[];
echo $object::class;

// PHP 8.0+:
// "Foo\Bar"
0

Chức năng đó sẽ sửa đổi một địa chỉ sau khi nó được tạo và chứa đầy dữ liệu. Điều đó thật vô nghĩa, một địa điểm không thay đổi địa chỉ, những con đường không chuyển sang một thành phố khác một cách kỳ diệu. Mọi người có thể chuyển đến một địa chỉ mới nhưng bản thân địa chỉ đó không thể thay đổi. Chúng tôi cần ngăn địa chỉ bị thay đổi sau khi được tạo. Đó là nơi khái niệm "khả năng hiển thị" xuất hiện. Bạn có thể đã tự hỏi, tất cả các từ khóa


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
58 cho đến bây giờ là gì

$object = new Foo\Bar[];
echo $object::class;

// PHP 8.0+:
// "Foo\Bar"
2

Bây giờ chúng tôi đã thay đổi khả năng hiển thị của các thuộc tính địa chỉ của chúng tôi thành


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
59. Chức năng

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
60 trước đây sẽ không thành công

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
10

Có ba cấp độ hiển thị trong PHP.


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
58,

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
59 và

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
63. Hiện tại,

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
58 có nghĩa là "có thể truy cập từ bên ngoài đối tượng và

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
59 có nghĩa là "không thể truy cập từ bên ngoài". Chúng ta sẽ đi vào chi tiết hơn về vấn đề này và ý nghĩa của

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
63 khi chúng ta nói về thừa kế sau

Bây giờ chúng ta có một đối tượng

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
55 đẹp bất biến [không thể thay đổi] nhưng nó không thể làm bất cứ điều gì. Chúng tôi thậm chí không thể đọc dữ liệu từ nó. Giả sử chúng ta cần những địa chỉ này ở dạng văn bản thuần túy, có thể gửi chúng qua email hoặc gửi chúng đến công ty vận chuyển cho trang web cửa hàng của chúng ta

Chúng tôi sẽ thêm một phương thức cung cấp cho chúng tôi dữ liệu địa chỉ trong một đoạn văn bản được định dạng đẹp mắt

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
11

Bây giờ chúng ta có thể tạo một địa chỉ và lấy biểu diễn văn bản được định dạng của nó

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
12

Và đầu ra sẽ là

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
13

Chúng ta có thể làm cho điều này thuận tiện hơn bằng cách sử dụng một "phương pháp kỳ diệu" khác. Các lớp PHP có một loạt các phương thức đặc biệt, tất cả đều bắt đầu bằng


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
68 và được thực thi tự động tại một số điểm nhất định,

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
69 cũng là một trong số đó

Lần này chúng ta sẽ tạo một phương thức

$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
10 từ
$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
11 của chúng ta. Nó được gọi mỗi khi đối tượng của chúng ta được sử dụng như thể nó là một chuỗi, ví dụ như khi chúng ta thử
$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
12

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
14

Bây giờ chúng ta chỉ có thể sử dụng địa chỉ như thể nó đã là một chuỗi

>>> end[explode['\\', get_class[$obj]]];
=> "Project"
15

Điều này sẽ tạo ra đầu ra giống như trước đây

Bây giờ chúng ta có một lớp cho các đối tượng địa chỉ gói dữ liệu [các thuộc tính] và một số logic [hàm tạo và phương thức toString] và được bảo vệ khỏi sự sửa đổi bên ngoài

tĩnh

Trong khi các thuộc tính và phương thức thường thuộc về các thể hiện của các lớp, có những trường hợp khi chính một lớp cần giữ các giá trị trong các thuộc tính hoặc cung cấp các phương thức. Chúng được gọi là các thuộc tính và phương thức của

$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
13

Phương pháp
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
4
$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
14 mà không tạo ra một thể hiện nào của
$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
15. Thay vì
>>> end[explode['\\', get_class[$obj]]];
=> "Project"
58, chúng tôi sử dụng
$object = new Foo\Bar[];
echo $object::class;

// Fatal error: Cannot use ::class with dynamic class name.
17 để truy cập các thuộc tính và phương thức tĩnh của một lớp

Các công cụ sửa đổi khả năng hiển thị [


namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
58,

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
59 và

namespace App\Demos;

use Foo\Bar;
use Bar\Baz as BBaz;

class Demo {}

// `use` statement is resolved:
echo Bar::class; // "Foo\Bar"

// `use` X `as` Y is resolved:
echo BBaz::class; // "Bar\Baz"

// Current namespace is resolved:
echo Demo::class; // "App\Demos\Demo"
63] áp dụng theo cách tương tự như đối với các phiên bản

Truy cập tĩnh ít phổ biến hơn trong PHP vì nó thường đưa ra các vấn đề tương tự như các biến toàn cục. một lớp có thuộc tính tĩnh về cơ bản giống như một biến toàn cục và có thể khiến bạn rất khó theo dõi nơi nó được thay đổi và nó được đọc từ đâu

Làm cách nào để lấy khóa đối tượng trong PHP?

Để chỉ hiển thị các khóa từ một đối tượng, hãy sử dụng array_keys[] trong PHP.

Làm cách nào để lấy tên lớp trong PHP?

Hàm get_class[] là một hàm có sẵn trong PHP được sử dụng để trả về tên lớp của một đối tượng.

Làm cách nào để truy cập biến đối tượng trong PHP?

Hàm is_object[] kiểm tra xem một biến có phải là đối tượng hay không. Hàm này trả về true [1] nếu biến là một đối tượng, ngược lại trả về false/nothing.

Làm cách nào để lấy mảng giá trị đối tượng trong PHP?

Đối tượng thành mảng PHP cũng được thực hiện với phương thức giải mã và mã hóa JSON . Trong phương thức này, hàm json_encode[] trả về một chuỗi được mã hóa JSON cho một giá trị nhất định. Hàm json_decode[] chấp nhận chuỗi được mã hóa JSON và chuyển đổi nó thành một mảng PHP.

Chủ Đề