Php không phải instanceof

Giá trị trả về. Hàm này trả về True nếu đối tượng thuộc lớp này hoặc có lớp này là một trong các cha của nó, nếu không nó sẽ trả về giá trị Sai

Các chương trình dưới đây minh họa hàm is_a()




// PHP program to illustrate the  

// is_a() function 

Yes
0

Yes
1

Yes
2
Yes
3

Yes
4_______0_______5
Yes
6
Yes
7
Yes
8
Yes
9

$a instanceof MyClass
0

Yes
0

$a instanceof MyClass
2

$a instanceof MyClass
3
Yes
7_______10_______5
$a instanceof MyClass
6

Yes
0

$a instanceof MyClass
8

$a instanceof MyClass
9

Yes
0
Yes
1
Yes
2
Yes
1
$a instanceof MyClass
3
Yes
5
Yes
6
Yes
7

Yes
4_______0_______9
// Short syntax (comparatively)
$a instanceof MyClass

is_a( $a, MyClass::class )
0
Yes
9

$a instanceof MyClass
0

Yes
0

// Short syntax (comparatively)
$a instanceof MyClass

is_a( $a, MyClass::class )
4

đầu ra.

Yes

toán tử instanceof
Toán tử instanceof được sử dụng trong PHP để tìm hiểu xem một đối tượng có phải là một thể hiện được khởi tạo của một lớp hay không

cú pháp

$a instanceof MyClass

Toán hạng. Toán tử này chứa hai toán hạng được liệt kê bên dưới

  • $a. Điều này được sử dụng như một đối tượng
  • Lớp học của tôi. Đó là một tên lớp

Giá trị trả về. Nó trả về True nếu đối tượng thuộc lớp này hoặc có lớp này là một trong các cha của nó, nếu không nó sẽ trả về giá trị Sai

lớp AnewClass mở rộng MyClass{}

$an_obj = new AnewClass();

if($an_obj instanceof AnewClass) {

echo "Đối tượng này là từ AnewClass \n";

/* Đối tượng cũng là một thể hiện của

lớp nó được bắt nguồn từ */

if($an_obj instanceof MyClass) {

echo "Đối tượng cũng từ MyClass ";

Ghi chú. Bài đăng này đã hơn hai năm tuổi và vì vậy thông tin ở đây có thể đã lỗi thời. Nếu bạn phát hiện ra điều gì đó, vui lòng để lại nhận xét và chúng tôi sẽ cố gắng khắc phục

Ngày 26 tháng 1 năm 2021 - thời gian đọc 9 phút

Toán tử instanceof trong PHP rất hữu ích trong việc đảm bảo rằng bạn đang xem xét một loại đối tượng trước khi hành động với nó. Mặc dù nó rất dễ sử dụng, nhưng việc sử dụng nó có thể dẫn đến một số tác dụng phụ không mong muốn

Như một ví dụ cơ bản, hãy tạo một vài giao diện và lớp để hiển thị hoạt động của toán tử instanceof. Thay vì chỉ có một số tên thử nghiệm, tôi đang sử dụng tên đối tượng mà bạn có thể tìm thấy trong hệ thống. Điều này bao gồm Người dùng và Đơn đặt hàng có thể tạo thành một phần của hệ thống thương mại

interface UserInterface {}
class User implements UserInterface {}

interface OrderInterface {}
class Order implements OrderInterface {}

Nếu chúng ta khởi tạo đối tượng Người dùng, chúng ta có thể phát hiện xem người dùng có phải là một thể hiện của lớp Người dùng như thế này không

$user = new User();
var_dump($user instanceof User); // Returns true

Khi đối tượng Người dùng triển khai một giao diện, chúng tôi cũng có thể phát hiện xem đối tượng Người dùng có phải là phiên bản của một giao diện như thế này không

var_dump($user instanceof UserInterface); // Returns true

Ngược lại, nếu chúng ta muốn xem biến $user mà chúng ta đã tạo có phải là một thể hiện của một loại đối tượng khác hay không thì nó sẽ trả về false, như thế này

var_dump($user instanceof Order); // Returns false

Nếu chúng tôi không chắc chắn loại giao diện hoặc đối tượng nào chúng tôi sẽ nhận thì chúng tôi có thể chuyển vào một biến chứa tên của giao diện

$interface = 'UserInterface';
var_dump($user instanceof $interface);

Lưu ý rằng chỉ truyền vào giao diện dưới dạng một chuỗi, như trong đoạn mã sau, sẽ tạo ra lỗi cú pháp. Mục bạn sử dụng để phát hiện loại đối tượng hoặc giao diện phải là một biến hoặc tên lớp hoặc giao diện đủ điều kiện

var_dump($user instanceof 'UserInterface');
// PHP Parse error:  syntax error, unexpected ''UserInterface'' (T_CONSTANT_ENCAPSED_STRING) in index.php on line 2

Việc phủ định thể hiện của toán tử ít đơn giản hơn một chút, nhưng có thể được thực hiện bằng cách đặt dấu chấm than ở đầu câu lệnh

var_dump(!$user instanceof UserInterface); // Returns false

Thông thường, nên đặt toàn bộ nội dung trong ngoặc đơn để bạn có thể chắc chắn về kết quả kiểm tra

var_dump(!($user instanceof UserInterface)); // Returns false

Bạn cũng có thể so sánh đầu ra của toán tử instanceof với false, điều này về cơ bản phủ định nó. Tôi thấy điều này khó đọc hơn một chút, mặc dù bạn cũng có thể lập luận rằng bạn có thể bỏ sót dấu chấm than

var_dump(FALSE === $user instanceof UserInterface); // Returns false

Khi các không gian tên có liên quan thì phải cẩn thận rằng sử dụng đúng cú pháp. Khi sử dụng không gian tên đủ điều kiện thì cần phải có dấu gạch chéo, nếu không sẽ không tìm thấy phiên bản phù hợp. Mặc dù vậy, có lẽ cách tốt nhất là không sử dụng không gian tên đủ điều kiện và chỉ dựa vào tên giao diện mà bạn đang tìm kiếm. Ví dụ sau đây đang xem giao diện Drupal có tên là FormStateInterface với ba cách viết tên lớp khác nhau

use Drupal\Core\Form\FormStateInterface;

var_dump($form_state instanceof Drupal\Core\Form\FormStateInterface); // returns false
var_dump($form_state instanceof \Drupal\Core\Form\FormStateInterface); // returns true
var_dump($form_state instanceof FormStateInterface); // returns true

Một kiểm tra instanceof duy nhất là đủ dễ hiểu, nhưng nếu bạn đang cố gắng phát hiện xem một đối tượng có phải là một trong một loạt các loại đối tượng hay không thì mã sẽ hơi khó đọc. Ví dụ: giả sử bạn đang cố gắng phát hiện xem một đối tượng có phải là một trong ba loại giao diện được xác định ở đầu bài hay không;

$user = new User();
var_dump($user instanceof User); // Returns true
0

Điều này trả về true, điều này cho biết rằng đối tượng là một trong các loại thể hiện mà chúng tôi đang tìm kiếm

Tôi đã tìm thấy một chức năng tốt cho phép nó được đóng gói gọn gàng trong khi đọc tràn ngăn xếp vào ngày khác (xem bình luận tràn ngăn xếp ban đầu tại đây). Để phát hiện xem một đối tượng có thuộc một trong các loại hay không, bạn có thể sử dụng hàm sau sẽ lấy một đối tượng và một mảng tên lớp

$user = new User();
var_dump($user instanceof User); // Returns true
1

Điều này có thể được chạy theo cách sau. Chuyển vào đối tượng người dùng đã tạo trước đó và một mảng chứa các loại phiên bản mà chúng tôi đang tìm kiếm dưới dạng chuỗi trả về true

$user = new User();
var_dump($user instanceof User); // Returns true
2

Toán tử instanceof cũng sẽ hoạt động đối với các đối tượng con. Lấy đoạn mã sau để tạo giao diện, xác định lớp Người dùng và sau đó xác định lớp Quản trị viên mở rộng lớp Người dùng

$user = new User();
var_dump($user instanceof User); // Returns true
3

Chúng tôi có thể khởi tạo các đối tượng Người dùng và Quản trị viên và cố gắng phát hiện chúng theo những cách khác nhau.  

$user = new User();
var_dump($user instanceof User); // Returns true
4

Điều cần lưu ý từ đoạn mã trên là đối tượng Người dùng không phải là phiên bản của đối tượng Quản trị viên và do đó so sánh trả về sai. Tuy nhiên, đối tượng Quản trị viên là một thể hiện của đối tượng Người dùng và do đó so sánh là đúng

Điều gì xảy ra sau đó, nếu chúng ta đang cố gắng phát hiện thể hiện của chỉ một đối tượng Quản trị viên chứ không phải đối tượng Người dùng. Thật không may, toán tử instanceof không thể được sử dụng ở đây. Thay vào đó, để phát hiện chỉ một loại lớp mà bạn đang tìm kiếm, bạn sẽ cần sử dụng phép so sánh khác bằng cách sử dụng phương thức get_class() PHP

$user = new User();
var_dump($user instanceof User); // Returns true
5

Lưu ý rằng đối tượng Người dùng không phải là đối tượng Quản trị viên và do đó, phép so sánh trả về sai. Phần trên cũng có thể được viết khác đi bằng cách sử dụng. hằng số ma thuật lớp để trả về chuỗi tên lớp. Đây thực sự là cách tôi thường in tên lớp và cách tôi viết kiểu so sánh này

$user = new User();
var_dump($user instanceof User); // Returns true
6

Cuối cùng, toán tử instanceof rất hữu ích, nhưng bạn cần tuân theo các quy tắc này để tận dụng tối đa nó

  • Khi phát hiện một loại đối tượng, hãy cố gắng phát hiện đối tượng càng nhiều càng tốt, thay vì lớp. Điều này cho phép các nguyên tắc SOLID tốt được tuân thủ
  • Không sử dụng tên đầy đủ của giao diện. Chỉ sử dụng tên giao diện là đủ và tuân theo thông lệ tốt nhất
  • Nếu tìm kiếm sự vắng mặt của một thể hiện thì hãy đảm bảo đặt phép so sánh trong ngoặc để tránh bất kỳ sự mâu thuẫn nào về mức độ ưu tiên của các toán tử xung quanh
  • Hãy cẩn thận khi sử dụng tính kế thừa, tất cả các đối tượng kế thừa lớp cha sẽ được phát hiện là cùng kiểu với lớp cha

PHP

PHP OOP

CHẤT RẮN

dụ của

Phil Norton

Được viết bởi. Philip Norton

Phil là người sáng lập và quản trị viên của #. viết mã và là một chuyên gia CNTT làm việc ở Tây Bắc Vương quốc Anh. Tốt nghiệp năm 2003 tại Đại học Aberystwyth với bằng Thạc sĩ Khoa học Máy tính Phil trước đây đã từng làm quản trị viên cơ sở dữ liệu, trên bàn trợ giúp CNTT, huấn luyện viên hệ thống, kiến ​​trúc web, tư vấn khả năng sử dụng, blogger và chuyên gia SEO. Phil có nhiều kinh nghiệm xây dựng và duy trì các trang web PHP cũng như làm việc với các công nghệ liên quan như JavaScript, HTML, CSS, XML, Flex, Apache, MySQL và Linux