Giao diện so sánh php với các hệ thống bên ngoài

QCon London (27-29 tháng 3 năm 2023). Áp dụng các xu hướng mới nổi phù hợp để giải quyết các thách thức kỹ thuật của bạn

PHP 7 — Các cải tiến về lớp và giao diện

Leia em Bồ Đào Nha

Mục này bằng tiếng Nhật

Thích In Dấu trang

Ngày 22 tháng 6 năm 2020 12 phút đọc

qua

  • Deepak Vohra

xét bởi

  • Sergio De Simone

Viết cho InfoQ

Tham gia cộng đồng chuyên gia. Tăng khả năng hiển thị của bạn.
Phát triển sự nghiệp của bạn.
Tìm hiểu thêm

Chìa khóa rút ra

  • PHP 7 đã thêm các lớp ẩn danh cho các đối tượng một lần; .  
  • Các lớp ẩn danh được thiết kế để sử dụng một lần và không yêu cầu định nghĩa lớp đầy đủ.  
  • Các lớp ẩn danh giống như các lớp chính thức và có thể mở rộng các lớp khác, triển khai các giao diện, định nghĩa các đối số của hàm tạo, v.v.
  • PHP 7 đã giới thiệu lớp IntlChar để truy cập thông tin về các ký tự Unicode
  • PHP 7 không dùng một số tính năng như các hàm tạo kiểu PHP 4

PHP7. x mang đến một số cải tiến và tính năng mới liên quan đến tất cả các khía cạnh của ngôn ngữ, bao gồm hỗ trợ tốt hơn cho lập trình hướng đối tượng, mở rộng cho các lớp và giao diện, cải tiến hệ thống loại, xử lý lỗi, v.v. Trong loạt bài viết này, chúng tôi thảo luận về các tính năng mới trên các phiên bản PHP 7 khác nhau. phiên bản x

 

Trong loạt bài viết này, chúng ta sẽ khám phá các tính năng mới trong PHP 7. Trong bài viết đầu tiên, chúng tôi đã chuẩn bị môi trường và giới thiệu PHP 7, sau đó thảo luận về các tính năng mới của nó liên quan đến lập trình hướng đối tượng. Trong bài viết này, chúng ta sẽ thảo luận về các cải tiến được thực hiện đối với các lớp và giao diện PHP

Lớp ẩn danh

Thông thường, các đối tượng bỏ đi, sử dụng trong thời gian ngắn có thể được sử dụng thay cho  phiên bản chính thức của lớp

PHP7. 0 đã thêm hỗ trợ cho các lớp ẩn danh thuận tiện để khởi tạo ngay cả khi sử dụng một lần. Các lớp ẩn danh giống như các lớp chính thức ở chỗ chúng có thể mở rộng các lớp khác, triển khai các giao diện, định nghĩa các đối số của hàm tạo, v.v.

Ví dụ, chúng ta sẽ tạo một lớp ẩn danh để xử lý các thông báo nhật ký cho nhật ký máy chủ. Tạo ẩn danh. php và xác định giao diện

object(class@anonymous)#2 (0) { }
5 chứa chức năng
object(class@anonymous)#2 (0) { }
6cho phép bạn đặt thông báo tường trình. Ngoài ra, hãy tạo một lớp ServerLog với các phương thức getter/setter
object(class@anonymous)#2 (0) { }
7 để đặt thông báo tường trình

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>

 

Tạo một thể hiện của lớp

object(class@anonymous)#2 (0) { }
8 và gọi hàm
object(class@anonymous)#2 (0) { }
9 với đối số được cung cấp dưới dạng một lớp ẩn danh.  

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});

Nếu bạn chạy tập lệnh, 

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>
0 sẽ xuất ra một tham chiếu đến đối tượng lớp ẩn danh mà chúng ta đã chuyển vào
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>
1

object(class@anonymous)#2 (0) { }

Nếu chúng tôi không sử dụng một lớp ẩn danh trong ví dụ trước, chúng tôi sẽ cần cung cấp một định nghĩa lớp đầy đủ triển khai giao diện

object(class@anonymous)#2 (0) { }
5. Ví dụ tương tự mà không sử dụng các lớp ẩn danh trông như sau

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>

Tất cả các đối tượng được khởi tạo từ cùng một khai báo lớp ẩn danh là các thể hiện của chính lớp đó và giống hệt nhau. Việc so sánh giống hệt nhau được thực hiện với toán tử === và nó ngụ ý rằng các đối tượng được so sánh là bằng nhau và cùng loại. Lúc đầu, việc so sánh danh tính bằng cách sử dụng === có thể gây nhầm lẫn. Hãy bắt đầu với toán tử đẳng thức ==. Hai thể hiện đối tượng bằng nhau (so với toán tử ==) nếu chúng có cùng thuộc tính và giá trị và là thể hiện của cùng một lớp. Với toán tử so sánh đồng nhất (===), hai đối tượng giống hệt nhau khi và chỉ khi chúng tham chiếu đến cùng một thể hiện của cùng một lớp

Để hiểu điều này, hãy tạo một tập lệnh đối tượng lớp ẩn danh. php và định nghĩa một hàm trả về một đối tượng lớp ẩn danh. Bây giờ, sử dụng hàm

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>
3, lấy tên của lớp của hai đối tượng ẩn danh khác nhau được khởi tạo bằng cách gọi hàm hai lần và so sánh các tên đó. Như chúng tôi hiển thị bên dưới, hai tên sẽ bằng nhau

object(class@anonymous)#2 (0) { }
3

Chạy tập lệnh đối tượng lớp ẩn danh. php sẽ tạo một thông báo đầu ra cho biết rằng các đối tượng là các thể hiện của cùng một lớp, có tên bắt đầu bằng

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>
4 Trả về cùng một thể hiện
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>
5, cho biết hai lớp giống hệt nhau. Tên lớp ẩn danh được gán bởi công cụ PHP và phụ thuộc vào việc triển khai

object(class@anonymous)#2 (0) { }
6

Một lớp ẩn danh cũng có thể mở rộng một lớp khác bằng cách sử dụng các phần mở rộng

Để chứng minh điều này, hãy tạo một tập lệnh nặc danh-extend-class. php và định nghĩa một lớp

object(class@anonymous)#2 (0) { }
5 với trường
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>
7 và nhận/thiết lập hàm cho trường đó. Bây giờ, hãy tạo một lớp
object(class@anonymous)#2 (0) { }
8 với các hàm
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLogMsg implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new ServerLogMsg());
var_dump($serverLog->getLogMsg());
?>
9 và
object(class@anonymous)#2 (0) { }
9. Cuối cùng, tạo một thể hiện của lớp
object(class@anonymous)#2 (0) { }
8 và gọi hàm
object(class@anonymous)#2 (0) { }
9 với đối số
object(class@anonymous)#2 (0) { }
5 được cung cấp dưới dạng một lớp ẩn danh mở rộng một lớp khác LogMsg

object(class@anonymous)#2 (0) { }
5

Lớp mở rộng ẩn danh. tập lệnh php được liệt kê

object(class@anonymous)#2 (0) { }
6

Chạy tập lệnh và kiểm tra đầu ra của nó. Bạn sẽ thấy trường

object(class@anonymous)#2 (0) { }
34 loại
object(class@anonymous)#2 (0) { }
5 được đặt thành
object(class@anonymous)#2 (0) { }
36

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
0

Như bạn có thể mong đợi, một đối số có thể được truyền cho một hàm tạo của lớp ẩn danh

Để chứng minh điều này, hãy tạo tập lệnh nặc danh-extend-class-add-constructor. php và định nghĩa các lớp

object(class@anonymous)#2 (0) { }
5 và
object(class@anonymous)#2 (0) { }
8 như trong ví dụ trước. Sự khác biệt duy nhất là một đối số được truyền cho hàm tạo của lớp ẩn danh

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
3

Trình tạo ẩn danh-mở rộng-lớp-thêm. kịch bản php như sau

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
0

Chạy tập lệnh và xác minh thông báo nhật ký được truyền tới hàm tạo của lớp ẩn danh và được trả về bởi

object(class@anonymous)#2 (0) { }
39 được in ra

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
1

Một lớp ẩn danh có thể được lồng trong một lớp khác nhưng nó không thể sử dụng các chức năng hoặc thuộc tính được bảo vệ hoặc riêng tư từ lớp bên ngoài. Để sử dụng các thuộc tính riêng của lớp bên ngoài trong lớp bên trong ẩn danh, hãy chuyển các thuộc tính dưới dạng đối số cho hàm tạo của lớp ẩn danh như trong ví dụ trước

Để chứng minh điều này, hãy tạo tập lệnh internal-class-private. php và định nghĩa lớp ngoài

object(class@anonymous)#2 (0) { }
60 với thuộc tính riêng. Thêm một hàm
object(class@anonymous)#2 (0) { }
61 trả về một đối tượng lớp ẩn danh. Thuộc tính riêng từ lớp
object(class@anonymous)#2 (0) { }
60 được chuyển đến hàm tạo của lớp ẩn danh và được đặt làm thuộc tính riêng của lớp ẩn danh. Giờ đây, bằng cách sử dụng một hàm được khai báo trong lớp ẩn danh, bạn có thể trả về giá trị thuộc tính riêng được chuyển từ lớp
object(class@anonymous)#2 (0) { }
60 sang lớp bên trong ẩn danh

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
2

Để in ra giá trị thuộc tính riêng được chuyển từ

object(class@anonymous)#2 (0) { }
60 sang lớp bên trong ẩn danh, hãy tạo một phiên bản của lớp
object(class@anonymous)#2 (0) { }
60 và gọi hàm inner(), hàm này tạo lớp ẩn danh và gọi hàm lớp ẩn danh trả về giá trị của thuộc tính riêng

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
3

Lớp bên trong-riêng tư. tập lệnh php được liệt kê bên dưới

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
4

Chạy tập lệnh và kiểm tra giá trị thuộc tính riêng tư (1) được truyền từ

object(class@anonymous)#2 (0) { }
60 đến lớp bên trong được in ra trong trình duyệt

Tiếp theo, chúng ta sẽ chứng minh làm thế nào một hàm được bảo vệ từ một lớp

object(class@anonymous)#2 (0) { }
60 có thể được gọi trong một lớp ẩn danh. Để gọi một trong các chức năng được bảo vệ được xác định trong lớp bên ngoài, lớp bên trong ẩn danh sẽ cần mở rộng lớp cũ

Để chứng minh điều này, hãy tạo một tập lệnh được bảo vệ bởi lớp bên trong. php và định nghĩa một lớp bên ngoài có tên là

object(class@anonymous)#2 (0) { }
60 với trường được bảo vệ và hàm được bảo vệ. Bây giờ, hãy định nghĩa một hàm khác để tạo một lớp ẩn danh mở rộng lớp Bên ngoài và làm cho lớp ẩn danh này xác định một hàm gọi hàm được bảo vệ của lớp bên ngoài mà chúng ta đã xác định ở vị trí đầu tiên. Khi lớp ẩn danh mở rộng lớp Bên ngoài, nó sẽ kế thừa các trường và hàm được bảo vệ của nó, nghĩa là có thể truy cập vào trường và hàm được bảo vệ bằng cách sử dụng
object(class@anonymous)#2 (0) { }
69. Hàm lớp ẩn danh được gọi như trước bằng cách tạo một thể hiện của lớp
object(class@anonymous)#2 (0) { }
60 trước

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
3

Lớp bên trong được bảo vệ. tập lệnh php được liệt kê

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
6

Chạy tập lệnh và kiểm tra giá trị được trả về bởi trường được bảo vệ của lớp

object(class@anonymous)#2 (0) { }
60 và các hàm của lớp
object(class@anonymous)#2 (0) { }
60 được in ra

object(class@anonymous)#2 (0) { }
53

object(class@anonymous)#2 (0) { }
54

Chúng tôi đã sử dụng hai ví dụ; . Hai ví dụ có thể được kết hợp bằng cách làm cho lớp lồng ẩn danh mở rộng lớp bên ngoài để kế thừa các trường và hàm được bảo vệ của lớp bên ngoài, cũng như chuyển các trường riêng của lớp bên ngoài cho hàm tạo của lớp ẩn danh như sau

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
7

Để chứng minh điều này, hãy tạo một tập lệnh lớp bên trong. php

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
8

Chạy tập lệnh sẽ xuất ra giá trị 6 thu được từ việc gọi các trường và hàm của lớp bên ngoài

Lớp IntlChar mới cho các ký tự Unicode

PHP7. 0 đã giới thiệu một lớp mới gọi là

object(class@anonymous)#2 (0) { }
55 với một số phương thức tiện ích để truy cập thông tin về các ký tự Unicode. Lưu ý  rằng tiện ích mở rộng
object(class@anonymous)#2 (0) { }
56 cần được cài đặt để sử dụng lớp
object(class@anonymous)#2 (0) { }
55, điều này có thể thực hiện được bằng cách bỏ ghi chú dòng sau trong tệp cấu hình
object(class@anonymous)#2 (0) { }
58 của bạn

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
9

Một số phương thức trong lớp IntlChar được mô tả trong Bảng 2

ban 2. Phương thức lớp IntlChar

Phương pháp

Sự miêu tả

object(class@anonymous)#2 (0) { }
59

Trả về giá trị điểm mã của một ký tự Unicode theo tên

object(class@anonymous)#2 (0) { }
60

Trả về tên của ký tự unicode

object(class@anonymous)#2 (0) { }
61

Trả về giá trị danh mục chung cho điểm mã unicode. Ví dụ đối với danh mục chữ cái tiêu đề là

object(class@anonymous)#2 (0) { }
62. Đối với loại số thập phân là
object(class@anonymous)#2 (0) { }
63. Nếu ký tự không thuộc bất kỳ danh mục nào đã xác định thì danh mục đó là
object(class@anonymous)#2 (0) { }
64

object(class@anonymous)#2 (0) { }
65

Trả về ký tự Unicode theo giá trị điểm mã

object(class@anonymous)#2 (0) { }
66

Trả về giá trị số cho một điểm mã unicode

object(class@anonymous)#2 (0) { }
67

Trả về một boolean để cho biết nếu một ký tự được xác định

 

Tạo ngay một tập lệnh Intlchar. php để kiểm tra một số phương pháp này. Trong ví dụ sau, chúng tôi sẽ xuất phiên bản unicode với hằng số

object(class@anonymous)#2 (0) { }
68; . Kịch bản Intlchar. php được liệt kê dưới đây

object(class@anonymous)#2 (0) { }
0

Chạy tập lệnh sẽ tạo ra đầu ra sau

object(class@anonymous)#2 (0) { }
1

Tính năng không dùng nữa

PHP 7 cũng không dùng một số tính năng

Trong số các tính năng không dùng nữa trong PHP 7. 0. x là PHP 4, hàm tạo kiểu “cũ” i. e. , phương thức xây dựng có cùng tên với lớp

Ví dụ: tạo một hàm tạo tập lệnh. php và sao chép danh sách sau vào nó

object(class@anonymous)#2 (0) { }
2

Tập lệnh khai báo một lớp

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
01 với một phương thức sử dụng cùng tên
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
01. Chạy tập lệnh và thông báo sau được xuất ra

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
03

Ngoài ra, các lệnh gọi tĩnh đến các phương thức không tĩnh không được dùng trong PHP 7. 0. 0. Để chứng minh điều này, hãy tạo một tập lệnh tĩnh. php và sao chép danh sách sau vào danh sách khai báo một lớp có hàm không tĩnh

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
04, bây giờ hãy thử thực hiện cuộc gọi tĩnh đến hàm đó

object(class@anonymous)#2 (0) { }
3

Chạy tập lệnh này sẽ xuất ra thông báo sau

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
05

Trong PHP7. 1. x tiện ích mở rộng

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
06 không được dùng nữa. Các tính năng không dùng nữa trong PHP 7. 2 bao gồm
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
07, phương thức
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
08,
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
09, truyền tới
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
30, sử dụng
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
31 mà không có đối số thứ hai, hàm
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
32, hàm
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
33,
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
34 với đối số chuỗi và hàm
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
35. Các tính năng không dùng nữa trong PHP 7. 3 bao gồm các hằng số phân biệt chữ hoa chữ thường và khai báo
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
34 trong một không gian tên

Để làm ví dụ về việc ngừng sử dụng các hằng số phân biệt chữ hoa chữ thường, hãy chạy tập lệnh sau trong đó hàm

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
37 được gọi với tham số
<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
38 được đặt thành true

object(class@anonymous)#2 (0) { }
4

Điều này sẽ cung cấp cho bạn các thông báo sau

<?php
interface LogMsg {
	public function setMsg(string $msg);
}
class ServerLog {
	private $logMsg;
	public function getLogMsg(): LogMsg {
     	return $this->logMsg;
	}
	public function setLogMsg(LogMsg $logMsg) {
         $this->logMsg = $logMsg;
	}
}
$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
var_dump($serverLog->getLogMsg());
?>
39

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
00

$serverLog = new ServerLog;
$serverLog->setLogMsg(new class implements LogMsg {
	public function setMsg(string $msg) {
    	echo $msg;
	}
});
01

Tóm lược

Trong phần thứ hai của loạt bài về PHP 7, chúng ta đã khám phá các tính năng mới cho các lớp và giao diện. Tính năng mới đáng chú ý nhất là hỗ trợ cho các lớp ẩn danh. Unicode cũng được tăng cường với một lớp mới IntlChar có thể được sử dụng để lấy thông tin về các ký tự Unicode

Trong phần tiếp theo của loạt bài này, chúng ta sẽ khám phá các tính năng mới trong hệ thống kiểu của PHP

Giới thiệu về tác giả

Giao diện so sánh php với các hệ thống bên ngoài
Deepak Vohra là Lập trình viên Java được Sun chứng nhận và Nhà phát triển thành phần web được Sun chứng nhận. Deepak đã xuất bản các bài viết kỹ thuật liên quan đến Java và Java EE trên WebLogic Developer's Journal, XML Journal, ONJava, java. net, IBM developerWorks, Java Developer's Journal, Oracle Magazine, và devx. Deepak đã xuất bản năm cuốn sách về Docker và là một Docker Mentor. Deepak cũng đã xuất bản một số bài báo về PHP và một cuốn sách Ruby on Rails dành cho các nhà phát triển PHP và Java.  

 

PHP7. x mang đến một số cải tiến và tính năng mới liên quan đến tất cả các khía cạnh của ngôn ngữ, bao gồm hỗ trợ tốt hơn cho lập trình hướng đối tượng, mở rộng cho các lớp và giao diện, cải tiến hệ thống loại, xử lý lỗi, v.v. Trong loạt bài viết này, chúng tôi thảo luận về các tính năng mới trên các phiên bản PHP 7 khác nhau. phiên bản x

 

 

 

Lấy cảm hứng từ nội dung này?

Trở thành biên tập viên cho InfoQ là một trong những quyết định sáng suốt nhất trong sự nghiệp của tôi. Nó đã thử thách tôi và giúp tôi trưởng thành theo nhiều cách. Chúng tôi muốn có nhiều người tham gia nhóm của chúng tôi

Giao diện so sánh php với các hệ thống bên ngoài

Thomas Betts Trưởng ban biên tập, Thiết kế và kiến ​​trúc phần mềm @InfoQ;

Viết cho InfoQ

Xếp hạng bài viết này

nhận con nuôi

Phong cách

Đã liên hệ với tác giả

Nội dung này nằm trong chủ đề Ngôn ngữ lập trình

chủ đề liên quan
  • Phát triển
  • PHP7. x Loạt bài viết
  • PHP7
  • PHP
  • Ngôn ngữ lập trình
  • Thiết kế hướng đối tượng
  • Lập trình hệ thống
  • Ngành kiến ​​​​trúc
  • Thiết kế
  • NGUỒN SÁNG
  • Mây

  • biên tập liên quan

    • Nội dung được tài trợ có liên quan

    • Giải mã microservice. Cẩm nang các phương pháp hay nhất dành cho nhà phát triển
  • Nhà tài trợ liên quan

    Giao diện so sánh php với các hệ thống bên ngoài

    Camunda 8. Sắp xếp các quy trình phức tạp nhất của bạn. Cải thiện năng suất với mô hình cộng tác, trình kết nối sẵn dùng, v.v. Dùng thử miễn phí ngay bây giờ

Nội dung liên quan

  • PHP 8 - Các lớp và Enum

    Giao diện so sánh php với các hệ thống bên ngoài

  • Apple công bố bản viết lại hoàn toàn nhanh chóng của Foundation Framework

  • PHP 8 – Hàm và Phương thức

    Giao diện so sánh php với các hệ thống bên ngoài

  • Swift để thêm hỗ trợ cho quyền sở hữu, macro và tương tác C ++

  • PHP 8 — Thuộc tính, Biểu thức khớp và các cải tiến khác

    Giao diện so sánh php với các hệ thống bên ngoài

  • Báo cáo xu hướng InfoQ về AI, ML và Kỹ thuật dữ liệu—Tháng 8 năm 2022

    Giao diện so sánh php với các hệ thống bên ngoài

  • InfoQ eMag - Báo cáo xu hướng InfoQ 2022

    Giao diện so sánh php với các hệ thống bên ngoài

  • Cách Starling xây dựng bộ xử lý thẻ của riêng họ

    Giao diện so sánh php với các hệ thống bên ngoài

  • Microsoft mang dịch vụ đám mây và AI của mình đến tận cùng

  • AWS công bố các thay đổi bảo mật sắp tới vào tháng 4 năm 2023 cho Amazon S3

  • Google Cloud giới thiệu Autoclass cho Cloud Storage để tự động tối ưu hóa chi phí

  • Hợp kim DB tương thích với PostgreSQL hiện đã có sẵn trên Google Cloud

  • Microsoft xem trước Dịch vụ di chuyển được quản lý với Azure Storage Mover

  • Vercel ra mắt các chức năng Edge để cung cấp tính toán tại Edge

  • Score cung cấp phương pháp tiếp cận tập trung vào quy trình làm việc để quản lý khối lượng công việc vùng chứa

  • Dịch vụ quản lý khóa AWS hiện hỗ trợ kho lưu trữ khóa bên ngoài

  • Trình cắm thiết bị NVIDIA Kubernetes mang đến sự đồng thời GPU tạm thời

  • OpenJDK đề xuất Dự án Galahad Hợp nhất Biên dịch gốc GraalVM

  • AWS xem trước VPC Lattice cho giao tiếp từ dịch vụ đến dịch vụ

  • AWS Previews Application Composer để trực quan hóa và tạo khối lượng công việc Serverless

  • Bơm nó lên. Thực sự thu được lợi ích từ Cloud Native Microservices

    Giao diện so sánh php với các hệ thống bên ngoài

  • AWS công bố phòng sạch để cộng tác an toàn với dữ liệu phân tích

  • Cải thiện khả năng hiển thị chuỗi cung ứng và thông tin chi tiết hữu ích với Chuỗi cung ứng AWS

  • Triggermesh giới thiệu Giải pháp thay thế AWS Eventbridge mã nguồn mở với Project Shaker

  • Amazon công bố bản xem trước của OpenSearch Serverless

  • Grafana Labs công bố ngôn ngữ truy vấn theo dõi TraceQL

  • Khung ứng dụng phân tán của Microsoft Orleans đạt đến phiên bản 7

  • Tăng cường phát triển Serverless với Terraform và AWS SAM

  • Amazon EventBridge Pipes hỗ trợ tích hợp điểm-điểm giữa nhà sản xuất sự kiện và người tiêu dùng

  • Các tiêu chuẩn cộng đồng xung đột, bản địa đám mây và viễn thông

    Giao diện so sánh php với các hệ thống bên ngoài

  • AWS công bố bản phát hành xem trước của Amazon Security Lake

  • Bản tóm tắt AWS lại. phát minh 2022

  • AWS gia nhập không gian cộng tác và phát triển từ xa với CodeCatalyst

  • AWS công bố tính khả dụng chung của Amazon Omics

  • AWS công bố triển khai Blue/Green cho MySQL trên Aurora và RDS

  • SkyPilot mã nguồn mở nhắm mục tiêu tối ưu hóa chi phí đám mây cho ML và khoa học dữ liệu

  • AWS Lambda SnapStart tăng tốc các hàm Java

  • Sử dụng Serverless WebSockets để kích hoạt tính năng nhắn tin theo thời gian thực

    Giao diện so sánh php với các hệ thống bên ngoài

  • Các bản phát hành mang tính quyết định, có thể tái sản xuất, không gây ngạc nhiên trong Kỷ nguyên không có máy chủ

    Giao diện so sánh php với các hệ thống bên ngoài

  • CloudFormation hoặc Terraform. Nền tảng Iac nào phù hợp nhất với bạn?

    Giao diện so sánh php với các hệ thống bên ngoài

Bản tin InfoQ

Tổng hợp nội dung của tuần trước trên InfoQ được gửi vào thứ Ba hàng tuần. Tham gia cộng đồng hơn 250.000 nhà phát triển cấp cao. Xem một ví dụ

Nhập địa chỉ email của bạn

Chọn quốc gia của bạn Tôi đồng ý với InfoQ. com xử lý dữ liệu của tôi như được giải thích trong Thông báo về quyền riêng tư này.

Chúng tôi bảo vệ quyền riêng tư của bạn

xin chào người lạ

Bạn cần Đăng ký tài khoản InfoQ hoặc Đăng nhập hoặc đăng nhập để gửi bình luận. Nhưng còn rất nhiều điều đằng sau việc đăng ký

Giao diện trong PHP là gì?

Giao diện PHP xác định hợp đồng mà lớp phải thực hiện . Nếu một lớp PHP là bản thiết kế cho các đối tượng, thì một giao diện là bản thiết kế cho các lớp. Bất kỳ lớp nào triển khai một giao diện nhất định đều có thể có hành vi giống nhau về những gì có thể được gọi, cách gọi và những gì sẽ được trả về.

Mục đích chính của giao diện trong PHP là gì?

PHP - Giao diện là gì? . Các giao diện giúp dễ dàng sử dụng nhiều lớp khác nhau theo cùng một cách. Khi một hoặc nhiều lớp sử dụng cùng một giao diện, nó được gọi là "đa hình". allow you to specify what methods a class should implement. Interfaces make it easy to use a variety of different classes in the same way. When one or more classes use the same interface, it is referred to as "polymorphism".

Tôi có thể triển khai nhiều giao diện trong PHP không?

Một lớp có thể triển khai nhiều giao diện . Từ khóa "giao diện" được sử dụng để khai báo một giao diện. Các phương thức không trừu tượng không thể được duy trì bởi các giao diện.

Lớp cụ thể trong PHP là gì?

Lớp Concrete là lớp không có bất kỳ phương thức nào chưa được triển khai . Các ngôn ngữ lập trình như Java sử dụng từ khóa lớp để biểu thị một lớp. Một lớp cụ thể là một kế hoạch chi tiết để tạo ra các đối tượng. Nó có các thuộc tính và phương thức.