Tôi đã lập trình bằng các ngôn ngữ khác nhưng tôi khá là mới trong PHP. Vì vậy, tôi thấy rất nhiều hướng dẫn và mẹo về cách đặt mã kết nối cơ sở dữ liệu vào một tệp riêng biệt mà bạn đưa vào đầu tất cả các tập lệnh của mình. Nếu bạn đang thực hiện thao tác chèn, logic sẽ như thế này
include [dbconnect.inc]
if formSubmitted = yes
validateData
if no validationError
insertRecord
.
.
HTML FORM GOES HERE
Nhưng điều đó có nghĩa là tập lệnh kết nối với cơ sở dữ liệu nhiều lần, ngay cả khi không có bản ghi nào được chèn vào. Không phải kết nối cơ sở dữ liệu xảy ra gần hơn khi cơ sở dữ liệu thực sự được truy cập?
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
Theo cách đó, nếu người dùng chỉ làm mới màn hình hoặc nhấp vào OK mà không nhập dữ liệu, thì tập lệnh sẽ không tấn công máy chủ với yêu cầu này đến yêu cầu khác
Có rất nhiều thông tin lỗi thời trên Web khiến người dùng PHP mới lạc hướng, truyền bá các thực tiễn xấu và mã không an toàn. PHP. The Right Way là một tài liệu tham khảo nhanh, dễ đọc về các tiêu chuẩn mã hóa phổ biến của PHP, liên kết đến các hướng dẫn có thẩm quyền trên Web và những gì những người đóng góp coi là thực tiễn tốt nhất tại thời điểm hiện tại
Không có cách kinh điển nào để sử dụng PHP. Trang web này nhằm mục đích giới thiệu cho các nhà phát triển PHP mới về một số chủ đề mà họ có thể không khám phá ra cho đến khi quá muộn và nhằm mục đích cung cấp cho các chuyên gia dày dạn kinh nghiệm một số ý tưởng mới về những chủ đề mà họ đã thực hiện trong nhiều năm mà không bao giờ xem xét lại. Trang web này cũng sẽ không cho bạn biết nên sử dụng công cụ nào mà thay vào đó đưa ra đề xuất cho nhiều tùy chọn, khi có thể giải thích sự khác biệt trong cách tiếp cận và trường hợp sử dụng
Đây là một tài liệu sống và sẽ tiếp tục được cập nhật với nhiều thông tin và ví dụ hữu ích hơn khi chúng có sẵn
bản dịch
PHP. The Right Way được dịch ra nhiều ngôn ngữ khác nhau
Sách
Phiên bản mới nhất của PHP. Con Đường Đúng Cách cũng có sẵn ở định dạng PDF, EPUB và MOBI. Tới Leanpub
Làm thế nào để đóng góp
Giúp làm cho trang web này trở thành tài nguyên tốt nhất cho các lập trình viên PHP mới. Đóng góp trên GitHub
Sử dụng Phiên bản ổn định hiện tại [8. 1]
Nếu bạn đang bắt đầu với PHP, hãy bắt đầu với bản phát hành ổn định hiện tại của PHP 8. 1. PHP8. x bổ sung nhiều hơn so với 7 cũ hơn. x và 5. phiên bản x. Công cụ đã được viết lại phần lớn và PHP thậm chí còn nhanh hơn các phiên bản cũ hơn. PHP 8 là một bản cập nhật lớn của ngôn ngữ và chứa nhiều tính năng và tối ưu hóa mới
Bạn nên nhanh chóng nâng cấp lên phiên bản ổn định mới nhất - PHP 7. 4 đã là End of Life. Nâng cấp rất dễ dàng vì không có nhiều lỗi tương thích ngược. Nếu bạn không chắc chức năng hoặc tính năng của phiên bản nào, bạn có thể kiểm tra tài liệu PHP trên trang web php. trang mạng
Máy chủ web tích hợp
Với PHP5. 4 hoặc mới hơn, bạn có thể bắt đầu học PHP mà không cần cài đặt và định cấu hình máy chủ web chính thức. Để khởi động máy chủ, hãy chạy lệnh sau từ thiết bị đầu cuối của bạn trong thư mục gốc của dự án
> php -S localhost:8000
Cài đặt máy Mac
macOS được đóng gói sẵn với PHP nhưng nó thường chậm hơn một chút so với bản phát hành ổn định mới nhất. Có nhiều cách để cài đặt phiên bản PHP mới nhất trên macOS
Cài đặt PHP qua Homebrew
Homebrew là trình quản lý gói cho macOS giúp bạn dễ dàng cài đặt PHP và các tiện ích mở rộng khác nhau. Kho lưu trữ lõi Homebrew cung cấp “công thức” cho PHP 5. 6, 7. 0, 7. 1, 7. 2, 7. 3, 7. 4, 8. 0 và PHP8. 1. Cài đặt phiên bản mới nhất bằng lệnh này
Bạn có thể chuyển đổi giữa các phiên bản Homebrew PHP bằng cách sửa đổi biến
phpcbf -w --standard=PSR1 file.php
3 của mình. Ngoài ra, bạn có thể sử dụng brew-php-switcher để tự động chuyển phiên bản PHPBạn cũng có thể chuyển đổi giữa các phiên bản PHP theo cách thủ công bằng cách hủy liên kết và liên kết phiên bản mong muốn
brew unlink php
brew link --overwrite php@8.0
brew unlink php
brew link --overwrite php@8.1
Cài đặt PHP qua Macports
Dự án MacPorts là một sáng kiến của cộng đồng nguồn mở nhằm thiết kế một hệ thống dễ sử dụng để biên dịch, cài đặt và nâng cấp phần mềm nguồn mở dựa trên dòng lệnh, X11 hoặc Aqua trên hệ điều hành OS X
MacPorts hỗ trợ các tệp nhị phân được biên dịch sẵn, vì vậy bạn không cần phải biên dịch lại mọi phần phụ thuộc từ các tệp tarball nguồn, nó sẽ cứu mạng bạn nếu bạn không cài đặt bất kỳ gói nào trên hệ thống của mình
Tại thời điểm này, bạn có thể cài đặt
phpcbf -w --standard=PSR1 file.php
4, phpcbf -w --standard=PSR1 file.php
5, phpcbf -w --standard=PSR1 file.php
6, phpcbf -w --standard=PSR1 file.php
7, phpcbf -w --standard=PSR1 file.php
8, phpcbf -w --standard=PSR1 file.php
9,
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
20,
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
21,
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
22 hoặc
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
23 bằng cách sử dụng lệnh
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
24 chẳng hạn
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
7Và bạn có thể chạy lệnh
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
25 để chuyển đổi PHP đang hoạt động của mình
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
9Cài đặt PHP qua phpbrew
phpbrew là công cụ cài đặt và quản lý nhiều phiên bản PHP. Điều này có thể thực sự hữu ích nếu hai ứng dụng/dự án khác nhau yêu cầu các phiên bản PHP khác nhau và bạn không sử dụng máy ảo
Cài đặt PHP thông qua trình cài đặt nhị phân của Liip
Một tùy chọn phổ biến khác là php-osx. liip. ch cung cấp một phương thức cài đặt lót cho các phiên bản 5. 3 đến 7. 3. Nó không ghi đè lên các tệp nhị phân PHP do Apple cài đặt mà cài đặt mọi thứ ở một vị trí riêng biệt [/usr/local/php5]
Biên dịch từ Nguồn
Một tùy chọn khác cho phép bạn kiểm soát phiên bản PHP mà bạn cài đặt là tự biên dịch nó. Trong trường hợp đó, hãy chắc chắn đã cài đặt Xcode hoặc công cụ thay thế “Command Line Tools for XCode” của Apple có thể tải xuống từ Trung tâm nhà phát triển Mac của Apple
Trình cài đặt tất cả trong một
Các giải pháp được liệt kê ở trên chủ yếu xử lý chính PHP và không cung cấp những thứ như Apache, Nginx hoặc máy chủ SQL. Các giải pháp “tất cả trong một” như MAMP và XAMPP sẽ cài đặt các phần mềm khác này cho bạn và liên kết tất cả chúng lại với nhau, nhưng việc dễ dàng thiết lập đi kèm với sự đánh đổi về tính linh hoạt
cài đặt Windows
Bạn có thể tải xuống các tệp nhị phân từ windows. php. mạng/tải xuống. Sau khi giải nén PHP, bạn nên đặt PATH vào thư mục gốc của thư mục PHP [trong đó php. exe] để bạn có thể thực thi PHP từ bất cứ đâu
Để học tập và phát triển địa phương, bạn có thể sử dụng máy chủ web tích hợp với PHP 5. 4+ nên bạn không cần lo cấu hình. Nếu bạn muốn một “tất cả trong một” bao gồm máy chủ web toàn diện và cả MySQL thì các công cụ như XAMPP, EasyPHP, OpenServer và WAMP sẽ giúp thiết lập và chạy nhanh môi trường phát triển Windows. Điều đó nói rằng, những công cụ này sẽ khác một chút so với sản xuất, vì vậy hãy cẩn thận với sự khác biệt về môi trường nếu bạn đang làm việc trên Windows và triển khai lên Linux
Nếu bạn cần chạy hệ thống sản xuất của mình trên Windows, thì IIS7 sẽ cung cấp cho bạn hiệu suất ổn định nhất và tốt nhất. Bạn có thể sử dụng phpmanager [một plugin GUI cho IIS7] để cấu hình và quản lý PHP đơn giản. IIS7 đi kèm với FastCGI được tích hợp sẵn và sẵn sàng hoạt động, bạn chỉ cần định cấu hình PHP làm trình xử lý. Để được hỗ trợ và các tài nguyên bổ sung, có một khu vực dành riêng trên iis. mạng cho PHP
Nói chung, việc chạy ứng dụng của bạn trên các môi trường khác nhau trong quá trình phát triển và sản xuất có thể dẫn đến các lỗi lạ xuất hiện khi bạn phát hành trực tiếp. Nếu bạn đang phát triển trên Windows và triển khai lên Linux [hoặc bất kỳ thứ gì không phải Windows] thì bạn nên cân nhắc sử dụng
Chris Tankersley có một bài đăng trên blog rất hữu ích về những công cụ mà anh ấy sử dụng để phát triển PHP bằng Windows
Cấu trúc thư mục chung
Một câu hỏi phổ biến đối với những người bắt đầu viết chương trình cho web là, "tôi đặt nội dung của mình ở đâu?" . ” Mặc dù câu trả lời này chưa hoàn chỉnh, nhưng đó là một nơi tuyệt vời để bắt đầu
Vì lý do bảo mật, khách truy cập trang web không thể truy cập tệp cấu hình;
Đối với mỗi nhóm, CMS hoặc khung mà một người làm việc, một cấu trúc thư mục tiêu chuẩn được sử dụng bởi từng thực thể đó. Tuy nhiên, nếu một người đang bắt đầu một dự án một mình, việc biết sử dụng cấu trúc hệ thống tệp nào có thể gây khó khăn.
Paul M. Jones đã thực hiện một số nghiên cứu tuyệt vời về các thực tiễn chung của hàng chục nghìn dự án github trong lĩnh vực PHP. Ông đã biên soạn một cấu trúc thư mục và tệp tiêu chuẩn, Bộ xương gói PHP tiêu chuẩn, dựa trên nghiên cứu này. Trong cấu trúc thư mục này,
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
26 nên trỏ đến
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
28, các bài kiểm tra đơn vị phải nằm trong thư mục
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
29 và các thư viện của bên thứ ba, như được cài đặt bởi , thuộc về thư mục > php -S localhost:8000
40. Đối với các tệp và thư mục khác, việc tuân thủ Bộ khung gói PHP tiêu chuẩn sẽ có ý nghĩa nhất đối với những người đóng góp cho dự ánCộng đồng PHP lớn và đa dạng, bao gồm vô số thư viện, khung và thành phần. Các nhà phát triển PHP thường chọn một vài trong số này và kết hợp chúng thành một dự án duy nhất. Điều quan trọng là mã PHP phải tuân thủ [càng gần càng tốt] với một kiểu mã phổ biến để giúp các nhà phát triển dễ dàng trộn và kết hợp các thư viện khác nhau cho các dự án của họ
Framework Interop Group đã đề xuất và phê duyệt một loạt các đề xuất về phong cách. Không phải tất cả chúng đều liên quan đến kiểu mã, nhưng những thứ đó là PSR-1, PSR-12 và PSR-4. Những đề xuất này chỉ đơn thuần là một bộ quy tắc mà nhiều dự án như Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, v.v. đang áp dụng. Bạn có thể sử dụng chúng cho các dự án của riêng mình hoặc tiếp tục sử dụng phong cách cá nhân của riêng bạn
Tốt nhất, bạn nên viết mã PHP tuân theo một tiêu chuẩn đã biết. Đây có thể là bất kỳ sự kết hợp nào của PSR hoặc một trong các tiêu chuẩn mã hóa do PEAR hoặc Zend tạo ra. Điều này có nghĩa là các nhà phát triển khác có thể dễ dàng đọc và làm việc với mã của bạn và các ứng dụng triển khai các thành phần có thể có tính nhất quán ngay cả khi làm việc với nhiều mã của bên thứ ba
Bạn có thể sử dụng PHP_CodeSniffer để kiểm tra mã dựa trên bất kỳ đề xuất nào trong số này và các plugin dành cho trình soạn thảo văn bản như Sublime Text để nhận phản hồi theo thời gian thực
Bạn có thể tự động sửa bố cục mã bằng cách sử dụng một trong các công cụ sau
Và bạn có thể chạy thủ công phpcs từ shell
> php -S localhost:8000
5Nó sẽ hiển thị các lỗi và mô tả cách khắc phục chúng. Cũng có thể hữu ích khi đưa lệnh này vào hook git. Theo cách đó, các nhánh có vi phạm tiêu chuẩn đã chọn không thể vào kho lưu trữ cho đến khi những vi phạm đó được khắc phục
Nếu bạn có PHP_CodeSniffer, thì bạn có thể tự động khắc phục các sự cố về bố cục mã do nó báo cáo bằng Trình sửa lỗi và làm đẹp mã PHP
phpcbf -w --standard=PSR1 file.php
Một tùy chọn khác là sử dụng Trình sửa lỗi tiêu chuẩn mã hóa PHP. Nó sẽ hiển thị loại lỗi nào mà cấu trúc mã có trước khi sửa chúng
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
2Tiếng Anh được ưu tiên cho tất cả các tên ký hiệu và cơ sở hạ tầng mã. Nhận xét có thể được viết bằng bất kỳ ngôn ngữ nào mà tất cả các bên hiện tại và tương lai có thể đang làm việc trên cơ sở mã đều có thể đọc được dễ dàng
Cuối cùng, một tài nguyên bổ sung tốt để viết mã PHP sạch là Clean Code PHP
Mô hình lập trình
PHP là một ngôn ngữ linh hoạt, năng động, hỗ trợ nhiều kỹ thuật lập trình. Nó đã phát triển vượt bậc trong những năm qua, đáng chú ý là thêm một mô hình hướng đối tượng vững chắc trong PHP 5. 0 [2004], các hàm ẩn danh và không gian tên trong PHP 5. 3 [2009] và các đặc điểm trong PHP 5. 4 [2012]
Lập trình hướng đối tượng
PHP có một tập hợp rất đầy đủ các tính năng lập trình hướng đối tượng bao gồm hỗ trợ cho các lớp, lớp trừu tượng, giao diện, kế thừa, hàm tạo, nhân bản, ngoại lệ, v.v.
Lập trình chức năng
PHP hỗ trợ các hàm hạng nhất, nghĩa là một hàm có thể được gán cho một biến. Cả hàm do người dùng định nghĩa và hàm tích hợp đều có thể được tham chiếu bởi một biến và được gọi động. Các hàm có thể được truyền dưới dạng đối số cho các hàm khác [một tính năng được gọi là Hàm bậc cao hơn] và các hàm có thể trả về các hàm khác
Đệ quy, một tính năng cho phép một hàm gọi chính nó, được ngôn ngữ hỗ trợ, nhưng hầu hết mã PHP tập trung vào phép lặp
Các hàm ẩn danh mới [có hỗ trợ đóng] đã có từ PHP 5. 3 [2009]
PHP5. 4 đã thêm khả năng liên kết các bao đóng với phạm vi của đối tượng và cũng cải thiện hỗ trợ cho các hàm có thể gọi được để chúng có thể được sử dụng thay thế cho nhau với các hàm ẩn danh trong hầu hết các trường hợp
PHP hỗ trợ nhiều dạng lập trình meta khác nhau thông qua các cơ chế như Reflection API và Magic Methods. Có rất nhiều Phương pháp ma thuật có sẵn như
> php -S localhost:8000
41, > php -S localhost:8000
42, > php -S localhost:8000
43, > php -S localhost:8000
44, > php -S localhost:8000
45, v.v. cho phép các nhà phát triển kết nối với hành vi của lớp. Các nhà phát triển Ruby thường nói rằng PHP đang thiếu > php -S localhost:8000
46, nhưng nó có sẵn dưới dạng > php -S localhost:8000
47 và > php -S localhost:8000
48không gian tên
Như đã đề cập ở trên, cộng đồng PHP có rất nhiều nhà phát triển tạo ra rất nhiều mã. Điều này có nghĩa là mã PHP của một thư viện có thể sử dụng cùng tên lớp với một thư viện khác. Khi cả hai thư viện được sử dụng trong cùng một không gian tên, chúng xung đột và gây ra sự cố
Không gian tên giải quyết vấn đề này. Như được mô tả trong hướng dẫn tham khảo PHP, các không gian tên có thể được so sánh với các thư mục hệ điều hành chứa các tệp không gian tên; . Tương tự như vậy, hai lớp PHP có cùng tên có thể cùng tồn tại trong các không gian tên PHP riêng biệt. Nó đơn giản như vậy
Điều quan trọng là bạn phải đặt tên cho mã của mình để các nhà phát triển khác có thể sử dụng mã đó mà không sợ xung đột với các thư viện khác
Một cách được đề xuất để sử dụng không gian tên được nêu trong PSR-4, nhằm mục đích cung cấp một quy ước không gian tên, lớp và tệp tiêu chuẩn để cho phép mã plug-and-play
Vào tháng 10 năm 2014, PHP-FIG đã ngừng sử dụng tiêu chuẩn tự động tải trước đó. PSR-0. Cả PSR-0 và PSR-4 vẫn hoàn toàn có thể sử dụng được. Cái sau yêu cầu PHP 5. 3, rất nhiều PHP 5. Các dự án chỉ có 2 người triển khai PSR-0
Nếu bạn định sử dụng tiêu chuẩn trình tải tự động cho một ứng dụng hoặc gói mới, hãy xem PSR-4
Thư viện PHP chuẩn
Thư viện PHP chuẩn [SPL] được đóng gói với PHP và cung cấp một tập hợp các lớp và giao diện. Nó chủ yếu được tạo thành từ các lớp cấu trúc cơ sở dữ liệu thường cần thiết [ngăn xếp, hàng đợi, đống, v.v.] và các trình vòng lặp có thể duyệt qua các cấu trúc cơ sở dữ liệu này hoặc các lớp của riêng bạn thực hiện các giao diện SPL
Giao diện dòng lệnh
PHP được tạo ra để viết các ứng dụng web, nhưng cũng hữu ích cho các chương trình giao diện dòng lệnh [CLI]. Các chương trình PHP dòng lệnh có thể giúp tự động hóa các tác vụ phổ biến như thử nghiệm, triển khai và quản trị ứng dụng
Các chương trình CLI PHP rất mạnh mẽ vì bạn có thể sử dụng trực tiếp mã ứng dụng của mình mà không cần phải tạo và bảo mật GUI web cho nó. Chỉ cần đảm bảo không đặt các tập lệnh PHP CLI của bạn vào thư mục gốc web công cộng của bạn
Hãy thử chạy PHP từ dòng lệnh của bạn
> php -S localhost:8000
4Tùy chọn
> php -S localhost:8000
49 sẽ in cấu hình PHP của bạn giống như hàm phpcbf -w --standard=PSR1 file.php
80Tùy chọn
phpcbf -w --standard=PSR1 file.php
81 cung cấp shell tương tác, tương tự như IRB của ruby hoặc shell tương tác của python. Ngoài ra còn có một số tùy chọn dòng lệnh hữu ích khácHãy viết một chương trình CLI “Xin chào, $name” đơn giản. Để dùng thử, hãy tạo một tệp có tên
phpcbf -w --standard=PSR1 file.php
82, như bên dướiphpcbf -w --standard=PSR1 file.php
8PHP thiết lập hai biến đặc biệt dựa trên các đối số mà tập lệnh của bạn được chạy cùng.
phpcbf -w --standard=PSR1 file.php
83 là biến số nguyên chứa số đối số và phpcbf -w --standard=PSR1 file.php
84 là biến mảng chứa giá trị của từng đối số. Đối số đầu tiên luôn là tên của tệp script PHP của bạn, trong trường hợp này là phpcbf -w --standard=PSR1 file.php
82Biểu thức
phpcbf -w --standard=PSR1 file.php
86 được sử dụng với một số khác 0 để cho trình bao biết rằng lệnh không thành công. Mã thoát thường được sử dụng có thể được tìm thấy ở đâyĐể chạy tập lệnh của chúng tôi, ở trên, từ dòng lệnh
brew unlink php
brew link --overwrite php@8.0
0Xdebug
Một trong những công cụ hữu ích nhất trong phát triển phần mềm là trình sửa lỗi thích hợp. Nó cho phép bạn theo dõi quá trình thực thi mã của mình và theo dõi nội dung của ngăn xếp. Xdebug, trình sửa lỗi của PHP, có thể được sử dụng bởi nhiều IDE khác nhau để cung cấp Điểm dừng và kiểm tra ngăn xếp. Nó cũng có thể cho phép các công cụ như PHPUnit và KCacheGrind thực hiện phân tích phạm vi mã và lập hồ sơ mã
Nếu bạn thấy mình bị ràng buộc, sẵn sàng dùng đến
phpcbf -w --standard=PSR1 file.php
87/phpcbf -w --standard=PSR1 file.php
88 mà vẫn không thể tìm ra giải pháp - có thể bạn cần sử dụng trình gỡ lỗiViệc cài đặt Xdebug có thể phức tạp, nhưng một trong những tính năng quan trọng nhất của nó là “Gỡ lỗi từ xa” - nếu bạn phát triển mã cục bộ và sau đó kiểm tra nó bên trong máy ảo hoặc trên một máy chủ khác, thì tính năng Gỡ lỗi từ xa là tính năng mà bạn sẽ muốn bật ngay lập tức
Theo truyền thống, bạn sẽ sửa đổi Apache Vhost hoặc. htaccess với các giá trị này
brew unlink php
brew link --overwrite php@8.0
1“Máy chủ từ xa” và “cổng từ xa” sẽ tương ứng với máy tính cục bộ của bạn và cổng mà bạn định cấu hình IDE của mình để nghe trên đó. Sau đó, vấn đề chỉ là đặt IDE của bạn ở chế độ “lắng nghe kết nối” và tải URL
brew unlink php
brew link --overwrite php@8.0
2IDE của bạn bây giờ sẽ chặn trạng thái hiện tại khi tập lệnh thực thi, cho phép bạn đặt các điểm dừng và thăm dò các giá trị trong bộ nhớ
Trình gỡ lỗi đồ họa giúp dễ dàng chuyển qua mã, kiểm tra các biến và đánh giá mã so với thời gian chạy trực tiếp. Nhiều IDE có hỗ trợ tích hợp sẵn hoặc dựa trên plugin để gỡ lỗi đồ họa với Xdebug. MacGDBp là GUI Xdebug độc lập, mã nguồn mở, miễn phí dành cho Mac
Có rất nhiều thư viện, khung và thành phần PHP để lựa chọn. Dự án của bạn có thể sẽ sử dụng một vài trong số chúng — đây là những phần phụ thuộc của dự án. Cho đến gần đây, PHP không có cách tốt để quản lý các phụ thuộc dự án này. Ngay cả khi bạn quản lý chúng theo cách thủ công, bạn vẫn phải lo lắng về trình tải tự động. Đó không còn là vấn đề
Hiện tại có hai hệ thống quản lý gói chính cho PHP - và. Trình soạn thảo hiện là trình quản lý gói phổ biến nhất cho PHP, tuy nhiên trong một thời gian dài, PEAR là trình quản lý gói chính được sử dụng. Biết lịch sử của PEAR là một ý tưởng hay, vì bạn vẫn có thể tìm thấy các tài liệu tham khảo về nó ngay cả khi bạn không bao giờ sử dụng nó
Nhà soạn nhạc và Packagist
Trình soạn thảo là trình quản lý phụ thuộc được đề xuất cho PHP. Liệt kê các phần phụ thuộc của dự án trong tệp
phpcbf -w --standard=PSR1 file.php
89 và với một vài lệnh đơn giản, Trình soạn thảo sẽ tự động tải xuống các phần phụ thuộc của dự án và thiết lập tự động tải cho bạn. Trình soạn thảo tương tự như NPM trong nút. js hoặc Bundler trong thế giới RubyCó rất nhiều thư viện PHP tương thích với Composer và sẵn sàng để sử dụng trong dự án của bạn. Các “gói” này được liệt kê trên Packagist, kho lưu trữ chính thức cho các thư viện PHP tương thích với Composer
Cách cài đặt Trình soạn nhạc
Cách an toàn nhất để tải xuống trình soạn nhạc là làm theo hướng dẫn chính thức. Điều này sẽ xác minh trình cài đặt không bị hỏng hoặc giả mạo. Trình cài đặt cài đặt tệp nhị phân
brew unlink php
brew link --overwrite php@8.0
00 trong thư mục làm việc hiện tại của bạnChúng tôi khuyên bạn nên cài đặt Composer trên toàn cầu [e. g. một bản duy nhất trong
brew unlink php
brew link --overwrite php@8.0
01]. Để làm như vậy, hãy chạy lệnh này tiếp theobrew unlink php
brew link --overwrite php@8.0
3Ghi chú. Nếu cách trên không thành công do quyền, hãy thêm tiền tố vào
brew unlink php
brew link --overwrite php@8.0
02Để chạy Trình soạn thảo được cài đặt cục bộ, bạn sẽ sử dụng
brew unlink php
brew link --overwrite php@8.0
03, trên toàn cầu, nó chỉ đơn giản là brew unlink php
brew link --overwrite php@8.0
04Cài đặt trên Windows
Đối với người dùng Windows, cách dễ nhất để thiết lập và chạy là sử dụng trình cài đặt ComposerSetup, trình cài đặt này thực hiện cài đặt chung và thiết lập
brew unlink php
brew link --overwrite php@8.0
05 của bạn để bạn có thể chỉ cần gọi brew unlink php
brew link --overwrite php@8.0
04 từ bất kỳ thư mục nào trong dòng lệnh của mìnhCách xác định và cài đặt các phụ thuộc
Trình soạn thảo theo dõi các phụ thuộc của dự án của bạn trong một tệp có tên là
phpcbf -w --standard=PSR1 file.php
89. Bạn có thể quản lý nó bằng tay nếu muốn hoặc sử dụng chính Composer. Lệnh brew unlink php
brew link --overwrite php@8.0
08 thêm một phụ thuộc dự án và nếu bạn không có tệp phpcbf -w --standard=PSR1 file.php
89, một tệp sẽ được tạo. Đây là một ví dụ thêm Twig làm phụ thuộc cho dự án của bạnbrew unlink php
brew link --overwrite php@8.0
4Ngoài ra, lệnh
brew unlink php
brew link --overwrite php@8.0
10 sẽ hướng dẫn bạn cách tạo tệp phpcbf -w --standard=PSR1 file.php
89 đầy đủ cho dự án của bạn. Dù bằng cách nào, khi bạn đã tạo tệp phpcbf -w --standard=PSR1 file.php
89 của mình, bạn có thể yêu cầu Trình soạn thảo tải xuống và cài đặt các phụ thuộc của bạn vào thư mục > php -S localhost:8000
40. Điều này cũng áp dụng cho các dự án bạn đã tải xuống đã cung cấp tệp phpcbf -w --standard=PSR1 file.php
89brew unlink php
brew link --overwrite php@8.0
5Tiếp theo, thêm dòng này vào tệp PHP chính của ứng dụng của bạn;
brew unlink php
brew link --overwrite php@8.0
6brew unlink php
brew link --overwrite php@8.0
15 lưu trữ phiên bản chính xác của từng gói mà nó đã tải xuống khi bạn chạy brew unlink php
brew link --overwrite php@8.0
16 lần đầu tiên. Nếu bạn chia sẻ dự án của mình với người khác, hãy đảm bảo bao gồm tệp brew unlink php
brew link --overwrite php@8.0
17 để khi họ chạy brew unlink php
brew link --overwrite php@8.0
16, họ sẽ nhận được các phiên bản giống như bạn. Để cập nhật các phụ thuộc của bạn, hãy chạy brew unlink php
brew link --overwrite php@8.0
19. Không sử dụng brew unlink php
brew link --overwrite php@8.0
19 khi triển khai, chỉ sử dụng brew unlink php
brew link --overwrite php@8.0
16, nếu không, bạn có thể kết thúc với các phiên bản gói khác nhau khi sản xuấtĐiều này hữu ích nhất khi bạn xác định các yêu cầu phiên bản của mình một cách linh hoạt. Chẳng hạn, yêu cầu phiên bản của
brew unlink php
brew link --overwrite php@8.0
22 có nghĩa là “bất kỳ thứ gì mới hơn brew unlink php
brew link --overwrite php@8.0
23, nhưng ít hơn brew unlink php
brew link --overwrite php@8.0
24”. Bạn cũng có thể sử dụng ký tự đại diện brew unlink php
brew link --overwrite php@8.0
25 như trong brew unlink php
brew link --overwrite php@8.0
26. Giờ đây, lệnh brew unlink php
brew link --overwrite php@8.0
19 của Nhà soạn nhạc sẽ nâng cấp tất cả các phụ thuộc của bạn lên phiên bản mới nhất phù hợp với các hạn chế mà bạn xác địnhĐể nhận thông báo về các bản phát hành phiên bản mới, bạn có thể đăng ký thư viện. io, một dịch vụ web có thể giám sát các phụ thuộc và gửi cho bạn thông báo về các bản cập nhật
Kiểm tra các phụ thuộc của bạn để tìm các vấn đề bảo mật
Trình kiểm tra bảo mật PHP cục bộ là một công cụ dòng lệnh, sẽ kiểm tra tệp
brew unlink php
brew link --overwrite php@8.0
17 của bạn và cho bạn biết nếu bạn cần cập nhật bất kỳ phần phụ thuộc nào của mìnhXử lý các phụ thuộc toàn cầu với Composer
Trình soạn thảo cũng có thể xử lý các phụ thuộc toàn cầu và các tệp nhị phân của chúng. Cách sử dụng rất đơn giản, tất cả những gì bạn cần làm là thêm tiền tố vào lệnh của bạn với
brew unlink php
brew link --overwrite php@8.0
29. Ví dụ: nếu bạn muốn cài đặt PHPUnit và nó có sẵn trên toàn cầu, bạn sẽ chạy lệnh saubrew unlink php
brew link --overwrite php@8.0
7Điều này sẽ tạo một thư mục
brew unlink php
brew link --overwrite php@8.0
30 nơi chứa các phụ thuộc toàn cầu của bạn. Để có sẵn các tệp nhị phân của các gói đã cài đặt ở mọi nơi, sau đó bạn sẽ thêm thư mục brew unlink php
brew link --overwrite php@8.0
31 vào biến brew unlink php
brew link --overwrite php@8.0
05 của mìnhbrew unlink php
brew link --overwrite php@8.0
33 và thực thi nó. Tài liệu PEAR có hướng dẫn cài đặt chi tiết cho mọi hệ điều hànhNếu bạn đang sử dụng Linux, bạn cũng có thể xem trình quản lý gói phân phối của mình. Ví dụ, Debian và Ubuntu có gói apt
brew unlink php
brew link --overwrite php@8.0
34Làm thế nào để cài đặt một gói
Nếu gói được liệt kê trong danh sách gói PEAR, bạn có thể cài đặt nó bằng cách chỉ định tên chính thức
brew unlink php
brew link --overwrite php@8.0
8Nếu gói được lưu trữ trên một kênh khác, trước tiên bạn cần phải
brew unlink php
brew link --overwrite php@8.0
35 kênh đó và cũng chỉ định kênh đó khi cài đặt. Xem tài liệu Sử dụng kênh để biết thêm thông tin về chủ đề nàyXử lý các phụ thuộc PEAR với Composer
Nếu bạn đang sử dụng và bạn cũng muốn cài đặt một số mã PEAR, bạn có thể sử dụng Trình soạn thảo để xử lý các phụ thuộc PEAR của mình. Ví dụ này sẽ cài đặt mã từ
brew unlink php
brew link --overwrite php@8.0
36brew unlink php
brew link --overwrite php@8.0
9Phần đầu tiên
brew unlink php
brew link --overwrite php@8.0
37 sẽ được sử dụng để cho Composer biết nó nên “khởi tạo” [hoặc “khám phá” theo thuật ngữ PEAR] repo lê. Sau đó, phần brew unlink php
brew link --overwrite php@8.0
38 sẽ thêm tiền tố vào tên gói như thế nàylê-kênh/Gói
Tiền tố “lê” được mã hóa cứng để tránh bất kỳ xung đột nào, chẳng hạn như kênh lê có thể giống với tên nhà cung cấp gói khác, sau đó, tên ngắn của kênh [hoặc URL đầy đủ] có thể được sử dụng để tham chiếu gói đó nằm trong kênh nào
Khi mã này được cài đặt, nó sẽ có sẵn trong thư mục nhà cung cấp của bạn và tự động có sẵn thông qua trình tải tự động Trình soạn thảo
nhà cung cấp/lê-lê2. php. net/PEAR2_HTTP_Request/pear2/HTTP/Yêu cầu. php
Để sử dụng gói PEAR này, chỉ cần tham khảo nó như vậy
brew unlink php
brew link --overwrite php@8.0
6brew unlink php
brew link --overwrite php@8.0
39 phương pháp xuất xưởng hoặc thực hiện brew unlink php
brew link --overwrite php@8.0
40 để lấy ngày giờ hiện tại. Sử dụng phương pháp brew unlink php
brew link --overwrite php@8.0
41 để chuyển đổi DateTime trở lại chuỗi cho đầu rabrew unlink php
brew link --overwrite php@8.1
1Có thể tính toán với DateTime với lớp DateInterval. DateTime có các phương thức như
brew unlink php
brew link --overwrite php@8.0
42 và brew unlink php
brew link --overwrite php@8.0
43 lấy DateInterval làm đối số. Không viết mã có cùng số giây mỗi ngày. Cả tiết kiệm ánh sáng ban ngày và thay đổi múi giờ sẽ phá vỡ giả định đó. Thay vào đó hãy sử dụng khoảng thời gian ngày. Để tính chênh lệch ngày, hãy sử dụng phương pháp brew unlink php
brew link --overwrite php@8.0
44. Nó sẽ trả về DateInterval mới, rất dễ hiển thịbrew unlink php
brew link --overwrite php@8.1
2Bạn có thể sử dụng phép so sánh tiêu chuẩn trên các đối tượng DateTime
brew unlink php
brew link --overwrite php@8.0
6brew unlink php
brew link --overwrite php@8.0
45______446 và brew unlink php
brew link --overwrite php@8.0
47, cần được xem xét đặc biệt. Các chức năng này thường có một đối tác brew unlink php
brew link --overwrite php@8.0
48. ví dụ: brew unlink php
brew link --overwrite php@8.0
49 và brew unlink php
brew link --overwrite php@8.0
50. Các chuỗi brew unlink php
brew link --overwrite php@8.0
48 này được cung cấp cho bạn thông qua Tiện ích mở rộng chuỗi nhiều byte và được thiết kế đặc biệt để hoạt động trên các chuỗi UnicodeBạn phải sử dụng các hàm
brew unlink php
brew link --overwrite php@8.0
48 bất cứ khi nào bạn thao tác trên chuỗi Unicode. Ví dụ: nếu bạn sử dụng brew unlink php
brew link --overwrite php@8.0
53 trên chuỗi UTF-8, rất có thể kết quả sẽ bao gồm một số nửa ký tự bị cắt xén. Chức năng chính xác để sử dụng sẽ là đối tác nhiều byte, brew unlink php
brew link --overwrite php@8.0
54Phần khó là luôn nhớ sử dụng các hàm
brew unlink php
brew link --overwrite php@8.0
48. Nếu bạn quên dù chỉ một lần, chuỗi Unicode của bạn có khả năng bị cắt xén trong quá trình xử lý tiếp theoKhông phải tất cả các hàm chuỗi đều có đối tác
brew unlink php
brew link --overwrite php@8.0
48. Nếu không có ai cho những gì bạn muốn làm, thì bạn có thể không gặp mayBạn nên sử dụng hàm
brew unlink php
brew link --overwrite php@8.0
57 ở đầu mỗi tập lệnh PHP mà bạn viết [hoặc ở đầu tập lệnh bao gồm toàn cầu của bạn] và hàm brew unlink php
brew link --overwrite php@8.0
58 ngay sau nó nếu tập lệnh của bạn xuất ra trình duyệt. Việc xác định rõ ràng mã hóa các chuỗi của bạn trong mọi tập lệnh sẽ giúp bạn đỡ phải đau đầu hơn rất nhiềuNgoài ra, nhiều hàm PHP hoạt động trên chuỗi có tham số tùy chọn cho phép bạn chỉ định mã hóa ký tự. Bạn phải luôn chỉ rõ ràng UTF-8 khi được cung cấp tùy chọn. Ví dụ:
brew unlink php
brew link --overwrite php@8.0
59 có tùy chọn mã hóa ký tự và bạn phải luôn chỉ định UTF-8 nếu xử lý các chuỗi đó. Lưu ý rằng kể từ PHP 5. 4. 0, UTF-8 là mã hóa mặc định cho brew unlink php
brew link --overwrite php@8.0
59 và brew unlink php
brew link --overwrite php@8.0
61Cuối cùng, nếu bạn đang xây dựng một ứng dụng phân tán và không thể chắc chắn rằng tiện ích mở rộng
brew unlink php
brew link --overwrite php@8.0
62 sẽ được bật hay không, thì hãy cân nhắc sử dụng gói symfony/polyfill-mbstring Composer. Điều này sẽ sử dụng brew unlink php
brew link --overwrite php@8.0
62 nếu nó khả dụng và quay lại các chức năng không phải UTF-8 nếu khôngUTF-8 ở cấp Cơ sở dữ liệu
Nếu tập lệnh PHP của bạn truy cập MySQL, thì có khả năng các chuỗi của bạn có thể được lưu trữ dưới dạng các chuỗi không phải UTF-8 trong cơ sở dữ liệu ngay cả khi bạn tuân theo tất cả các biện pháp phòng ngừa ở trên
Để đảm bảo chuỗi của bạn chuyển từ PHP sang MySQL dưới dạng UTF-8, hãy đảm bảo rằng cơ sở dữ liệu và bảng của bạn đều được đặt thành bộ ký tự và đối chiếu
brew unlink php
brew link --overwrite php@8.0
64, đồng thời bạn sử dụng bộ ký tự brew unlink php
brew link --overwrite php@8.0
64 trong chuỗi kết nối PDO. Xem mã ví dụ bên dưới. Điều này cực kỳ quan trọngLưu ý rằng bạn phải sử dụng bộ ký tự
brew unlink php
brew link --overwrite php@8.0
64 để hỗ trợ UTF-8 hoàn chỉnh, không phải bộ ký tự brew unlink php
brew link --overwrite php@8.0
67. Xem phần Đọc thêm để biết tại saoUTF-8 ở cấp độ trình duyệt
Sử dụng hàm
brew unlink php
brew link --overwrite php@8.0
58 để đảm bảo rằng tập lệnh PHP của bạn xuất ra các chuỗi UTF-8 cho trình duyệt của bạnSau đó, trình duyệt sẽ cần được thông báo bằng phản hồi HTTP rằng trang này phải được coi là UTF-8. Ngày nay, người ta thường đặt bộ ký tự trong tiêu đề phản hồi HTTP như thế này
Thẻbrew unlink php
brew link --overwrite php@8.0
6brew unlink php
brew link --overwrite php@8.0
69 trong thẻ của trang của bạnbrew unlink php
brew link --overwrite php@8.1
6đọc thêm
brew unlink php
brew link --overwrite php@8.0
70. Nó có từ năm 1995 và vẫn là một triển khai hoàn chỉnh để dịch phần mềm. Thật dễ dàng để chạy, trong khi vẫn có các công cụ hỗ trợ mạnh mẽ. Đó là về Gettext chúng ta sẽ nói ở đây. Ngoài ra, để giúp bạn không bị lộn xộn với dòng lệnh, chúng tôi sẽ giới thiệu một ứng dụng GUI tuyệt vời có thể được sử dụng để cập nhật nguồn l10n của bạn một cách dễ dàngCó các thư viện phổ biến được sử dụng hỗ trợ Gettext và các triển khai khác của i18n. Một số trong số chúng có vẻ dễ cài đặt hơn hoặc có các tính năng bổ sung hoặc định dạng tệp i18n. Trong tài liệu này, chúng tôi tập trung vào các công cụ được cung cấp cùng với lõi PHP, nhưng ở đây chúng tôi liệt kê các công cụ khác để hoàn thiện
- hào quang/quốc tế. Cung cấp các công cụ quốc tế hóa [I18N], cụ thể là bản dịch thông báo theo ngôn ngữ theo định hướng gói. Nó sử dụng định dạng mảng cho tin nhắn. Không cung cấp trình trích xuất tin nhắn, nhưng cung cấp định dạng tin nhắn nâng cao thông qua tiện ích mở rộng
71 [bao gồm cả tin nhắn số nhiều]brew unlink php brew link --overwrite php@8.0
- oscarotero/Gettext. Hỗ trợ Gettext với giao diện OO; . Có thể hữu ích nếu bạn cần tích hợp các tệp dịch của mình vào các phần khác của hệ thống, chẳng hạn như giao diện JavaScript
- symfony/bản dịch. hỗ trợ rất nhiều định dạng khác nhau, nhưng khuyên bạn nên sử dụng XLIFF dài dòng. Không bao gồm các chức năng của trình trợ giúp cũng như trình trích xuất tích hợp, nhưng hỗ trợ trình giữ chỗ sử dụng nội bộ
74brew unlink php brew link --overwrite php@8.0
- laminas/laminas-i18n. hỗ trợ các tệp mảng và INI hoặc định dạng Gettext. Triển khai một lớp bộ nhớ đệm để giúp bạn không phải đọc hệ thống tệp mỗi lần. Nó cũng bao gồm các trình trợ giúp chế độ xem cũng như các trình xác thực và bộ lọc đầu vào nhận biết ngôn ngữ. Tuy nhiên, nó không có trình trích xuất tin nhắn
Các khung khác cũng bao gồm các mô-đun i18n, nhưng chúng không có sẵn bên ngoài cơ sở mã của chúng
- Laravel hỗ trợ các tệp mảng cơ bản, không có trình trích xuất tự động nhưng bao gồm một trình trợ giúp
75 cho các tệp mẫubrew unlink php brew link --overwrite php@8.0
- Yii hỗ trợ dịch mảng, Gettext và dựa trên cơ sở dữ liệu, đồng thời bao gồm một trình trích xuất thông báo. Nó được hỗ trợ bởi tiện ích mở rộng
76, có sẵn kể từ PHP 5. 3, và dựa trên dự án ICU;brew unlink php brew link --overwrite php@8.0
Nếu bạn quyết định sử dụng một trong những thư viện không cung cấp trình trích xuất, bạn có thể muốn sử dụng các định dạng gettext, vì vậy bạn có thể sử dụng chuỗi công cụ gettext gốc [bao gồm cả Poedit] như được mô tả trong phần còn lại của chương
Nhận văn bản
Cài đặt
Bạn có thể cần cài đặt Gettext và thư viện PHP có liên quan bằng cách sử dụng trình quản lý gói của mình, như
brew unlink php
brew link --overwrite php@8.0
77 hoặc brew unlink php
brew link --overwrite php@8.0
78. Sau khi cài đặt, kích hoạt nó bằng cách thêm brew unlink php
brew link --overwrite php@8.0
79 [Linux/Unix] hoặc brew unlink php
brew link --overwrite php@8.0
80 [Windows] vào brew unlink php
brew link --overwrite php@8.0
81 của bạnỞ đây chúng tôi cũng sẽ sử dụng Poedit để tạo tệp dịch. Bạn có thể sẽ tìm thấy nó trong trình quản lý gói của hệ thống;
Kết cấu
Các loại tệp
Có ba tệp bạn thường xử lý khi làm việc với gettext. Các tệp chính là các tệp PO [Đối tượng di động] và MO [Đối tượng máy], tệp đầu tiên là danh sách các “đối tượng được dịch” có thể đọc được và tệp thứ hai, tệp nhị phân tương ứng được giải thích bởi gettext khi thực hiện bản địa hóa. Ngoài ra còn có một tệp POT [Mẫu], chỉ chứa tất cả các khóa hiện có từ các tệp nguồn của bạn và có thể được sử dụng làm hướng dẫn để tạo và cập nhật tất cả các tệp PO. Các tệp mẫu đó không bắt buộc. tùy thuộc vào công cụ bạn đang sử dụng để thực hiện l10n, bạn có thể thực hiện tốt chỉ với các tệp PO/MO. Bạn sẽ luôn có một cặp tệp PO/MO cho mỗi ngôn ngữ và khu vực, nhưng chỉ có một POT cho mỗi miền
tên miền
Có một số trường hợp, trong các dự án lớn, bạn có thể cần phải tách các bản dịch khi cùng một từ truyền đạt ý nghĩa khác nhau tùy theo ngữ cảnh. Trong những trường hợp đó, bạn chia chúng thành các miền khác nhau. Về cơ bản, chúng là các nhóm tệp POT/PO/MO được đặt tên, trong đó tên tệp là miền dịch đã nói. Các dự án vừa và nhỏ thường chỉ sử dụng một miền để đơn giản; . Ví dụ, trong các dự án Symfony, các miền được sử dụng để phân tách bản dịch cho các thông báo xác thực
mã địa phương
Ngôn ngữ chỉ đơn giản là một mã xác định một phiên bản của ngôn ngữ. Nó được xác định theo thông số kỹ thuật ISO 639-1 và ISO 3166-1 alpha-2. hai chữ cái viết thường cho ngôn ngữ, tùy chọn theo sau là gạch dưới và hai chữ cái viết hoa xác định quốc gia hoặc mã vùng. Đối với , ba chữ cái được sử dụng
Đối với một số người nói, phần quốc gia có vẻ dư thừa. Trên thực tế, một số ngôn ngữ có phương ngữ ở các quốc gia khác nhau, chẳng hạn như tiếng Đức gốc Áo [
brew unlink php
brew link --overwrite php@8.0
82] hoặc tiếng Bồ Đào Nha Brazil [brew unlink php
brew link --overwrite php@8.0
83]. Phần thứ hai được sử dụng để phân biệt giữa các phương ngữ đó - khi không có nó, nó được coi là phiên bản “chung” hoặc “lai” của ngôn ngữCấu trúc thư mục
Để sử dụng Gettext, chúng ta cần tuân theo một cấu trúc thư mục cụ thể. Trước tiên, bạn sẽ cần chọn một gốc tùy ý cho các tệp l10n trong kho lưu trữ nguồn của mình. Bên trong nó, bạn sẽ có một thư mục cho từng ngôn ngữ cần thiết và một thư mục
brew unlink php
brew link --overwrite php@8.0
84 cố định sẽ chứa tất cả các cặp PO/MO của bạn. Thí dụbrew unlink php
brew link --overwrite php@8.1
7Hình thức số nhiều
Như chúng tôi đã nói trong phần giới thiệu, các ngôn ngữ khác nhau có thể áp dụng các quy tắc số nhiều khác nhau. Tuy nhiên, gettext cứu chúng ta khỏi rắc rối này một lần nữa. Khi tạo tệp
brew unlink php
brew link --overwrite php@8.0
85 mới, bạn sẽ phải khai báo các quy tắc số nhiều cho ngôn ngữ đó và các phần đã dịch nhạy cảm với số nhiều sẽ có dạng khác nhau cho từng quy tắc đó. Khi gọi Gettext trong mã, bạn sẽ phải chỉ định số liên quan đến câu và nó sẽ tìm ra dạng chính xác để sử dụng - thậm chí sử dụng thay thế chuỗi nếu cầnQuy tắc số nhiều bao gồm số lượng số nhiều có sẵn và phép thử boolean với
brew unlink php
brew link --overwrite php@8.0
86 sẽ xác định số đã cho rơi vào quy tắc nào [bắt đầu đếm bằng 0]. Ví dụ- tiếng Nhật.
87 - chỉ có một quy tắcbrew unlink php brew link --overwrite php@8.0
- Tiếng Anh.
88 - hai quy tắc, thứ nhất nếu N là một, quy tắc thứ hai ngược lạibrew unlink php brew link --overwrite php@8.0
- tiếng Bồ Đào Nha của người brazi.
89 - hai quy tắc, thứ hai nếu N lớn hơn một, thứ nhất nếu khôngbrew unlink php brew link --overwrite php@8.0
Bây giờ bạn đã hiểu cơ sở về cách thức hoạt động của các quy tắc số nhiều - và nếu bạn chưa hiểu, vui lòng xem phần giải thích sâu hơn về -, bạn có thể muốn sao chép những cái bạn cần từ danh sách thay vì viết chúng bằng tay
Khi gọi Gettext để bản địa hóa các câu có bộ đếm, bạn cũng sẽ phải cung cấp cho nó số liên quan. Gettext sẽ tìm ra quy tắc nào sẽ có hiệu lực và sử dụng đúng phiên bản đã bản địa hóa. Bạn sẽ cần đưa vào tệp
brew unlink php
brew link --overwrite php@8.0
85 một câu khác cho mỗi quy tắc số nhiều được xác địnhtriển khai mẫu
Sau tất cả những lý thuyết đó, chúng ta hãy thực hành một chút. Đây là đoạn trích của tệp
brew unlink php
brew link --overwrite php@8.0
85 - đừng bận tâm đến định dạng của nó, thay vào đó hãy quan tâm đến nội dung tổng thể; brew unlink php
brew link --overwrite php@8.1
8Phần đầu tiên hoạt động giống như một tiêu đề, có
brew unlink php
brew link --overwrite php@8.0
92 và brew unlink php
brew link --overwrite php@8.0
93 đặc biệt trống. Nó mô tả mã hóa tệp, dạng số nhiều và những thứ khác ít liên quan hơn. Phần thứ hai dịch một chuỗi đơn giản từ tiếng Anh sang tiếng Bồ Đào Nha Brazil và phần thứ ba thực hiện tương tự, nhưng tận dụng thay thế chuỗi từ brew unlink php
brew link --overwrite php@8.0
94 để bản dịch có thể chứa tên người dùng và ngày truy cập. Phần cuối cùng là một mẫu các dạng số nhiều, hiển thị phiên bản số ít và số nhiều là brew unlink php
brew link --overwrite php@8.0
92 trong tiếng Anh và các bản dịch tương ứng của chúng là brew unlink php
brew link --overwrite php@8.0
93 0 và 1 [theo số được đưa ra bởi quy tắc số nhiều]. Ở đó, thay thế chuỗi cũng được sử dụng để số có thể được nhìn thấy trực tiếp trong câu, bằng cách sử dụng brew unlink php
brew link --overwrite php@8.0
97. Dạng số nhiều luôn có hai brew unlink php
brew link --overwrite php@8.0
92 [số ít và số nhiều], vì vậy không nên sử dụng ngôn ngữ phức tạp làm nguồn dịchThảo luận về phím l10n
Như bạn có thể nhận thấy, chúng tôi đang sử dụng làm ID nguồn câu thực tế bằng tiếng Anh.
brew unlink php
brew link --overwrite php@8.0
92 đó được sử dụng giống nhau trong tất cả các tệp brew unlink php
brew link --overwrite php@8.0
85 của bạn, nghĩa là các ngôn ngữ khác sẽ có cùng định dạng và cùng các trường brew unlink php
brew link --overwrite php@8.0
92 nhưng đã dịch các dòng brew unlink php
brew link --overwrite php@8.0
93Nói về khóa dịch, có hai “trường phái” chính ở đây
92 như một câu thực. Những lợi thế chính làbrew unlink php brew link --overwrite php@8.0
- nếu có các phần của phần mềm chưa được dịch sang bất kỳ ngôn ngữ cụ thể nào, khóa được hiển thị sẽ vẫn giữ một số ý nghĩa. Thí dụ. nếu bạn tình cờ dịch thuộc lòng từ tiếng Anh sang tiếng Tây Ban Nha nhưng cần trợ giúp để dịch sang tiếng Pháp, bạn có thể xuất bản trang mới thiếu các câu tiếng Pháp và thay vào đó, các phần của trang web sẽ được hiển thị bằng tiếng Anh;
- người dịch sẽ dễ dàng hiểu những gì đang diễn ra hơn và thực hiện một bản dịch phù hợp dựa trên
92;brew unlink php brew link --overwrite php@8.0
- nó cung cấp cho bạn l10n “miễn phí” cho một ngôn ngữ - ngôn ngữ nguồn;
- Nhược điểm duy nhất. nếu bạn cần thay đổi văn bản thực tế, bạn sẽ cần thay thế cùng một
92 trên một số tệp ngôn ngữbrew unlink php brew link --overwrite php@8.0
92 dưới dạng khóa có cấu trúc, duy nhất. Nó sẽ mô tả vai trò của câu trong ứng dụng theo cách có cấu trúc, bao gồm mẫu hoặc phần chứa chuỗi thay vì nội dung của nóbrew unlink php brew link --overwrite php@8.0
- đó là một cách tuyệt vời để sắp xếp mã, tách nội dung văn bản khỏi logic mẫu
- tuy nhiên, điều đó có thể gây ra vấn đề cho người dịch sẽ bỏ sót ngữ cảnh. Cần có tệp ngôn ngữ nguồn để làm cơ sở cho các bản dịch khác. Thí dụ. lý tưởng nhất là nhà phát triển sẽ có một tệp
07, chẳng hạn như người dịch sẽ đọc để hiểu những gì cần viết trongbrew unlink php brew link --overwrite php@8.1
08brew unlink php brew link --overwrite php@8.1
- bản dịch bị thiếu sẽ hiển thị các phím vô nghĩa trên màn hình [_______509 thay vì
10 trên trang tiếng Pháp chưa được dịch đã nói]. Điều đó tốt vì nó sẽ buộc bản dịch phải hoàn thành trước khi xuất bản - tuy nhiên, thật tệ vì các vấn đề dịch thuật sẽ cực kỳ khủng khiếp trong giao diện. Tuy nhiên, một số thư viện bao gồm một tùy chọn để chỉ định một ngôn ngữ nhất định là "dự phòng", có hành vi tương tự như cách tiếp cận khácbrew unlink php brew link --overwrite php@8.1
Hướng dẫn sử dụng Gettext ủng hộ cách tiếp cận đầu tiên vì nói chung, nó dễ dàng hơn cho người dịch và người dùng trong trường hợp gặp sự cố. Đó là cách chúng tôi sẽ làm việc ở đây. Tuy nhiên, bản dịch dựa trên từ khóa được ưu tiên hơn, để cho phép thay đổi độc lập tất cả các bản dịch mà không ảnh hưởng đến cả các mẫu
sử dụng hàng ngày
Trong một ứng dụng điển hình, bạn sẽ sử dụng một số chức năng Gettext khi viết văn bản tĩnh trong các trang của mình. Những câu đó sau đó sẽ xuất hiện trong tệp
brew unlink php
brew link --overwrite php@8.0
85, được dịch, biên dịch thành tệp brew unlink php
brew link --overwrite php@8.1
12 và sau đó được Gettext sử dụng khi kết xuất giao diện thực tế. Vì vậy, hãy kết hợp những gì chúng ta đã thảo luận cho đến nay trong một ví dụ từng bước1. Tệp mẫu mẫu, bao gồm một số lệnh gọi gettext khác nhau
brew unlink php
brew link --overwrite php@8.1
9
13 chỉ cần dịch mộtbrew unlink php brew link --overwrite php@8.1
92 thành mộtbrew unlink php brew link --overwrite php@8.0
93 tương ứng cho một ngôn ngữ nhất định. Ngoài ra còn có hàm tốc kýbrew unlink php brew link --overwrite php@8.0
16 hoạt động theo cách tương tự;brew unlink php brew link --overwrite php@8.1
17 cũng làm như vậy nhưng với quy tắc số nhiều;brew unlink php brew link --overwrite php@8.1
- Ngoài ra còn có
18 vàbrew unlink php brew link --overwrite php@8.1
19, cho phép bạn ghi đè tên miền cho một cuộc gọi. Thông tin thêm về cấu hình miền trong ví dụ tiếp theobrew unlink php brew link --overwrite php@8.1
2. Tệp thiết lập mẫu [_______520 như được sử dụng ở trên], chọn đúng ngôn ngữ và định cấu hình Gettext
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
703. Chuẩn bị dịch cho lần chạy đầu tiên
Một trong những lợi thế lớn của Gettext so với các gói i18n khung tùy chỉnh là định dạng tệp mở rộng và mạnh mẽ của nó. “Ôi trời, hơi khó hiểu và chỉnh sửa bằng tay, một mảng đơn giản sẽ dễ dàng hơn. ” Đừng nhầm lẫn, các ứng dụng như Poedit luôn sẵn sàng trợ giúp - rất nhiều. Bạn có thể lấy chương trình từ trang web của họ, nó miễn phí và có sẵn cho tất cả các nền tảng. Đây là một công cụ khá dễ làm quen và đồng thời là một công cụ rất mạnh - sử dụng tất cả các tính năng mà Gettext có sẵn. Hướng dẫn này dựa trên PoEdit 1. 8
Trong lần chạy đầu tiên, bạn nên chọn “File > New…” từ menu. Bạn sẽ được hỏi thẳng về ngôn ngữ. tại đây bạn có thể chọn/lọc ngôn ngữ bạn muốn dịch sang hoặc sử dụng định dạng mà chúng tôi đã đề cập trước đó, chẳng hạn như
brew unlink php
brew link --overwrite php@8.1
21 hoặc brew unlink php
brew link --overwrite php@8.0
83Bây giờ, hãy lưu tệp - cũng sử dụng cấu trúc thư mục mà chúng tôi đã đề cập. Sau đó, bạn nên nhấp vào "Trích xuất từ các nguồn" và tại đây, bạn sẽ định cấu hình các cài đặt khác nhau cho các tác vụ trích xuất và dịch thuật. Bạn sẽ có thể tìm thấy tất cả những thứ đó sau thông qua “Danh mục > Thuộc tính”
- Đường dẫn nguồn. ở đây bạn phải bao gồm tất cả các thư mục từ dự án có tên là
13 [và các anh chị em] - đây thường là [các] thư mục mẫu/lượt xem của bạn. Đây là cài đặt bắt buộc duy nhất;brew unlink php brew link --overwrite php@8.1
- Thuộc tính dịch
- Tên và phiên bản dự án, Nhóm và địa chỉ email của Nhóm. thông tin hữu ích đi vào. tiêu đề tệp po;
- Hình thức số nhiều. đây là những quy tắc mà chúng tôi đã đề cập trước đây - có một liên kết trong đó với các mẫu. Hầu hết thời gian, bạn có thể để nó với tùy chọn mặc định, vì PoEdit đã bao gồm một cơ sở dữ liệu tiện dụng gồm các quy tắc số nhiều cho nhiều ngôn ngữ
- bộ ký tự. UTF-8, tốt nhất là;
- Bộ ký tự mã nguồn. đặt ở đây bộ ký tự được sử dụng bởi cơ sở mã của bạn - có thể là cả UTF-8, phải không?
- từ khóa nguồn. Phần mềm cơ bản biết cách gọi
13 và các lệnh gọi hàm tương tự trong một số ngôn ngữ lập trình, nhưng bạn cũng có thể tạo các hàm dịch của riêng mình. Nó sẽ ở đây, bạn sẽ thêm các phương pháp khác. Điều này sẽ được thảo luận sau trong phần “Mẹo”brew unlink php brew link --overwrite php@8.1
Sau khi thiết lập các điểm đó, nó sẽ chạy quét qua các tệp nguồn của bạn để tìm tất cả các cuộc gọi bản địa hóa. Sau mỗi lần quét, PoEdit sẽ hiển thị tóm tắt những gì đã tìm thấy và những gì đã bị xóa khỏi tệp nguồn. Các mục mới sẽ được đưa trống vào bảng dịch và bạn sẽ bắt đầu nhập các phiên bản đã bản địa hóa của các chuỗi đó. Lưu nó và một. tệp mo sẽ được [tái] biên dịch vào cùng một thư mục và ta-dah. dự án của bạn được quốc tế hóa
4. dịch chuỗi
Như bạn có thể nhận thấy trước đây, có hai loại chuỗi bản địa hóa chính. những cái đơn giản và những cái có dạng số nhiều. Những cái đầu tiên chỉ có hai hộp. nguồn và chuỗi cục bộ. Không thể sửa đổi chuỗi nguồn vì Gettext/Poedit không bao gồm quyền thay đổi các tệp nguồn của bạn - bạn nên thay đổi chính nguồn đó và quét lại các tệp. Mẹo. bạn có thể nhấp chuột phải vào một dòng dịch và nó sẽ gợi ý cho bạn các tệp nguồn và các dòng nơi chuỗi đó đang được sử dụng. Mặt khác, các chuỗi dạng số nhiều bao gồm hai hộp để hiển thị hai chuỗi nguồn và các tab để bạn có thể định cấu hình các dạng cuối cùng khác nhau
Bất cứ khi nào bạn thay đổi nguồn của mình và cần cập nhật bản dịch, chỉ cần nhấn Làm mới và Poedit sẽ quét lại mã, xóa các mục nhập không tồn tại, hợp nhất những mục đã thay đổi và thêm mục mới. Nó cũng có thể cố gắng đoán một số bản dịch, dựa trên những bản dịch khác mà bạn đã thực hiện. Những dự đoán đó và các mục đã thay đổi sẽ nhận được điểm đánh dấu "Mờ", cho biết nó cần được xem xét, xuất hiện màu vàng trong danh sách. Nó cũng hữu ích nếu bạn có một nhóm dịch thuật và ai đó đang cố gắng viết điều gì đó mà họ không chắc chắn về nó. chỉ cần đánh dấu Mờ, và người khác sẽ đánh giá sau
Cuối cùng, bạn nên đánh dấu “Xem > Các mục chưa được dịch trước”, vì nó sẽ giúp bạn rất nhiều để không quên bất kỳ mục nào. Từ menu đó, bạn cũng có thể mở các phần của giao diện người dùng cho phép bạn để lại thông tin theo ngữ cảnh cho người dịch nếu cần
Mẹo & Thủ thuật
Các vấn đề về bộ nhớ đệm có thể xảy ra
Nếu bạn đang chạy PHP dưới dạng một mô-đun trên Apache [
brew unlink php
brew link --overwrite php@8.1
25], bạn có thể gặp sự cố với tệp brew unlink php
brew link --overwrite php@8.1
12 được lưu trong bộ đệm. Nó xảy ra lần đầu tiên nó được đọc và sau đó, để cập nhật nó, bạn có thể cần phải khởi động lại máy chủ. Trên Nginx và PHP5, thường chỉ mất vài lần làm mới trang để làm mới bộ đệm dịch và trên PHP7 hiếm khi cần thiếtCác chức năng trợ giúp bổ sung
Theo sở thích của nhiều người, việc sử dụng
brew unlink php
brew link --overwrite php@8.1
16 thay vì brew unlink php
brew link --overwrite php@8.1
13 sẽ dễ dàng hơn. Nhiều thư viện i18n tùy chỉnh từ các khung cũng sử dụng thứ gì đó tương tự như brew unlink php
brew link --overwrite php@8.1
29 để làm cho mã được dịch ngắn hơn. Tuy nhiên, đó là chức năng duy nhất có phím tắt. Bạn có thể muốn thêm vào dự án của mình một số khác, chẳng hạn như brew unlink php
brew link --overwrite php@8.1
30 hoặc brew unlink php
brew link --overwrite php@8.1
31 cho brew unlink php
brew link --overwrite php@8.1
17, hoặc có thể là một brew unlink php
brew link --overwrite php@8.1
33 ưa thích sẽ tham gia các cuộc gọi brew unlink php
brew link --overwrite php@8.1
13 và brew unlink php
brew link --overwrite php@8.1
35. Các thư viện khác, chẳng hạn như Gettext của oscarotero cũng cung cấp các hàm trợ giúp như thế nàyTrong những trường hợp đó, bạn sẽ cần hướng dẫn tiện ích Gettext cách trích xuất các chuỗi từ các hàm mới đó. Đừng sợ; . Nó chỉ là một trường trong tệp
brew unlink php
brew link --overwrite php@8.0
85 hoặc màn hình Cài đặt trên Poedit. Trong trình chỉnh sửa, tùy chọn đó nằm trong “Danh mục > Thuộc tính > Từ khóa nguồn”. Nhớ lại. Gettext đã biết các chức năng mặc định cho nhiều ngôn ngữ, vì vậy đừng sợ nếu danh sách đó trống. Bạn cần đưa vào đó các thông số kỹ thuật của các chức năng mới đó, sau đây- nếu bạn tạo một cái gì đó như
29 chỉ trả về bản dịch cho một chuỗi, bạn có thể chỉ định nó làbrew unlink php brew link --overwrite php@8.1
38. Gettext sẽ biết đối số duy nhất của hàm là chuỗi cần dịch;brew unlink php brew link --overwrite php@8.1
- nếu hàm có nhiều hơn một đối số, bạn có thể chỉ định chuỗi đầu tiên thuộc về đối số nào - và nếu cần, cả dạng số nhiều. Chẳng hạn, nếu chúng ta gọi hàm của mình như thế này.
39, thông số kỹ thuật sẽ làbrew unlink php brew link --overwrite php@8.1
40, nghĩa là biểu mẫu đầu tiên là đối số thứ nhất và biểu mẫu thứ hai là đối số thứ hai. Thay vào đó, nếu số của bạn xuất hiện dưới dạng đối số đầu tiên, thông số kỹ thuật sẽ làbrew unlink php brew link --overwrite php@8.1
41, biểu thị dạng đầu tiên là đối số thứ hai, v.v.brew unlink php brew link --overwrite php@8.1
Sau khi bao gồm các quy tắc mới đó trong tệp
brew unlink php
brew link --overwrite php@8.0
85, một lần quét mới sẽ mang lại các chuỗi mới của bạn dễ dàng như trước đâyNgười giới thiệu
từ Wikipedia
Dependency injection là một mẫu thiết kế phần mềm cho phép loại bỏ các phần phụ thuộc được mã hóa cứng và cho phép thay đổi chúng, cho dù ở thời gian chạy hay thời gian biên dịch
Trích dẫn này làm cho khái niệm nghe có vẻ phức tạp hơn nhiều so với thực tế. Dependency Injection đang cung cấp một thành phần với các phụ thuộc của nó thông qua hàm tạo, gọi phương thức hoặc cài đặt thuộc tính. Nó đơn giản thế thôi
Khái niệm cơ bản
Chúng ta có thể chứng minh khái niệm này bằng một ví dụ đơn giản nhưng ngây thơ
Ở đây chúng ta có một lớp
brew unlink php
brew link --overwrite php@8.1
43 yêu cầu một bộ điều hợp để giao tiếp với cơ sở dữ liệu. Chúng tôi khởi tạo bộ điều hợp trong hàm tạo và tạo một phụ thuộc cứng. Điều này làm cho việc kiểm tra trở nên khó khăn và có nghĩa là lớp brew unlink php
brew link --overwrite php@8.1
43 được liên kết rất chặt chẽ với bộ điều hợp
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
71Mã này có thể được tái cấu trúc để sử dụng Dependency Injection và do đó nới lỏng sự phụ thuộc
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
72Bây giờ chúng tôi đang cung cấp cho lớp
brew unlink php
brew link --overwrite php@8.1
43 sự phụ thuộc của nó thay vì tự tạo ra nó. Chúng tôi thậm chí có thể tạo một phương thức chấp nhận một đối số của phần phụ thuộc và đặt nó theo cách đó hoặc nếu thuộc tính brew unlink php
brew link --overwrite php@8.1
46 là brew unlink php
brew link --overwrite php@8.1
47, chúng tôi có thể đặt nó trực tiếpVấn đề phức tạp
Nếu bạn đã từng đọc về Dependency Injection thì chắc hẳn bạn đã từng thấy thuật ngữ “Inversion of Control” hay “Dependency Inversion Principle”. Đây là những vấn đề phức tạp mà Dependency Injection giải quyết
đảo ngược kiểm soát
Inversion of Control như đã nói, “đảo ngược quyền kiểm soát” của một hệ thống bằng cách giữ cho quyền kiểm soát của tổ chức hoàn toàn tách biệt với các đối tượng của chúng tôi. Về mặt Dependency Injection, điều này có nghĩa là nới lỏng các phần phụ thuộc của chúng ta bằng cách kiểm soát và khởi tạo chúng ở những nơi khác trong hệ thống
Trong nhiều năm, các khung công tác PHP đã đạt được Inversion of Control, tuy nhiên, câu hỏi đặt ra là chúng ta đang đảo ngược phần kiểm soát nào và đảo ngược ở đâu? . Đây là Inversion of Control, tuy nhiên, thay vì nới lỏng các phụ thuộc, phương pháp này chỉ đơn giản là di chuyển chúng
Dependency Injection cho phép chúng ta giải quyết vấn đề này một cách tinh tế hơn bằng cách chỉ inject những phụ thuộc chúng ta cần, khi chúng ta cần chúng, mà không cần bất kỳ phụ thuộc được mã hóa cứng nào cả
S. O. L. I. D
Nguyên tắc trách nhiệm duy nhất
Nguyên tắc Trách nhiệm Đơn lẻ là về các tác nhân và kiến trúc cấp cao. Nó nói rằng “Một lớp chỉ nên có một lý do để thay đổi. ” Điều này có nghĩa là mỗi lớp chỉ nên có trách nhiệm đối với một phần duy nhất của chức năng được cung cấp bởi phần mềm. Lợi ích lớn nhất của phương pháp này là nó cho phép cải thiện khả năng sử dụng lại mã. Bằng cách thiết kế lớp của chúng ta để chỉ làm một việc, chúng ta có thể sử dụng [hoặc tái sử dụng] nó trong bất kỳ chương trình nào khác mà không cần thay đổi nó
Nguyên tắc mở/đóng
Nguyên tắc Mở/Đóng là về thiết kế lớp và các tính năng mở rộng. Nó tuyên bố rằng “Các thực thể phần mềm [lớp, mô-đun, chức năng, v.v. ] nên mở để mở rộng, nhưng đóng để sửa đổi. ” Điều này có nghĩa là chúng ta nên thiết kế các mô-đun, lớp và chức năng của mình theo cách mà khi cần chức năng mới, chúng ta không nên sửa đổi mã hiện có của mình mà nên viết mã mới sẽ được sử dụng bởi mã hiện có. Nói một cách thực tế, điều này có nghĩa là chúng ta nên viết các lớp triển khai và tuân thủ các giao diện, sau đó gõ gợi ý đối với các giao diện đó thay vì các lớp cụ thể
Lợi ích lớn nhất của phương pháp này là chúng tôi có thể dễ dàng mở rộng mã của mình với sự hỗ trợ cho một thứ gì đó mới mà không phải sửa đổi mã hiện có, nghĩa là chúng tôi có thể giảm thời gian QA và rủi ro tác động tiêu cực đến ứng dụng giảm đáng kể. Chúng tôi có thể triển khai mã mới, nhanh hơn và tự tin hơn
Nguyên tắc thay thế Liskov
Nguyên tắc thay thế Liskov là về phân nhóm và kế thừa. Nó tuyên bố rằng “Các lớp con không bao giờ được phá vỡ các định nghĩa kiểu của lớp cha. ” Hoặc, trong Robert C. Martin nói, “Các kiểu phụ phải được thay thế cho các kiểu cơ sở của chúng. ”
Ví dụ: nếu chúng ta có một giao diện
brew unlink php
brew link --overwrite php@8.1
48 định nghĩa một phương thức brew unlink php
brew link --overwrite php@8.1
49 và chúng ta có các lớp brew unlink php
brew link --overwrite php@8.1
50 và brew unlink php
brew link --overwrite php@8.1
51 mà cả hai đều triển khai giao diện brew unlink php
brew link --overwrite php@8.1
48, thì chúng ta có thể mong đợi rằng việc sử dụng phương thức brew unlink php
brew link --overwrite php@8.1
49 sẽ luôn thực hiện điều mà chúng ta dự định. Nếu sau này chúng ta tạo một lớp brew unlink php
brew link --overwrite php@8.1
54 hoặc một lớp brew unlink php
brew link --overwrite php@8.1
55 triển khai giao diện brew unlink php
brew link --overwrite php@8.1
48, chúng ta sẽ biết và hiểu phương thức brew unlink php
brew link --overwrite php@8.1
49 sẽ làm gì. Lợi ích lớn nhất của phương pháp này là chúng ta có khả năng xây dựng các chương trình linh hoạt và dễ cấu hình, bởi vì khi chúng ta thay đổi một đối tượng thuộc loại [e. g. , brew unlink php
brew link --overwrite php@8.1
48] sang cái khác, chúng tôi không cần thay đổi bất kỳ thứ gì khác trong chương trình của mìnhNguyên tắc phân tách giao diện
Nguyên tắc phân tách giao diện [ISP] là về giao tiếp giữa logic nghiệp vụ với khách hàng. Nó tuyên bố rằng “Không khách hàng nào bị buộc phải phụ thuộc vào các phương pháp mà nó không sử dụng. ” Điều này có nghĩa là thay vì có một giao diện nguyên khối duy nhất mà tất cả các lớp tuân thủ cần triển khai, thay vào đó, chúng ta nên cung cấp một tập hợp các giao diện nhỏ hơn, dành riêng cho khái niệm mà một lớp tuân thủ thực hiện một hoặc nhiều
Ví dụ: một lớp
brew unlink php
brew link --overwrite php@8.1
59 hoặc brew unlink php
brew link --overwrite php@8.1
60 sẽ quan tâm đến phương thức brew unlink php
brew link --overwrite php@8.1
61, nhưng một lớp brew unlink php
brew link --overwrite php@8.1
62 hoặc brew unlink php
brew link --overwrite php@8.1
63 sẽ không. Ngược lại, lớp brew unlink php
brew link --overwrite php@8.1
62 hoặc brew unlink php
brew link --overwrite php@8.1
63 sẽ quan tâm đến phương pháp brew unlink php
brew link --overwrite php@8.1
66, nhưng lớp brew unlink php
brew link --overwrite php@8.1
59 hoặc brew unlink php
brew link --overwrite php@8.1
60 sẽ không. Không cần phải có tất cả các loại phương tiện này triển khai hỗ trợ cho cả brew unlink php
brew link --overwrite php@8.1
61 cũng như brew unlink php
brew link --overwrite php@8.1
66, vì vậy chúng ta nên chia nhỏ giao diện nguồnNguyên tắc đảo ngược phụ thuộc
Nguyên tắc đảo ngược phụ thuộc là về việc loại bỏ các liên kết cứng giữa các lớp riêng biệt để chức năng mới có thể được tận dụng bằng cách chuyển một lớp khác. Nó nói rằng một người nên “Phụ thuộc vào Trừu tượng. Đừng phụ thuộc vào bê tông. ”. Nói một cách đơn giản, điều này có nghĩa là các phần phụ thuộc của chúng ta phải là các giao diện/hợp đồng hoặc các lớp trừu tượng hơn là các triển khai cụ thể. Chúng ta có thể dễ dàng cấu trúc lại ví dụ trên để tuân theo nguyên tắc này
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
73Hiện tại có một số lợi ích đối với lớp
brew unlink php
brew link --overwrite php@8.1
43 tùy thuộc vào giao diện thay vì cụ thể hóaHãy xem xét rằng chúng tôi đang làm việc trong một nhóm và bộ điều hợp đang được thực hiện bởi một đồng nghiệp. Trong ví dụ đầu tiên của chúng tôi, chúng tôi sẽ phải đợi đồng nghiệp nói trên hoàn thành bộ điều hợp trước khi chúng tôi có thể mô phỏng chính xác nó cho các bài kiểm tra đơn vị của mình. Bây giờ phần phụ thuộc là một giao diện/hợp đồng, chúng ta có thể vui vẻ mô phỏng giao diện đó khi biết rằng đồng nghiệp của chúng ta sẽ xây dựng bộ điều hợp dựa trên hợp đồng đó
Một lợi ích thậm chí còn lớn hơn đối với phương pháp này là mã của chúng tôi hiện có khả năng mở rộng hơn nhiều. Nếu một năm sau, chúng tôi quyết định rằng chúng tôi muốn chuyển sang một loại cơ sở dữ liệu khác, chúng tôi có thể viết một bộ điều hợp triển khai giao diện gốc và thay vào đó, không cần tái cấu trúc nữa vì chúng tôi có thể đảm bảo rằng bộ điều hợp tuân theo
Hộp đựng
Điều đầu tiên bạn nên hiểu về Dependency Injection Containers là chúng không giống với Dependency Injection. Bộ chứa là một tiện ích tiện lợi giúp chúng ta triển khai Dependency Injection, tuy nhiên, chúng có thể và thường bị lạm dụng để triển khai một anti-pattern, Service Location. Việc đưa bộ chứa DI làm Bộ định vị dịch vụ vào các lớp của bạn có thể tạo ra sự phụ thuộc khó hơn vào bộ chứa so với sự phụ thuộc mà bạn đang thay thế. Nó cũng làm cho mã của bạn kém minh bạch hơn và cuối cùng khó kiểm tra hơn
Hầu hết các khung hiện đại đều có Bộ chứa tiêm phụ thuộc riêng cho phép bạn kết nối các phụ thuộc của mình với nhau thông qua cấu hình. Điều này có nghĩa là trong thực tế, bạn có thể viết mã ứng dụng rõ ràng và tách rời như khung mà nó được xây dựng trên đó
Đọc thêm
Nhiều lần mã PHP của bạn sẽ sử dụng cơ sở dữ liệu để duy trì thông tin. Bạn có một số tùy chọn để kết nối và tương tác với cơ sở dữ liệu của mình. Tùy chọn được đề xuất cho đến PHP 5. 1. 0 là sử dụng trình điều khiển gốc như mysqli, pgsql, mssql, v.v.
Trình điều khiển gốc rất tuyệt nếu bạn chỉ sử dụng một cơ sở dữ liệu trong ứng dụng của mình, nhưng nếu, ví dụ, bạn đang sử dụng MySQL và một chút MSSQL hoặc bạn cần kết nối với cơ sở dữ liệu Oracle, thì bạn sẽ không thể sử dụng . Bạn sẽ cần tìm hiểu một API hoàn toàn mới cho mỗi cơ sở dữ liệu — và điều đó có thể trở nên ngớ ngẩn
Tiện ích mở rộng MySQL
Tiện ích mở rộng mysql cho PHP cực kỳ cũ và đã được thay thế bởi hai tiện ích mở rộng khác
Sự phát triển không chỉ dừng lại từ lâu trên mysql mà còn không được dùng nữa kể từ PHP 5. 5. 0 và đã chính thức bị xóa trong PHP 7. 0
Để tiết kiệm việc đào sâu vào cài đặt
brew unlink php
brew link --overwrite php@8.0
81 của bạn để xem bạn đang sử dụng mô-đun nào, một tùy chọn là tìm kiếm brew unlink php
brew link --overwrite php@8.1
73 trong trình chỉnh sửa bạn chọn. Nếu bất kỳ chức năng nào chẳng hạn như brew unlink php
brew link --overwrite php@8.1
74 và brew unlink php
brew link --overwrite php@8.1
75 hiển thị, thì brew unlink php
brew link --overwrite php@8.1
76 đang được sử dụngNgay cả khi bạn không sử dụng PHP 7. x, việc không xem xét nâng cấp này càng sớm càng tốt sẽ dẫn đến khó khăn lớn hơn khi PHP 7. x nâng cấp sắp xảy ra. Tùy chọn tốt nhất là thay thế việc sử dụng mysql bằng mysqli hoặc PDO trong các ứng dụng của bạn trong lịch trình phát triển của riêng bạn để sau này bạn không bị vội vàng
Nếu bạn đang nâng cấp từ mysql lên mysqli, hãy cẩn thận với các hướng dẫn nâng cấp lười biếng gợi ý rằng bạn có thể chỉ cần tìm và thay thế
brew unlink php
brew link --overwrite php@8.1
73 bằng brew unlink php
brew link --overwrite php@8.1
78. Đó không chỉ là sự đơn giản hóa quá mức mà còn bỏ lỡ những lợi thế mà mysqli mang lại, chẳng hạn như liên kết tham số, cũng được cung cấp trong PDOPhần mở rộng PDO
PDO là một thư viện trừu tượng hóa kết nối cơ sở dữ liệu — được tích hợp vào PHP từ 5. 1. 0 — cung cấp một giao diện chung để nói chuyện với nhiều cơ sở dữ liệu khác nhau. Ví dụ: bạn có thể sử dụng mã cơ bản giống hệt nhau để giao tiếp với MySQL hoặc SQLite
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
74PDO sẽ không dịch các truy vấn SQL của bạn hoặc mô phỏng các tính năng còn thiếu;
Quan trọng hơn,
brew unlink php
brew link --overwrite php@8.1
79 cho phép bạn đưa đầu vào nước ngoài vào một cách an toàn [e. g. ID] vào các truy vấn SQL của bạn mà không phải lo lắng về các cuộc tấn công SQL injection vào cơ sở dữ liệu. Điều này có thể sử dụng các câu lệnh PDO và các tham số ràng buộcGiả sử tập lệnh PHP nhận ID số làm tham số truy vấn. ID này nên được sử dụng để tìm nạp bản ghi người dùng từ cơ sở dữ liệu. Đây là cách
brew unlink php
brew link --overwrite php@8.1
80 để làm điều này
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
75Đây là mã khủng khiếp. Bạn đang chèn tham số truy vấn thô vào truy vấn SQL. Điều này sẽ giúp bạn bị hack trong tích tắc, sử dụng một phương pháp gọi là SQL Injection. Chỉ cần tưởng tượng nếu một tin tặc chuyển vào một tham số
brew unlink php
brew link --overwrite php@8.1
81 sáng tạo bằng cách gọi một URL như brew unlink php
brew link --overwrite php@8.1
82. Thao tác này sẽ đặt biến brew unlink php
brew link --overwrite php@8.1
83 thành brew unlink php
brew link --overwrite php@8.1
84 sẽ xóa tất cả người dùng của bạn. Thay vào đó, bạn nên làm sạch đầu vào ID bằng các tham số ràng buộc PDO
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
76Đây là mã chính xác. Nó sử dụng một tham số ràng buộc trên câu lệnh PDO. Điều này thoát khỏi ID đầu vào nước ngoài trước khi nó được đưa vào cơ sở dữ liệu để ngăn chặn các cuộc tấn công SQL injection tiềm ẩn
Đối với các thao tác ghi, chẳng hạn như CHÈN hoặc CẬP NHẬT, điều đặc biệt quan trọng là trước tiên vẫn phải làm sạch và làm sạch nó cho những thứ khác [xóa các thẻ HTML, JavaScript, v.v.]. PDO sẽ chỉ vệ sinh nó cho SQL, không phải cho ứng dụng của bạn
Bạn cũng nên lưu ý rằng các kết nối cơ sở dữ liệu sử dụng hết tài nguyên và việc cạn kiệt tài nguyên không phải là hiếm nếu các kết nối không được đóng hoàn toàn, tuy nhiên điều này phổ biến hơn ở các ngôn ngữ khác. Sử dụng PDO, bạn có thể hoàn toàn đóng kết nối bằng cách hủy đối tượng bằng cách đảm bảo rằng tất cả các tham chiếu còn lại đến nó đều bị xóa, tôi. e. đặt thành NULL. Nếu bạn không làm điều này một cách rõ ràng, PHP sẽ tự động đóng kết nối khi tập lệnh của bạn kết thúc - tất nhiên là trừ khi bạn đang sử dụng các kết nối liên tục
Tương tác với cơ sở dữ liệu
Khi các nhà phát triển lần đầu tiên bắt đầu học PHP, cuối cùng họ thường trộn lẫn tương tác cơ sở dữ liệu với logic trình bày của họ, sử dụng mã có thể giống như thế này
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
77Đây là một cách làm không tốt vì đủ loại lý do, chủ yếu là khó gỡ lỗi, khó kiểm tra, khó đọc và sẽ xuất ra rất nhiều trường nếu bạn không đặt giới hạn ở đó
Mặc dù có nhiều giải pháp khác để thực hiện việc này - tùy thuộc vào việc bạn thích hay không - phải có một số yếu tố tách biệt
Xem xét bước cơ bản nhất
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
78Đó là một khởi đầu tốt. Đặt hai mục đó vào hai tệp khác nhau và bạn đã có một số phân tách rõ ràng
Tạo một lớp để đặt phương thức đó vào và bạn có một “Mô hình”. Tạo một tệp
brew unlink php
brew link --overwrite php@8.1
85 đơn giản để đưa logic trình bày vào và bạn có một “Chế độ xem”, gần giống với MVC - một kiến trúc OOP phổ biến cho hầu hết mọi ngườifoo. php
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
79người mẫu/FooModel. php
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
90lượt xem/danh sách foo. php
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
91Điều này về cơ bản giống như những gì mà hầu hết các framework hiện đại đang làm, mặc dù thủ công hơn một chút. Bạn có thể không cần phải làm tất cả những điều đó mọi lúc, nhưng trộn lẫn quá nhiều logic trình bày và tương tác cơ sở dữ liệu có thể là một vấn đề thực sự nếu bạn muốn ứng dụng của mình
Lớp trừu tượng
Nhiều khung cung cấp lớp trừu tượng của riêng chúng, có thể có hoặc không nằm trên PDO. Chúng thường sẽ mô phỏng các tính năng cho một hệ thống cơ sở dữ liệu bị thiếu trong hệ thống cơ sở dữ liệu khác bằng cách gói các truy vấn của bạn trong các phương thức PHP, cung cấp cho bạn sự trừu tượng hóa cơ sở dữ liệu thực tế thay vì chỉ sự trừu tượng hóa kết nối mà PDO cung cấp. Tất nhiên, điều này sẽ thêm một chút chi phí, nhưng nếu bạn đang xây dựng một ứng dụng di động cần hoạt động với MySQL, PostgreSQL và SQLite thì một chút chi phí sẽ đáng giá vì mục đích làm sạch mã
Một số lớp trừu tượng đã được xây dựng bằng cách sử dụng các tiêu chuẩn không gian tên PSR-0 hoặc PSR-4 để có thể được cài đặt trong bất kỳ ứng dụng nào bạn muốn
Các mẫu cung cấp một cách thuận tiện để tách logic bộ điều khiển và miền của bạn khỏi logic trình bày của bạn. Các mẫu thường chứa HTML của ứng dụng của bạn, nhưng cũng có thể được sử dụng cho các định dạng khác, chẳng hạn như XML. Các mẫu thường được gọi là "các khung nhìn", tạo nên một phần của thành phần thứ hai của mẫu kiến trúc phần mềm [MVC]
Lợi ích
Lợi ích chính của việc sử dụng các mẫu là sự tách biệt rõ ràng mà chúng tạo ra giữa logic trình bày và phần còn lại của ứng dụng của bạn. Các mẫu có trách nhiệm duy nhất là hiển thị nội dung được định dạng. Họ không chịu trách nhiệm tra cứu dữ liệu, kiên trì hoặc các nhiệm vụ phức tạp khác. Điều này dẫn đến mã sạch hơn, dễ đọc hơn, đặc biệt hữu ích trong môi trường nhóm nơi các nhà phát triển làm việc trên mã phía máy chủ [bộ điều khiển, mô hình] và nhà thiết kế làm việc trên mã phía máy khách [đánh dấu]
Các mẫu cũng cải thiện việc tổ chức mã trình bày. Các mẫu thường được đặt trong một thư mục “lượt xem”, mỗi mẫu được xác định trong một tệp. Cách tiếp cận này khuyến khích sử dụng lại mã trong đó các khối mã lớn hơn được chia thành các phần nhỏ hơn, có thể tái sử dụng, thường được gọi là các phần. Ví dụ: mỗi đầu trang và chân trang trang web của bạn có thể được xác định là mẫu, sau đó được đưa vào trước và sau mỗi mẫu trang
Cuối cùng, tùy thuộc vào thư viện bạn sử dụng, các mẫu có thể cung cấp bảo mật cao hơn bằng cách tự động thoát khỏi nội dung do người dùng tạo. Một số thư viện thậm chí còn cung cấp hộp cát, trong đó các nhà thiết kế mẫu chỉ được cấp quyền truy cập vào các hàm và biến được liệt kê trong danh sách trắng
Mẫu PHP đơn giản
Các mẫu PHP đơn giản là các mẫu đơn giản sử dụng mã PHP gốc. Chúng là một lựa chọn tự nhiên vì PHP thực sự là một ngôn ngữ mẫu. Điều đó đơn giản có nghĩa là bạn có thể kết hợp mã PHP trong mã khác, như HTML. Điều này có lợi cho các nhà phát triển PHP vì không có cú pháp mới để tìm hiểu, họ biết các chức năng có sẵn cho họ và trình soạn thảo mã của họ đã tích hợp tính năng tô sáng cú pháp và tự động hoàn thành PHP. Hơn nữa, các mẫu PHP đơn giản có xu hướng rất nhanh vì không cần giai đoạn biên dịch
Mọi khung công tác PHP hiện đại đều sử dụng một số loại hệ thống mẫu, hầu hết trong số đó sử dụng PHP đơn giản theo mặc định. Bên ngoài các khung, các thư viện như Tấm hoặc Aura. Chế độ xem giúp làm việc với các mẫu PHP đơn giản dễ dàng hơn bằng cách cung cấp chức năng mẫu hiện đại như kế thừa, bố cục và tiện ích mở rộng
Ví dụ đơn giản về mẫu PHP đơn giản
Sử dụng thư viện Plates
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
92Ví dụ về các mẫu PHP đơn giản sử dụng tính kế thừa
Sử dụng thư viện Plates
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
93____194Mẫu đã biên dịch
Mặc dù PHP đã phát triển thành một ngôn ngữ hướng đối tượng trưởng thành, nhưng nó vẫn chưa được cải thiện nhiều như một ngôn ngữ tạo khuôn mẫu. Các mẫu đã biên dịch, như Twig, Brainy hoặc Smarty*, lấp đầy khoảng trống này bằng cách cung cấp một cú pháp mới được thiết kế riêng cho việc tạo khuôn mẫu. Từ thoát tự động, kế thừa và cấu trúc điều khiển đơn giản hóa, các mẫu đã biên dịch được thiết kế để dễ viết hơn, dễ đọc hơn và an toàn hơn khi sử dụng. Các mẫu đã biên dịch thậm chí có thể được chia sẻ trên các ngôn ngữ khác nhau, Bộ ria mép là một ví dụ điển hình về điều này. Vì các mẫu này phải được biên dịch nên có một chút ảnh hưởng về hiệu suất, tuy nhiên điều này rất nhỏ khi sử dụng bộ nhớ đệm thích hợp
*Mặc dù Smarty cung cấp khả năng thoát tự động, nhưng tính năng này KHÔNG được bật theo mặc định
Ví dụ đơn giản về mẫu đã biên dịch
Sử dụng thư viện Twig
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
95Ví dụ về các mẫu được biên dịch bằng cách sử dụng tính kế thừa
Sử dụng thư viện Twig
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
96
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
97Đọc thêm
Bài báo & Hướng dẫn
thư viện
lỗi
Trong nhiều ngôn ngữ lập trình “nặng về ngoại lệ”, bất cứ khi nào xảy ra sự cố, một ngoại lệ sẽ được đưa ra. Đây chắc chắn là một cách khả thi để làm mọi việc, nhưng PHP là một ngôn ngữ lập trình “ngoại lệ nhẹ”. Mặc dù nó có ngoại lệ và nhiều lõi bắt đầu sử dụng chúng khi làm việc với các đối tượng, nhưng hầu hết bản thân PHP sẽ cố gắng tiếp tục xử lý bất kể điều gì xảy ra, trừ khi xảy ra lỗi nghiêm trọng
Ví dụ
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
98Đây chỉ là một lỗi thông báo và PHP sẽ vui vẻ tiếp tục. Điều này có thể gây nhầm lẫn cho những người đến từ các ngôn ngữ “nặng về ngoại lệ”, bởi vì việc tham chiếu một biến bị thiếu trong Python chẳng hạn sẽ tạo ra một ngoại lệ
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
99Sự khác biệt thực sự duy nhất là Python sẽ lo lắng về bất kỳ điều nhỏ nhặt nào, do đó các nhà phát triển có thể chắc chắn rằng mọi vấn đề tiềm ẩn hoặc trường hợp cạnh được phát hiện, trong khi PHP sẽ tiếp tục xử lý trừ khi có điều gì đó nghiêm trọng xảy ra, tại thời điểm đó, nó sẽ ném ra một
Mức độ nghiêm trọng của lỗi
PHP có một số mức độ nghiêm trọng của lỗi. Ba loại thông báo phổ biến nhất là lỗi, thông báo và cảnh báo. Chúng có mức độ nghiêm trọng khác nhau; . Lỗi là lỗi nghiêm trọng trong thời gian chạy và thường do lỗi trong mã của bạn gây ra và cần được sửa vì chúng sẽ khiến PHP ngừng thực thi. Thông báo là các thông báo tư vấn do mã gây ra có thể hoặc không gây ra sự cố trong quá trình thực thi tập lệnh, quá trình thực thi không bị tạm dừng. Cảnh báo là lỗi không nghiêm trọng, việc thực thi tập lệnh sẽ không bị tạm dừng
Một loại thông báo lỗi khác được báo cáo tại thời điểm biên dịch là thông báo
brew unlink php
brew link --overwrite php@8.1
89. Những thông báo này được sử dụng để đề xuất các thay đổi đối với mã của bạn nhằm giúp đảm bảo khả năng tương tác tốt nhất và khả năng tương thích chuyển tiếp với các phiên bản PHP sắp tớiThay đổi hành vi báo cáo lỗi của PHP
Báo cáo lỗi có thể được thay đổi bằng cách sử dụng cài đặt PHP và/hoặc lệnh gọi hàm PHP. Sử dụng hàm PHP tích hợp sẵn
brew unlink php
brew link --overwrite php@8.1
90, bạn có thể đặt mức lỗi trong khoảng thời gian thực thi tập lệnh bằng cách chuyển một trong các hằng số mức lỗi được xác định trước, nghĩa là nếu bạn chỉ muốn xem Lỗi và Cảnh báo - chứ không phải Thông báo - thì bạn có thể định cấu hình _______46____591. Bạn đặt toán tử này ở đầu biểu thức và bất kỳ lỗi nào là kết quả trực tiếp của biểu thức đều bị tắtbrew unlink php
brew link --overwrite php@8.0
6brew unlink php
brew link --overwrite php@8.1
92 nếu nó tồn tại, nhưng sẽ chỉ trả về một giá trị rỗng và không in được gì nếu khóa biến brew unlink php
brew link --overwrite php@8.1
93 hoặc brew unlink php
brew link --overwrite php@8.1
94 không tồn tại. Nếu không có toán tử kiểm soát lỗi, biểu thức này có thể tạo ra lỗi brew unlink php
brew link --overwrite php@8.1
95 hoặc brew unlink php
brew link --overwrite php@8.1
96Điều này có vẻ như là một ý tưởng hay, nhưng có một vài sự đánh đổi không mong muốn. PHP xử lý các biểu thức sử dụng
brew unlink php
brew link --overwrite php@8.1
97 theo cách kém hiệu quả hơn so với các biểu thức không có brew unlink php
brew link --overwrite php@8.1
97. Tối ưu hóa sớm có thể là gốc rễ của tất cả các đối số lập trình, nhưng nếu hiệu suất đặc biệt quan trọng đối với ứng dụng/thư viện của bạn thì điều quan trọng là phải hiểu ý nghĩa hiệu suất của toán tử kiểm soát lỗiThứ hai, người vận hành kiểm soát lỗi hoàn toàn chấp nhận lỗi. Lỗi không được hiển thị và lỗi không được gửi đến nhật ký lỗi. Ngoài ra, các hệ thống PHP chứng khoán/sản xuất không có cách nào để tắt toán tử kiểm soát lỗi. Mặc dù bạn có thể đúng rằng lỗi bạn đang thấy là vô hại, nhưng một lỗi khác, ít vô hại hơn sẽ không gây ra lỗi gì
Nếu có một cách để tránh toán tử chặn lỗi, bạn nên xem xét nó. Ví dụ, mã của chúng tôi ở trên có thể được viết lại như thế này
brew unlink php
brew link --overwrite php@8.0
6brew unlink php
brew link --overwrite php@8.1
99 không tìm thấy tệp để tải. Bạn có thể kiểm tra sự tồn tại của tệp trước khi thử tải nó, nhưng nếu tệp bị xóa sau khi kiểm tra và trước
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
700 [điều này nghe có vẻ bất khả thi, nhưng nó có thể xảy ra] thì
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
700 sẽ trả về false và báo lỗi. Đây có khả năng là điều mà PHP nên giải quyết, nhưng là một trường hợp mà việc loại bỏ lỗi có vẻ như là giải pháp hợp lệ duy nhấtTrước đó, chúng tôi đã đề cập rằng không có cách nào trong hệ thống PHP gốc để tắt toán tử kiểm soát lỗi. Tuy nhiên, Xdebug có cài đặt ini
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
702 sẽ vô hiệu hóa toán tử kiểm soát lỗi. Bạn có thể đặt điều này thông qua tệp brew unlink php
brew link --overwrite php@8.0
81 của mình bằng cách sau> php -S localhost:8000
53Bạn cũng có thể đặt giá trị này trong thời gian chạy bằng hàm
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
704brew unlink php
brew link --overwrite php@8.0
6
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
705Điều này hữu ích nhất khi bạn đang gỡ lỗi mã và nghi ngờ lỗi thông tin bị chặn. Sử dụng tiếng hét một cách cẩn thận và như một công cụ gỡ lỗi tạm thời. Có rất nhiều mã thư viện PHP có thể không hoạt động khi tắt toán tử kiểm soát lỗi
ErrorException
PHP hoàn toàn có khả năng trở thành ngôn ngữ lập trình “nặng về ngoại lệ” và chỉ yêu cầu một vài dòng mã để thực hiện chuyển đổi. Về cơ bản, bạn có thể biến “lỗi” của mình thành “ngoại lệ” bằng cách sử dụng lớp
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
706, mở rộng lớp
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
707Đây là một thực tế phổ biến được thực hiện bởi một số lượng lớn các khung hiện đại như Symfony và Laravel. Trong chế độ gỡ lỗi [hoặc chế độ nhà phát triển], cả hai khung này sẽ hiển thị dấu vết ngăn xếp đẹp và rõ ràng
Ngoài ra còn có một số gói có sẵn để xử lý và báo cáo lỗi và ngoại lệ tốt hơn. thích Rất tiếc. , đi kèm với cài đặt mặc định của Laravel và cũng có thể được sử dụng trong bất kỳ khung nào
Bằng cách loại bỏ lỗi dưới dạng ngoại lệ trong quá trình phát triển, bạn có thể xử lý chúng tốt hơn so với kết quả thông thường và nếu bạn thấy một ngoại lệ trong quá trình phát triển, bạn có thể gói nó trong một câu lệnh bắt kèm theo hướng dẫn cụ thể về cách xử lý tình huống. Mỗi ngoại lệ bạn nắm bắt ngay lập tức làm cho ứng dụng của bạn mạnh mẽ hơn một chút
Bạn có thể tìm thêm thông tin về điều này và chi tiết về cách sử dụng
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
706 với việc xử lý lỗi tại ErrorException Class
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
709 thường sẽ chỉ khiến bạn nhận được một
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
710 và một cảnh báo. Nhiều khung công tác PHP cũ hơn như CodeIgniter sẽ chỉ trả về giá trị sai, ghi một thông báo vào nhật ký độc quyền của chúng và có thể cho phép bạn sử dụng một phương thức như
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
711 để xem điều gì đã xảy ra. Vấn đề ở đây là bạn phải đi tìm lỗi và kiểm tra tài liệu để xem phương thức lỗi của lớp này là gì, thay vì để nó trở nên cực kỳ rõ ràngMột vấn đề khác là khi các lớp tự động đưa ra lỗi trên màn hình và thoát khỏi quy trình. Khi bạn làm điều này, bạn ngăn không cho nhà phát triển khác có thể tự động xử lý lỗi đó. Nên đưa ra các ngoại lệ để nhà phát triển nhận biết được lỗi; . e. g
> php -S localhost:8000
55Ngoại lệ SPL
Lớp chung chung
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
707 cung cấp rất ít bối cảnh gỡ lỗi cho nhà phát triển; _______46____372____1717Trong PHP5. 5
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
718 được giới thiệu. Tại thời điểm này, nó đang sử dụng BCrypt, thuật toán mạnh nhất hiện được hỗ trợ bởi PHP. Nó sẽ được cập nhật trong tương lai để hỗ trợ nhiều thuật toán hơn khi cần thiết. Thư viện
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
719 được tạo để cung cấp khả năng tương thích chuyển tiếp cho PHP >= 5. 3. 7Dưới đây chúng tôi băm một chuỗi, sau đó kiểm tra hàm băm đối với một chuỗi mới. Bởi vì hai chuỗi nguồn của chúng tôi khác nhau ['mật khẩu bí mật' so với. ‘bad-password’] đăng nhập này sẽ thất bại
Các hàmbrew unlink php
brew link --overwrite php@8.0
6phpcbf -w --standard=PSR1 file.php
73____1722 và
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
723 có thể làm sạch văn bản và xác thực các định dạng văn bản [e. g. địa chỉ thư điện tử]Đầu vào nước ngoài có thể là bất cứ điều gì. Dữ liệu đầu vào biểu mẫu
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
724 và
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
725, một số giá trị trong siêu toàn cục
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
726 và phần thân yêu cầu HTTP thông qua
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
727. Hãy nhớ rằng, đầu vào nước ngoài không giới hạn ở dạng dữ liệu do người dùng gửi. Các tệp đã tải lên và tải xuống, giá trị phiên, dữ liệu cookie và dữ liệu từ các dịch vụ web của bên thứ ba cũng là đầu vào nước ngoàiMặc dù dữ liệu nước ngoài có thể được lưu trữ, kết hợp và truy cập sau đó nhưng nó vẫn là đầu vào nước ngoài. Mỗi khi bạn xử lý, xuất, nối hoặc bao gồm dữ liệu trong mã của mình, hãy tự hỏi liệu dữ liệu có được lọc đúng cách không và dữ liệu đó có đáng tin cậy không
Dữ liệu có thể được lọc khác nhau dựa trên mục đích của nó. Ví dụ: khi đầu vào nước ngoài chưa được lọc được chuyển vào đầu ra của trang HTML, nó có thể thực thi HTML và JavaScript trên trang web của bạn. Đây được gọi là Cross-Site Scripting [XSS] và có thể là một cuộc tấn công rất nguy hiểm. Một cách để tránh XSS là làm sạch tất cả dữ liệu do người dùng tạo trước khi xuất nó sang trang của bạn bằng cách xóa các thẻ HTML bằng hàm
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
728 hoặc thoát các ký tự có ý nghĩa đặc biệt thành các thực thể HTML tương ứng của chúng bằng các hàm brew unlink php
brew link --overwrite php@8.0
59 hoặc brew unlink php
brew link --overwrite php@8.0
61Một ví dụ khác là truyền các tùy chọn để thực hiện trên dòng lệnh. Điều này có thể cực kỳ nguy hiểm [và thường là một ý tưởng tồi], nhưng bạn có thể sử dụng hàm
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
731 tích hợp sẵn để làm sạch các đối số của lệnh đã thực thiMột ví dụ cuối cùng là chấp nhận đầu vào nước ngoài để xác định tệp sẽ tải từ hệ thống tệp. Điều này có thể bị khai thác bằng cách thay đổi tên tệp thành đường dẫn tệp. Bạn cần xóa
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
732,
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
733, byte rỗng hoặc các ký tự khác khỏi đường dẫn tệp để đường dẫn không thể tải các tệp ẩn, không công khai hoặc nhạy cảmvệ sinh
Sanitization xóa [hoặc thoát] các ký tự không hợp lệ hoặc không an toàn khỏi đầu vào nước ngoài
Ví dụ: bạn nên làm sạch đầu vào nước ngoài trước khi đưa đầu vào vào HTML hoặc chèn nó vào một truy vấn SQL thô. Khi bạn sử dụng các tham số ràng buộc với , nó sẽ khử trùng đầu vào cho bạn
Đôi khi nó được yêu cầu cho phép một số thẻ HTML an toàn trong đầu vào khi đưa nó vào trang HTML. Điều này rất khó thực hiện và nhiều người tránh nó bằng cách sử dụng các định dạng hạn chế khác như Markdown hoặc BBCode, mặc dù các thư viện danh sách trắng như HTML Purifier tồn tại vì lý do này
Xem Bộ lọc Vệ sinh
Unserialization
Thật nguy hiểm đối với dữ liệu
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
734 từ người dùng hoặc các nguồn không đáng tin cậy khác. Làm như vậy có thể cho phép người dùng độc hại khởi tạo các đối tượng [với các thuộc tính do người dùng xác định] mà các hàm hủy của chúng sẽ được thực thi, ngay cả khi bản thân các đối tượng đó không được sử dụng. Do đó, bạn nên tránh hủy xác thực dữ liệu không đáng tin cậyNếu bạn hoàn toàn phải hủy xác thực dữ liệu từ các nguồn không đáng tin cậy, hãy sử dụng tùy chọn
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
735 của PHP 7 để hạn chế loại đối tượng nào được phép hủy xác thựcThẩm định
Xác thực đảm bảo rằng đầu vào nước ngoài là những gì bạn mong đợi. Ví dụ: bạn có thể muốn xác thực địa chỉ email, số điện thoại hoặc độ tuổi khi xử lý việc gửi đăng ký
Xem Bộ lọc xác thực
Tệp cấu hình
Khi tạo tệp cấu hình cho ứng dụng của bạn, các phương pháp hay nhất khuyên bạn nên tuân theo một trong các phương pháp sau
- Bạn nên lưu trữ thông tin cấu hình của mình ở nơi không thể truy cập trực tiếp và lấy thông tin đó qua hệ thống tệp
- Nếu bạn phải lưu trữ các tệp cấu hình của mình trong thư mục gốc của tài liệu, hãy đặt tên cho các tệp có phần mở rộng là
85. Điều này đảm bảo rằng, ngay cả khi tập lệnh được truy cập trực tiếp, nó sẽ không được xuất ra dưới dạng văn bản thuần túybrew unlink php brew link --overwrite php@8.1
- Thông tin trong các tệp cấu hình phải được bảo vệ tương ứng, thông qua mã hóa hoặc quyền hệ thống tệp của nhóm/người dùng
- Bạn nên đảm bảo rằng mình không cam kết các tệp cấu hình có chứa thông tin nhạy cảm. g. mật khẩu hoặc mã thông báo API để kiểm soát nguồn
Đăng ký toàn cầu
GHI CHÚ. Kể từ PHP 5. 4. 0, cài đặt
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
737 đã bị xóa và không thể sử dụng được nữa. Điều này chỉ được đưa vào như một cảnh báo cho bất kỳ ai trong quá trình nâng cấp ứng dụng cũKhi được bật, cài đặt cấu hình
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
737 làm cho một số loại biến [bao gồm cả những biến từ
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
725,
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
724 và
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
741] có sẵn trong phạm vi toàn cầu của ứng dụng của bạn. Điều này có thể dễ dàng dẫn đến các vấn đề bảo mật vì ứng dụng của bạn không thể xác định một cách hiệu quả dữ liệu đến từ đâuVí dụ.
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
742 sẽ khả dụng qua brew unlink php
brew link --overwrite php@8.1
93, có thể ghi đè các biến đã được khai báoNếu bạn đang sử dụng PHP php -S localhost:800058
Truyền vào giá trị
746 sẽ hiển thị mọi lỗi có thể xảy ra, ngay cả khi các cấp độ và hằng số mới được thêm vào trong các phiên bản PHP trong tương lai. Hằng sốif formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
747 cũng hoạt động theo cách này kể từ PHP 5. 4. - php. mạng lướiif formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
Hằng số mức lỗi
brew unlink php
brew link --overwrite php@8.1
89 được giới thiệu trong 5. 3. 0 và không phải là một phần của
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
747, tuy nhiên nó đã trở thành một phần của
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
747 trong 5. 4. 0. Điều đó có nghĩa là gì? . 3 có nghĩa là bạn phải sử dụng
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
746 hoặc
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
752Báo cáo mọi lỗi có thể xảy ra theo phiên bản PHP
- < 5. 3
746 hoặcif formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
747if formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
- 5. 3
746 hoặcif formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
752if formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
- > 5. 3
746 hoặcif formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
747if formSubmitted = yes validateData if no validationError include [dbconnect.inc] insertRecord . . HTML FORM GOES HERE
Sản xuất
Để ẩn lỗi trên môi trường sản xuất của bạn, hãy định cấu hình
brew unlink php
brew link --overwrite php@8.0
81 của bạn dưới dạng> php -S localhost:8000
59Với các cài đặt này trong sản xuất, lỗi sẽ vẫn được ghi vào nhật ký lỗi cho máy chủ web, nhưng sẽ không được hiển thị cho người dùng. Để biết thêm thông tin về các cài đặt này, hãy xem hướng dẫn sử dụng PHP
Viết các bài kiểm tra tự động cho mã PHP của bạn được coi là cách thực hành tốt nhất và có thể dẫn đến các ứng dụng được xây dựng tốt. Kiểm thử tự động là một công cụ tuyệt vời để đảm bảo ứng dụng của bạn không bị hỏng khi bạn thực hiện thay đổi hoặc thêm chức năng mới và không nên bỏ qua
Có một số loại công cụ kiểm tra [hoặc khung] khác nhau có sẵn cho PHP, sử dụng các cách tiếp cận khác nhau - tất cả đều cố gắng tránh kiểm tra thủ công và nhu cầu về các nhóm Đảm bảo chất lượng lớn, chỉ để đảm bảo những thay đổi gần đây không phá vỡ hiện có
Hướng phát triển thử nghiệm
từ Wikipedia
Phát triển dựa trên thử nghiệm [TDD] là một quy trình phát triển phần mềm dựa trên sự lặp lại của một chu kỳ phát triển rất ngắn. đầu tiên, nhà phát triển viết một trường hợp thử nghiệm tự động bị lỗi xác định cải tiến mong muốn hoặc chức năng mới, sau đó tạo mã để vượt qua thử nghiệm đó và cuối cùng tái cấu trúc mã mới theo tiêu chuẩn chấp nhận được. Kent Beck, người được cho là đã phát triển hoặc 'khám phá lại' kỹ thuật này, đã tuyên bố vào năm 2003 rằng TDD khuyến khích các thiết kế đơn giản và truyền cảm hứng cho sự tự tin.
Có một số loại thử nghiệm khác nhau mà bạn có thể thực hiện cho ứng dụng của mình
Kiểm tra đơn vị
Kiểm tra đơn vị là một phương pháp lập trình để đảm bảo các chức năng, lớp và phương thức hoạt động như mong đợi, từ thời điểm bạn xây dựng chúng trong suốt chu kỳ phát triển. Bằng cách kiểm tra các giá trị vào và ra của các hàm và phương thức khác nhau, bạn có thể đảm bảo logic bên trong đang hoạt động chính xác. Bằng cách sử dụng Dependency Injection và xây dựng các lớp và sơ khai “giả”, bạn có thể xác minh rằng các phần phụ thuộc được sử dụng đúng cách để có phạm vi kiểm tra tốt hơn
Khi bạn tạo một lớp hoặc chức năng, bạn nên tạo một bài kiểm tra đơn vị cho từng hành vi mà nó phải có. Ở cấp độ rất cơ bản, bạn nên đảm bảo rằng nó bị lỗi nếu bạn gửi cho nó các đối số không hợp lệ và đảm bảo rằng nó hoạt động nếu bạn gửi cho nó các đối số hợp lệ. Điều này sẽ giúp đảm bảo rằng khi bạn thực hiện các thay đổi đối với lớp hoặc chức năng này sau này trong chu kỳ phát triển thì chức năng cũ vẫn tiếp tục hoạt động như mong đợi. Giải pháp thay thế duy nhất cho điều này sẽ là
phpcbf -w --standard=PSR1 file.php
87 trong một bài kiểm tra. php, đây không phải là cách để xây dựng một ứng dụng - dù lớn hay nhỏViệc sử dụng khác cho các bài kiểm tra đơn vị là đóng góp cho nguồn mở. Nếu bạn có thể viết một bài kiểm tra cho thấy chức năng bị hỏng [tôi. e. không thành công], sau đó sửa nó và cho thấy bài kiểm tra đã vượt qua, các bản vá có nhiều khả năng được chấp nhận hơn. Nếu bạn chạy một dự án chấp nhận các yêu cầu kéo thì bạn nên đề xuất đây là một yêu cầu
PHPUnit là khung thử nghiệm thực tế để viết các bài kiểm tra đơn vị cho các ứng dụng PHP, nhưng có một số lựa chọn thay thế
Thử nghiệm hội nhập
từ Wikipedia
Kiểm thử tích hợp [đôi khi được gọi là Kiểm thử và Tích hợp, viết tắt là “I&T”] là giai đoạn kiểm thử phần mềm trong đó các mô-đun phần mềm riêng lẻ được kết hợp và kiểm thử theo nhóm. Nó xảy ra sau khi kiểm tra đơn vị và trước khi kiểm tra xác nhận. Thử nghiệm tích hợp coi các mô-đun đầu vào đã được thử nghiệm đơn vị, nhóm chúng thành các tập hợp lớn hơn, áp dụng các thử nghiệm được xác định trong kế hoạch thử nghiệm tích hợp cho các tập hợp đó và cung cấp dưới dạng đầu ra là hệ thống tích hợp đã sẵn sàng để thử nghiệm hệ thống
Nhiều công cụ tương tự có thể được sử dụng để kiểm tra đơn vị có thể được sử dụng để kiểm tra tích hợp vì nhiều nguyên tắc giống nhau được sử dụng
Thử nghiệm chức năng
Đôi khi còn được gọi là thử nghiệm chấp nhận, thử nghiệm chức năng bao gồm việc sử dụng các công cụ để tạo các thử nghiệm tự động thực sự sử dụng ứng dụng của bạn thay vì chỉ xác minh rằng các đơn vị mã riêng lẻ đang hoạt động chính xác và các đơn vị riêng lẻ có thể giao tiếp với nhau một cách chính xác. Các công cụ này thường hoạt động bằng cách sử dụng dữ liệu thực và mô phỏng người dùng thực của ứng dụng
Công cụ kiểm tra chức năng
- selen
- chồn
- Codeception là một khung thử nghiệm toàn ngăn xếp bao gồm các công cụ thử nghiệm chấp nhận
- Storyplayer là một khung thử nghiệm toàn ngăn xếp bao gồm hỗ trợ tạo và hủy môi trường thử nghiệm theo yêu cầu
Phát triển hành vi lái xe
Có hai loại Phát triển theo định hướng hành vi [BDD] khác nhau. SpecBDD và StoryBDD. SpecBDD tập trung vào hành vi kỹ thuật của mã, trong khi StoryBDD tập trung vào hành vi hoặc tương tác kinh doanh hoặc tính năng. PHP có các khung cho cả hai loại BDD
Với StoryBDD, bạn viết những câu chuyện mà con người có thể đọc được để mô tả hành vi của ứng dụng của bạn. Những câu chuyện này sau đó có thể được chạy dưới dạng thử nghiệm thực tế đối với ứng dụng của bạn. Khung được sử dụng trong các ứng dụng PHP cho StoryBDD là Behat, được lấy cảm hứng từ dự án Ruby’s Cucumber và triển khai Gherkin DSL để mô tả hành vi của tính năng
Với SpecBDD, bạn viết các thông số kỹ thuật mô tả cách thức hoạt động của mã thực tế của bạn. Thay vì kiểm tra một hàm hoặc phương thức, bạn đang mô tả cách thức hoạt động của hàm hoặc phương thức đó. PHP cung cấp khung công tác PHPSpec cho mục đích này. Khung này được lấy cảm hứng từ dự án RSpec cho Ruby
- Behat, khung StoryBDD cho PHP, lấy cảm hứng từ dự án Ruby’s Cucumber;
- PHPSpec, khung công tác SpecBDD cho PHP, lấy cảm hứng từ dự án RSpec của Ruby;
- Codeception là một khung thử nghiệm toàn ngăn xếp sử dụng các nguyên tắc BDD
Bên cạnh các khung điều khiển hành vi và thử nghiệm riêng lẻ, còn có một số khung chung và thư viện trợ giúp hữu ích cho bất kỳ phương pháp ưa thích nào được thực hiện
Các ứng dụng PHP có thể được triển khai và chạy trên các máy chủ web sản xuất theo một số cách
Nền tảng dưới dạng Dịch vụ [PaaS]
PaaS cung cấp hệ thống và kiến trúc mạng cần thiết để chạy các ứng dụng PHP trên web. Điều này có nghĩa là ít hoặc không có cấu hình để khởi chạy các ứng dụng PHP hoặc khung công tác PHP
Gần đây PaaS đã trở thành một phương pháp phổ biến để triển khai, lưu trữ và nhân rộng các ứng dụng PHP ở mọi quy mô. Bạn có thể tìm thấy một danh sách trong của chúng tôi
Xây dựng và triển khai ứng dụng của bạn
Nếu bạn thấy mình đang thực hiện các thay đổi lược đồ cơ sở dữ liệu thủ công hoặc chạy thử nghiệm theo cách thủ công trước khi cập nhật tệp của mình [theo cách thủ công], hãy suy nghĩ kỹ. Với mỗi tác vụ thủ công bổ sung cần thiết để triển khai phiên bản mới của ứng dụng, khả năng xảy ra lỗi nghiêm trọng có thể tăng lên. Cho dù bạn đang xử lý một bản cập nhật đơn giản, quy trình xây dựng toàn diện hay thậm chí là chiến lược tích hợp liên tục, tự động hóa bản dựng là bạn của bạn
Trong số các tác vụ bạn có thể muốn tự động hóa là
- quản lý phụ thuộc
- Tổng hợp, thu nhỏ tài sản của bạn
- chạy thử nghiệm
- Tạo tài liệu
- bao bì
- triển khai
Các công cụ triển khai có thể được mô tả như một tập hợp các tập lệnh xử lý các tác vụ chung của việc triển khai phần mềm. Công cụ triển khai không phải là một phần của phần mềm của bạn, nó hoạt động trên phần mềm của bạn từ 'bên ngoài'
Có rất nhiều công cụ nguồn mở có sẵn để giúp bạn triển khai và tự động hóa bản dựng, một số được viết bằng PHP, một số khác thì không. Điều này sẽ không cản trở bạn sử dụng chúng, nếu chúng phù hợp hơn cho công việc cụ thể. Đây là vài ví dụ
Phing có thể kiểm soát quy trình đóng gói, triển khai hoặc thử nghiệm của bạn từ bên trong tệp bản dựng XML. Phing [dựa trên Apache Ant] cung cấp một tập hợp phong phú các tác vụ thường cần thiết để cài đặt hoặc cập nhật ứng dụng web và có thể được mở rộng với các tác vụ tùy chỉnh bổ sung, được viết bằng PHP. Đây là một công cụ chắc chắn và mạnh mẽ và đã xuất hiện từ lâu, tuy nhiên, công cụ này có thể bị coi là hơi lỗi thời do cách nó xử lý cấu hình [tệp XML]
Capistrano là một hệ thống dành cho các lập trình viên từ trung cấp đến cao cấp để thực thi các lệnh theo cách có cấu trúc, có thể lặp lại trên một hoặc nhiều máy từ xa. Nó được cấu hình sẵn để triển khai các ứng dụng Ruby on Rails, tuy nhiên bạn có thể triển khai thành công các hệ thống PHP với nó. Việc sử dụng thành công Capistrano phụ thuộc vào kiến thức làm việc về Ruby và Rake
Ansistrano là một vài vai trò Ansible để dễ dàng quản lý quy trình triển khai [triển khai và khôi phục] cho các ứng dụng tập lệnh như PHP, Python và Ruby. Đó là một cổng Ansible cho Capistrano. Nó đã được khá nhiều công ty PHP sử dụng rồi
Rocketeer lấy cảm hứng và triết lý từ Laravel framework. Mục tiêu của nó là nhanh, thanh lịch và dễ sử dụng với các mặc định thông minh. Nó có nhiều máy chủ, nhiều giai đoạn, triển khai nguyên tử và triển khai có thể được thực hiện song song. Mọi thứ trong công cụ đều có thể được hoán đổi hoặc mở rộng nóng và mọi thứ đều được viết bằng PHP
Deployer là một công cụ triển khai được viết bằng PHP. Nó đơn giản và chức năng. Các tính năng bao gồm chạy các tác vụ song song, triển khai nguyên tử và duy trì tính nhất quán giữa các máy chủ. Công thức của các tác vụ phổ biến cho Symfony, Laravel, Zend Framework và Yii có sẵn. Bài viết của Younes Rafie Triển khai dễ dàng các ứng dụng PHP với Deployer là một hướng dẫn tuyệt vời để triển khai ứng dụng của bạn bằng công cụ
Magallanes là một công cụ khác được viết bằng PHP với cấu hình đơn giản được thực hiện trong tệp YAML. Nó có hỗ trợ cho nhiều máy chủ và môi trường, triển khai nguyên tử và có một số tác vụ được tích hợp sẵn mà bạn có thể tận dụng cho các công cụ và khuôn khổ phổ biến
đọc thêm
Cung cấp máy chủ
Quản lý và cấu hình máy chủ có thể là một nhiệm vụ khó khăn khi phải đối mặt với nhiều máy chủ. Có các công cụ để giải quyết vấn đề này để bạn có thể tự động hóa cơ sở hạ tầng của mình nhằm đảm bảo rằng bạn có đúng máy chủ và chúng được định cấu hình đúng cách. Họ thường tích hợp với các nhà cung cấp dịch vụ lưu trữ đám mây lớn hơn [Amazon Web Services, Heroku, DigitalOcean, v.v.] để quản lý các phiên bản, điều này giúp mở rộng ứng dụng dễ dàng hơn rất nhiều
Ansible là một công cụ quản lý cơ sở hạ tầng của bạn thông qua các tệp YAML. Thật đơn giản để bắt đầu và có thể quản lý các ứng dụng quy mô lớn và phức tạp. Có một API để quản lý các phiên bản trên đám mây và nó có thể quản lý chúng thông qua khoảng không quảng cáo động bằng một số công cụ nhất định
Con rối là một công cụ có ngôn ngữ và loại tệp riêng để quản lý máy chủ và cấu hình. Nó có thể được sử dụng trong thiết lập chính/máy khách hoặc nó có thể được sử dụng trong chế độ “không có chủ”. Ở chế độ chính/máy khách, các máy khách sẽ thăm dò [các] máy chủ trung tâm để biết cấu hình mới theo các khoảng thời gian đã đặt và tự cập nhật nếu cần. Ở chế độ không có chủ, bạn có thể đẩy các thay đổi đến các nút của mình
Chef là một khung tích hợp hệ thống mạnh mẽ dựa trên Ruby mà bạn có thể xây dựng toàn bộ môi trường máy chủ hoặc hộp ảo của mình với. Nó tích hợp tốt với Amazon Web Services thông qua dịch vụ của họ có tên là OpsWorks
đọc thêm
Hội nhập liên tục
Tích hợp liên tục là một phương pháp phát triển phần mềm trong đó các thành viên trong nhóm tích hợp công việc của họ thường xuyên, thông thường mỗi người tích hợp ít nhất hàng ngày — dẫn đến nhiều lần tích hợp mỗi ngày. Nhiều nhóm nhận thấy rằng cách tiếp cận này giúp giảm đáng kể các vấn đề về tích hợp và cho phép nhóm phát triển phần mềm gắn kết nhanh hơn
– Martin Fowler
Có nhiều cách khác nhau để triển khai tích hợp liên tục cho PHP. Travis CI đã hoàn thành xuất sắc nhiệm vụ biến việc tích hợp liên tục thành hiện thực ngay cả đối với các dự án nhỏ. Travis CI là một dịch vụ tích hợp liên tục được lưu trữ cho cộng đồng nguồn mở. Nó được tích hợp với GitHub và cung cấp hỗ trợ hạng nhất cho nhiều ngôn ngữ bao gồm PHP
đọc thêm
Chạy ứng dụng của bạn trên các môi trường khác nhau trong quá trình phát triển và sản xuất có thể dẫn đến các lỗi lạ xuất hiện khi bạn phát hành trực tiếp. Cũng rất khó để cập nhật các môi trường phát triển khác nhau với cùng một phiên bản cho tất cả các thư viện được sử dụng khi làm việc với một nhóm các nhà phát triển
Nếu bạn đang phát triển trên Windows và triển khai lên Linux [hoặc bất kỳ thứ gì không phải Windows] hoặc đang phát triển theo nhóm, bạn nên cân nhắc sử dụng máy ảo. Điều này nghe có vẻ phức tạp, nhưng bên cạnh các môi trường ảo hóa được biết đến rộng rãi như VMware hoặc VirtualBox, còn có các công cụ bổ sung có thể giúp bạn thiết lập môi trường ảo chỉ bằng một vài bước đơn giản
lang thang
Vagrant giúp bạn xây dựng các hộp ảo của mình trên các môi trường ảo đã biết và sẽ định cấu hình các môi trường này dựa trên một tệp cấu hình duy nhất. Các hộp này có thể được thiết lập thủ công hoặc bạn có thể sử dụng phần mềm “cung cấp” như Puppet hoặc Chef để thực hiện việc này cho bạn. Cung cấp hộp cơ sở là một cách tuyệt vời để đảm bảo rằng nhiều hộp được thiết lập theo cách giống hệt nhau và loại bỏ nhu cầu duy trì danh sách lệnh “thiết lập” phức tạp của bạn. Bạn cũng có thể “phá hủy” hộp cơ sở của mình và tạo lại nó mà không cần thực hiện nhiều bước thủ công, giúp dễ dàng tạo cài đặt “mới”
Vagrant tạo các thư mục để chia sẻ mã của bạn giữa máy chủ và máy ảo của bạn, điều đó có nghĩa là bạn có thể tạo và chỉnh sửa các tệp của mình trên máy chủ, sau đó chạy mã bên trong máy ảo của bạn
Một sự giúp đỡ nho nhỏ
Nếu bạn cần một chút trợ giúp để bắt đầu sử dụng Vagrant, có một số dịch vụ có thể hữu ích
- con rối. GUI đơn giản để thiết lập các máy ảo để phát triển PHP. Tập trung nhiều vào PHP. Bên cạnh các máy ảo cục bộ, nó cũng có thể được sử dụng để triển khai cho các dịch vụ đám mây. Việc cung cấp được thực hiện với Puppet
- khả thi. cung cấp một giao diện dễ sử dụng giúp bạn tạo Ansible Playbooks cho các dự án dựa trên PHP
docker
Docker - một giải pháp thay thế gọn nhẹ cho một máy ảo đầy đủ - được gọi như vậy bởi vì nó nói về “các thùng chứa”. Vùng chứa là một khối xây dựng, trong trường hợp đơn giản nhất, thực hiện một công việc cụ thể, chẳng hạn như. g. chạy một máy chủ web. Một “hình ảnh” là gói bạn sử dụng để xây dựng vùng chứa - Docker có một kho chứa đầy chúng
Một ứng dụng LAMP điển hình có thể có ba vùng chứa. máy chủ web, quy trình PHP-FPM và MySQL. Như với các thư mục được chia sẻ trong Vagrant, bạn có thể để các tệp ứng dụng của mình ở vị trí của chúng và báo cho Docker biết nơi tìm chúng
Bạn có thể tạo vùng chứa từ dòng lệnh [xem ví dụ bên dưới] hoặc, để dễ bảo trì, hãy tạo tệp
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
761 cho dự án của bạn, chỉ định vùng chứa nào cần tạo và cách chúng giao tiếp với nhauDocker có thể hữu ích nếu bạn đang phát triển nhiều trang web và muốn tách biệt khỏi việc cài đặt từng trang trên máy ảo của riêng mình, nhưng không có dung lượng đĩa cần thiết hoặc thời gian để cập nhật mọi thứ. Nó hiệu quả. quá trình cài đặt và tải xuống nhanh hơn, bạn chỉ cần lưu trữ một bản sao của mỗi hình ảnh, tuy nhiên nó thường được sử dụng như thế nào, bộ chứa cần ít RAM hơn và chia sẻ cùng một nhân hệ điều hành, vì vậy bạn có thể có nhiều máy chủ chạy đồng thời và chỉ mất vài giây để
Sau khi cài đặt docker trên máy của bạn, bạn có thể khởi động máy chủ web bằng một lệnh. Phần sau đây sẽ tải xuống bản cài đặt Apache đầy đủ chức năng với phiên bản PHP mới nhất, ánh xạ
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
762 tới thư mục gốc của tài liệu mà bạn có thể xem tại
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
763phpcbf -w --standard=PSR1 file.php
0Thao tác này sẽ khởi tạo và khởi chạy vùng chứa của bạn.
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
764 làm cho nó chạy ở chế độ nền. Để dừng và khởi động nó, chỉ cần chạy
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
765 và
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
766 [không cần lặp lại các tham số khác]Tìm hiểu thêm về docker
Lệnh trên cho thấy một cách nhanh chóng để chạy một máy chủ cơ bản. Bạn có thể làm nhiều việc hơn nữa [và hàng nghìn hình ảnh dựng sẵn trong Docker Hub]. Dành thời gian để tìm hiểu thuật ngữ và đọc Hướng dẫn sử dụng Docker để tận dụng tối đa nó và không chạy mã ngẫu nhiên mà bạn đã tải xuống mà không kiểm tra xem nó có an toàn không – hình ảnh không chính thức có thể không có các bản vá bảo mật mới nhất. Nếu nghi ngờ, hãy bám vào kho lưu trữ chính thức
PHPDocker. io sẽ tự động tạo tất cả các tệp bạn cần cho ngăn xếp LAMP/LEMP đầy đủ tính năng, bao gồm lựa chọn phiên bản PHP và tiện ích mở rộng của bạn
Bản thân PHP khá nhanh, nhưng có thể phát sinh tắc nghẽn khi bạn thực hiện kết nối từ xa, tải tệp, v.v. Rất may, có sẵn nhiều công cụ khác nhau để tăng tốc một số phần nhất định trong ứng dụng của bạn hoặc giảm số lần các tác vụ tốn thời gian khác nhau này cần chạy
bộ nhớ đệm opcode
Khi một tệp PHP được thực thi, trước tiên nó phải được biên dịch thành opcodes [hướng dẫn ngôn ngữ máy cho CPU]. Nếu mã nguồn không thay đổi thì các opcode sẽ giống nhau nên bước biên dịch này trở nên lãng phí tài nguyên CPU
Bộ đệm opcode ngăn chặn quá trình biên dịch dư thừa bằng cách lưu trữ opcode trong bộ nhớ và sử dụng lại chúng trong các cuộc gọi liên tiếp. Nó thường sẽ kiểm tra chữ ký hoặc thời gian sửa đổi của tệp trước, trong trường hợp có bất kỳ thay đổi nào
Có khả năng bộ đệm opcode sẽ giúp cải thiện tốc độ đáng kể cho ứng dụng của bạn. Kể từ PHP 5. 5 có một cái được tích hợp sẵn - Zend OPcache. Tùy thuộc vào gói/bản phân phối PHP của bạn, tính năng này thường được bật theo mặc định – hãy kiểm tra và đầu ra của
phpcbf -w --standard=PSR1 file.php
80 để đảm bảo. Đối với các phiên bản trước đó, có phần mở rộng PECLĐọc thêm về bộ đệm opcode
Bộ nhớ đệm đối tượng
Đôi khi, việc lưu trữ các đối tượng riêng lẻ trong mã của bạn có thể hữu ích, chẳng hạn như với dữ liệu đắt tiền để lấy hoặc các lệnh gọi cơ sở dữ liệu mà kết quả khó có thể thay đổi. Bạn có thể sử dụng phần mềm bộ nhớ đệm đối tượng để giữ các phần dữ liệu này trong bộ nhớ để truy cập cực nhanh sau này. Nếu bạn lưu các mục này vào kho lưu trữ dữ liệu sau khi truy xuất chúng, sau đó kéo chúng trực tiếp từ bộ nhớ cache cho các yêu cầu sau, bạn có thể đạt được sự cải thiện đáng kể về hiệu suất cũng như giảm tải cho máy chủ cơ sở dữ liệu của mình
Nhiều giải pháp lưu trữ mã byte phổ biến cũng cho phép bạn lưu trữ dữ liệu tùy chỉnh vào bộ đệm ẩn, vì vậy càng có nhiều lý do để tận dụng chúng. APCu, XCache và WinCache đều cung cấp API để lưu dữ liệu từ mã PHP của bạn vào bộ nhớ đệm của chúng
Các hệ thống lưu trữ đối tượng bộ nhớ được sử dụng phổ biến nhất là APCu và memcached. APCu là một lựa chọn tuyệt vời cho bộ nhớ đệm đối tượng, nó bao gồm một API đơn giản để thêm dữ liệu của riêng bạn vào bộ nhớ cache của nó và rất dễ cài đặt cũng như sử dụng. Một hạn chế thực sự của APCu là nó được gắn với máy chủ mà nó được cài đặt trên đó. Mặt khác, Memcached được cài đặt như một dịch vụ riêng biệt và có thể được truy cập qua mạng, nghĩa là bạn có thể lưu trữ các đối tượng trong kho lưu trữ dữ liệu siêu nhanh ở một vị trí trung tâm và nhiều hệ thống khác nhau có thể lấy từ đó
Lưu ý rằng khi chạy PHP dưới dạng [ứng dụng Fastcgi bên trong máy chủ web của bạn, mọi quy trình PHP sẽ có bộ đệm riêng, tôi. e. Dữ liệu APCu không được chia sẻ giữa các quy trình worker của bạn. Trong những trường hợp này, bạn có thể cân nhắc sử dụng memcached để thay thế, vì nó không bị ràng buộc với các quy trình PHP
Trong một cấu hình được nối mạng, APCu thường sẽ vượt trội so với memcached về tốc độ truy cập, nhưng memcached sẽ có thể mở rộng quy mô nhanh hơn và xa hơn. Nếu bạn không muốn có nhiều máy chủ chạy ứng dụng của mình hoặc không cần các tính năng bổ sung mà memcached cung cấp thì APCu có lẽ là lựa chọn tốt nhất của bạn cho bộ nhớ đệm đối tượng
Ví dụ logic sử dụng APCu
brew unlink php
brew link --overwrite php@8.0
6
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
768
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
769 thông báo rõ ràng cho chúng tôi rằng không có sự trở lại; từ nguồn
Mọi người theo dõi
Thật khó để tìm thấy các thành viên thú vị và hiểu biết về cộng đồng PHP khi bạn mới bắt đầu. Bạn có thể tìm thấy danh sách viết tắt của các thành viên cộng đồng PHP để giúp bạn bắt đầu tại
Nhà cung cấp PaaS PHP
Để xem các máy chủ PaaS này đang chạy phiên bản nào, hãy truy cập Phiên bản PHP
khung
Thay vì phát minh lại bánh xe, nhiều nhà phát triển PHP sử dụng các khung để xây dựng các ứng dụng web. Các khung trừu tượng hóa nhiều mối quan tâm cấp thấp và cung cấp các giao diện hữu ích, dễ sử dụng để hoàn thành các tác vụ thông thường
Bạn không cần phải sử dụng một framework cho mọi dự án. Đôi khi PHP đơn giản là cách phù hợp, nhưng nếu bạn cần một framework thì có ba loại chính có sẵn
- Khung vi mô
- Full-Stack Frameworks
- Khung thành phần
Các khung vi mô về cơ bản là một trình bao bọc để định tuyến một yêu cầu HTTP tới một cuộc gọi lại, bộ điều khiển, phương thức, v.v. nhanh nhất có thể và đôi khi đi kèm với một vài thư viện bổ sung để hỗ trợ phát triển, chẳng hạn như các trình bao bọc cơ sở dữ liệu cơ bản và những thứ tương tự. Chúng được sử dụng nổi bật để xây dựng các dịch vụ HTTP từ xa
Nhiều khung bổ sung một số lượng đáng kể các tính năng trên những gì có sẵn trong một khung vi mô; . Chúng thường đi kèm với ORM, gói Xác thực, v.v.
Các khung dựa trên thành phần là tập hợp các thư viện chuyên dụng và đơn mục đích. Các khung dựa trên thành phần khác nhau có thể được sử dụng cùng nhau để tạo thành khung vi mô hoặc toàn ngăn xếp
Các thành phần
Như đã đề cập ở trên, “Các thành phần” là một cách tiếp cận khác để đạt được mục tiêu chung là tạo, phân phối và triển khai mã dùng chung. Các kho lưu trữ thành phần khác nhau tồn tại, hai kho chính trong số đó là
Cả hai kho lưu trữ này đều có các công cụ dòng lệnh được liên kết với chúng để hỗ trợ quá trình cài đặt và nâng cấp và đã được giải thích chi tiết hơn trong phần
Ngoài ra còn có các khung dựa trên thành phần và các nhà cung cấp thành phần không cung cấp khung nào cả. Các dự án này cung cấp một nguồn gói khác lý tưởng là ít hoặc không phụ thuộc vào các gói khác hoặc các khung cụ thể
Ví dụ: bạn có thể sử dụng gói Xác thực FuelPHP mà không cần sử dụng chính khung FuelPHP
Các thành phần Illuminate của Laravel sẽ được tách biệt tốt hơn khỏi framework Laravel. Hiện tại, chỉ những thành phần được tách rời tốt nhất khỏi khung Laravel mới được liệt kê ở trên
Tài nguyên hữu ích khác
cheatsheets
Các phương pháp hay nhất khác
Tin tức xung quanh cộng đồng phát triển web và PHP
Bạn có thể đăng ký nhận bản tin hàng tuần để cập nhật thông tin về thư viện mới, tin tức mới nhất, sự kiện và thông báo chung, cũng như các tài nguyên bổ sung thỉnh thoảng được xuất bản
Ngoài ra còn có các Tuần báo trên các nền tảng khác mà bạn có thể quan tâm;
vũ trụ PHP
Video hướng dẫn
Kênh YouTube
Video trả phí
Sách
Có rất nhiều sách PHP; . Đặc biệt, tránh những cuốn sách về “PHP 6”, một phiên bản sẽ không bao giờ tồn tại. Bản phát hành lớn tiếp theo của PHP sau 5. 6 là “PHP 7”, một phần vì điều này
Phần này nhằm mục đích trở thành một tài liệu sống cho các cuốn sách được đề xuất về phát triển PHP nói chung. Nếu bạn muốn cuốn sách của mình được thêm vào, hãy gửi PR và nó sẽ được xem xét về mức độ phù hợp
Sách miễn phí
Sách trả phí
- Xây dựng API mà bạn sẽ không ghét - Mọi người và chú chó của họ đều muốn có API, vì vậy có lẽ bạn nên học cách xây dựng chúng
- PHP hiện đại - Bao gồm các tính năng PHP hiện đại, thực tiễn tốt nhất, thử nghiệm, điều chỉnh, triển khai và thiết lập môi trường nhà phát triển
- Xây dựng ứng dụng PHP bảo mật - Tìm hiểu kiến thức cơ bản về bảo mật mà một nhà phát triển cấp cao thường có được sau nhiều năm kinh nghiệm, tất cả được cô đọng trong một cuốn sổ tay nhanh chóng và dễ dàng
- Hiện đại hóa các ứng dụng kế thừa trong PHP - Kiểm soát mã của bạn theo một loạt các bước nhỏ, cụ thể
- Bảo mật PHP. Khái niệm cốt lõi - Hướng dẫn về một số thuật ngữ bảo mật phổ biến nhất và cung cấp một số ví dụ về chúng trong PHP hàng ngày
- Mở rộng quy mô PHP - Dừng chơi sysadmin và quay lại viết mã
- Tín hiệu PHP - Tín hiệu PCNLT là một trợ giúp tuyệt vời khi viết các tập lệnh PHP chạy từ dòng lệnh
- Các thử nghiệm khả thi tối thiểu - Nhà truyền bá thử nghiệm PHP lâu năm Chris Hartjes xem xét những gì anh ấy cảm thấy là mức tối thiểu bạn cần biết để bắt đầu
- Thiết kế theo hướng miền trong PHP - Xem các ví dụ thực tế được viết bằng PHP giới thiệu các Kiểu kiến trúc thiết kế theo hướng miền [Kiến trúc lục giác, CQRS hoặc Tìm nguồn sự kiện], Mẫu thiết kế chiến thuật và Tích hợp bối cảnh có giới hạn
Nhóm người dùng PHP
Nếu bạn sống ở một thành phố lớn hơn, rất có thể có một nhóm người dùng PHP gần đó. Bạn có thể dễ dàng tìm thấy PUG địa phương của mình tại PHP. xấu xí. Các nguồn thay thế có thể là Meetup. com hoặc tìm kiếm
if formSubmitted = yes
validateData
if no validationError
include [dbconnect.inc]
insertRecord
.
.
HTML FORM GOES HERE
771 bằng công cụ tìm kiếm yêu thích của bạn [tôi. e. Google]. Nếu bạn sống ở một thị trấn nhỏ hơn, có thể không có PUG địa phương; Cần đề cập đặc biệt đến hai nhóm người dùng toàn cầu. NomadPHP và PHPWomen. NomadPHP cung cấp các cuộc họp nhóm người dùng trực tuyến hai lần mỗi tháng với các bài thuyết trình của một số diễn giả hàng đầu trong cộng đồng PHP. PHPWomen là một nhóm người dùng không độc quyền ban đầu được nhắm mục tiêu tới phụ nữ trong thế giới PHP. Tư cách thành viên dành cho tất cả những ai ủng hộ một cộng đồng đa dạng hơn. PHPWomen cung cấp một mạng lưới hỗ trợ, cố vấn và giáo dục, đồng thời thúc đẩy việc tạo ra một bầu không khí chuyên nghiệp và “thân thiện với phụ nữ”
Đọc về Nhóm người dùng trên PHP Wiki
Hội nghị PHP
Cộng đồng PHP cũng tổ chức các hội nghị khu vực và quốc gia lớn hơn ở nhiều quốc gia trên thế giới. Các thành viên nổi tiếng của cộng đồng PHP thường phát biểu tại các sự kiện lớn hơn này, vì vậy đây là cơ hội tuyệt vời để học hỏi trực tiếp từ các nhà lãnh đạo ngành
Tìm một hội nghị PHP
ElePHPquần
ElePHPant là linh vật xinh đẹp của dự án PHP với một con voi trong thiết kế của nó. Ban đầu nó được thiết kế cho dự án PHP vào năm 1998 bởi Vincent Pontier - người cha tinh thần của hàng ngàn elePHPants trên khắp thế giới - và mười năm sau, đồ chơi voi sang trọng đáng yêu cũng ra đời. Giờ đây, elePHPants có mặt tại nhiều hội nghị PHP và với nhiều nhà phát triển PHP trên máy tính của họ để giải trí và truyền cảm hứng