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 xét bởi Viết cho InfoQTham 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êmChì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 danhThô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());
?>
1object(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 nhauobject(class@anonymous)#2 (0) { } 3Chạ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 khaiobject(class@anonymous)#2 (0) { } 6Mộ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 LogMsgobject(class@anonymous)#2 (0) { } 5Lớp mở rộng ẩn danh. tập lệnh php được liệt kê object(class@anonymous)#2 (0) { } 6Chạ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());
?>
0Như 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());
?>
3Trì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;
}
});
0Chạ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;
}
});
1Mộ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àmobject(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;
}
});
3Lớ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;
}
});
4Chạ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ệtTiế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;
}
});
3Lớ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;
}
});
6Chạ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 raobject(class@anonymous)#2 (0) { } 53object(class@anonymous)#2 (0) { } 54Chú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;
}
});
8Chạ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ự UnicodePHP7. 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;
}
});
9Mộ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) { } 59Trả về giá trị điểm mã của một ký tự Unicode theo tên object(class@anonymous)#2 (0) { } 60Trả về tên của ký tự unicode object(class@anonymous)#2 (0) { } 61Trả 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) { } 64object(class@anonymous)#2 (0) { } 65Trả về ký tự Unicode theo giá trị điểm mã object(class@anonymous)#2 (0) { } 66Trả về giá trị số cho một điểm mã unicode object(class@anonymous)#2 (0) { } 67Trả 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 đâyobject(class@anonymous)#2 (0) { } 0Chạy tập lệnh sẽ tạo ra đầu ra sau object(class@anonymous)#2 (0) { } 1Tính năng không dùng nữaPHP 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) { } 2Tậ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());
?>
03Ngoà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) { } 3Chạ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());
?>
05Trong 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 trueobject(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;
}
});
01Tóm lượcTrong 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ả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 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àynhậ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ìnhchủ đề 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
Nội dung liên quanPHP 8 - Các lớp và EnumApple công bố bản viết lại hoàn toàn nhanh chóng của Foundation FrameworkPHP 8 – Hàm và Phương thứcSwift để 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ácBáo cáo xu hướng InfoQ về AI, ML và Kỹ thuật dữ liệu—Tháng 8 năm 2022InfoQ eMag - Báo cáo xu hướng InfoQ 2022Cách Starling xây dựng bộ xử lý thẻ của riêng họMicrosoft mang dịch vụ đám mây và AI của mình đến tận cùngAWS 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 S3Google 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 CloudMicrosoft xem trước Dịch vụ di chuyển được quản lý với Azure Storage MoverVercel ra mắt các chức năng Edge để cung cấp tính toán tại EdgeScore 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ứaDịch vụ quản lý khóa AWS hiện hỗ trợ kho lưu trữ khóa bên ngoàiTrình cắm thiết bị NVIDIA Kubernetes mang đến sự đồng thời GPU tạm thờiOpenJDK đề xuất Dự án Galahad Hợp nhất Biên dịch gốc GraalVMAWS 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 ServerlessBơm nó lên. Thực sự thu được lợi ích từ Cloud Native MicroservicesAWS công bố phòng sạch để cộng tác an toàn với dữ liệu phân tíchCả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 AWSTriggermesh giới thiệu Giải pháp thay thế AWS Eventbridge mã nguồn mở với Project ShakerAmazon công bố bản xem trước của OpenSearch ServerlessGrafana Labs công bố ngôn ngữ truy vấn theo dõi TraceQLKhung ứng dụng phân tán của Microsoft Orleans đạt đến phiên bản 7Tăng cường phát triển Serverless với Terraform và AWS SAMAmazon 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ùngCác tiêu chuẩn cộng đồng xung đột, bản địa đám mây và viễn thôngAWS công bố bản phát hành xem trước của Amazon Security LakeBản tóm tắt AWS lại. phát minh 2022AWS gia nhập không gian cộng tác và phát triển từ xa với CodeCatalystAWS công bố tính khả dụng chung của Amazon OmicsAWS công bố triển khai Blue/Green cho MySQL trên Aurora và RDSSkyPilot 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ệuAWS Lambda SnapStart tăng tốc các hàm JavaSử dụng Serverless WebSockets để kích hoạt tính năng nhắn tin theo thời gian thựcCá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ủCloudFormation hoặc Terraform. Nền tảng Iac nào phù hợp nhất với bạn?
Bản tin InfoQTổ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ì?
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. |