Kết nối cơ sở dữ liệu PHP thực hành tốt nhất

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

Show

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 PHP

Bạ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 [email protected]

brew unlink php
brew link --overwrite [email protected]

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

7

Và 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

9

Cà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ự án

Cộ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
5

Nó 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

2

Tiế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
48

khô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
4

Tù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
80

Tù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ác

Hã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ưới

phpcbf -w --standard=PSR1 file.php
8

PHP 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
82

Biể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 [email protected]
0

Xdebug

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ỗi

Việ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 [email protected]
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 [email protected]
2

IDE 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 Ruby

Có 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 [email protected]
00 trong thư mục làm việc hiện tại của bạn

Chú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 [email protected]
01). Để làm như vậy, hãy chạy lệnh này tiếp theo

brew unlink php
brew link --overwrite [email protected]
3

Ghi 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 [email protected]
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 [email protected]
03, trên toàn cầu, nó chỉ đơn giản là
brew unlink php
brew link --overwrite [email protected]
04

Cà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 [email protected]
05 của bạn để bạn có thể chỉ cần gọi
brew unlink php
brew link --overwrite [email protected]
04 từ bất kỳ thư mục nào trong dòng lệnh của mình

Cá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 [email protected]
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ạn

brew unlink php
brew link --overwrite [email protected]
4

Ngoài ra, lệnh

brew unlink php
brew link --overwrite [email protected]
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
89

brew unlink php
brew link --overwrite [email protected]
5

Tiế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 [email protected]
6
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
17 để khi họ chạy
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
19. Không sử dụng
brew unlink php
brew link --overwrite [email protected]
19 khi triển khai, chỉ sử dụng
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
22 có nghĩa là “bất kỳ thứ gì mới hơn
brew unlink php
brew link --overwrite [email protected]
23, nhưng ít hơn
brew unlink php
brew link --overwrite [email protected]
24”. Bạn cũng có thể sử dụng ký tự đại diện
brew unlink php
brew link --overwrite [email protected]
25 như trong
brew unlink php
brew link --overwrite [email protected]
26. Giờ đây, lệnh
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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ình

Xử 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 [email protected]
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 sau

brew unlink php
brew link --overwrite [email protected]
7

Điều này sẽ tạo một thư mục

brew unlink php
brew link --overwrite [email protected]
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 [email protected]
31 vào biến
brew unlink php
brew link --overwrite [email protected]
05 của mình

Trình cài đặt
brew unlink php
brew link --overwrite [email protected]
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ành

Nế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 [email protected]
34

Là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 [email protected]
8

Nế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 [email protected]
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ày

Xử 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 [email protected]
36

brew unlink php
brew link --overwrite [email protected]
9

Phần đầu tiên

brew unlink php
brew link --overwrite [email protected]
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 [email protected]
38 sẽ thêm tiền tố vào tên gói như thế này

lê-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 [email protected]
6
brew unlink php
brew link --overwrite [email protected]
39 phương pháp xuất xưởng hoặc thực hiện
brew unlink php
brew link --overwrite [email protected]
40 để lấy ngày giờ hiện tại. Sử dụng phương pháp
brew unlink php
brew link --overwrite [email protected]
41 để chuyển đổi DateTime trở lại chuỗi cho đầu ra

brew unlink php
brew link --overwrite [email protected]
1

Có 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 [email protected]
42 và
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
44. Nó sẽ trả về DateInterval mới, rất dễ hiển thị

brew unlink php
brew link --overwrite [email protected]
2

Bạ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 [email protected]
6
brew unlink php
brew link --overwrite [email protected]
45______446 và
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
48. ví dụ:
brew unlink php
brew link --overwrite [email protected]
49 và
brew unlink php
brew link --overwrite [email protected]
50. Các chuỗi
brew unlink php
brew link --overwrite [email protected]
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 Unicode

Bạn phải sử dụng các hàm

brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
54

Phần khó là luôn nhớ sử dụng các hàm

brew unlink php
brew link --overwrite [email protected]
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 theo

Không phải tất cả các hàm chuỗi đều có đối tác

brew unlink php
brew link --overwrite [email protected]
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 may

Bạn nên sử dụng hàm

brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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ều

Ngoà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 [email protected]
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 [email protected]
59 và
brew unlink php
brew link --overwrite [email protected]
61

Cuố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 [email protected]
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 [email protected]
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ông

UTF-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 [email protected]
64, đồng thời bạn sử dụng bộ ký tự
brew unlink php
brew link --overwrite [email protected]
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ọng

Lưu ý rằng bạn phải sử dụng bộ ký tự

brew unlink php
brew link --overwrite [email protected]
64 để hỗ trợ UTF-8 hoàn chỉnh, không phải bộ ký tự
brew unlink php
brew link --overwrite [email protected]
67. Xem phần Đọc thêm để biết tại sao

UTF-8 ở cấp độ trình duyệt

Sử dụng hàm

brew unlink php
brew link --overwrite [email protected]
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ạn

Sau đó, 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 [email protected]
6
brew unlink php
brew link --overwrite [email protected]
69 trong thẻ của trang của bạn

brew unlink php
brew link --overwrite [email protected]
6

đọc thêm

brew unlink php
brew link --overwrite [email protected]
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àng

Có 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
    brew unlink php
    brew link --overwrite [email protected]
    
    71 (bao gồm cả tin nhắn số nhiều)
  • 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ộ
    brew unlink php
    brew link --overwrite [email protected]
    
    74
  • 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
    brew unlink php
    brew link --overwrite [email protected]
    
    75 cho các tệp mẫu
  • 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
    brew unlink php
    brew link --overwrite [email protected]
    
    76, có sẵn kể từ PHP 5. 3, và dựa trên dự án ICU;

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 [email protected]
77 hoặc
brew unlink php
brew link --overwrite [email protected]
78. Sau khi cài đặt, kích hoạt nó bằng cách thêm
brew unlink php
brew link --overwrite [email protected]
79 (Linux/Unix) hoặc
brew unlink php
brew link --overwrite [email protected]
80 (Windows) vào
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
82) hoặc tiếng Bồ Đào Nha Brazil (
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
7

Hì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 [email protected]
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ần

Quy 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 [email protected]
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.
    brew unlink php
    brew link --overwrite [email protected]
    
    87 - chỉ có một quy tắc
  • Tiếng Anh.
    brew unlink php
    brew link --overwrite [email protected]
    
    88 - hai quy tắc, thứ nhất nếu N là một, quy tắc thứ hai ngược lại
  • tiếng Bồ Đào Nha của người brazi.
    brew unlink php
    brew link --overwrite [email protected]
    
    89 - hai quy tắc, thứ hai nếu N lớn hơn một, thứ nhất nếu không

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 [email protected]
85 một câu khác cho mỗi quy tắc số nhiều được xác định

triể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 [email protected]
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 [email protected]
8

Phần đầu tiên hoạt động giống như một tiêu đề, có

brew unlink php
brew link --overwrite [email protected]
92 và
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
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 [email protected]
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 [email protected]
97. Dạng số nhiều luôn có hai
brew unlink php
brew link --overwrite [email protected]
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ịch

Thả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 [email protected]
92 đó được sử dụng giống nhau trong tất cả các tệp
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
92 nhưng đã dịch các dòng
brew unlink php
brew link --overwrite [email protected]
93

Nói về khóa dịch, có hai “trường phái” chính ở đây

  1. brew unlink php
    brew link --overwrite [email protected]
    
    92 như một câu thực. Những lợi thế chính là
    • 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
      brew unlink php
      brew link --overwrite [email protected]
      
      92;
    • 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
      brew unlink php
      brew link --overwrite [email protected]
      
      92 trên một số tệp ngôn ngữ
  2. brew unlink php
    brew link --overwrite [email protected]
    
    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ó
    • đó 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
      brew unlink php
      brew link --overwrite [email protected]
      
      07, chẳng hạn như người dịch sẽ đọc để hiểu những gì cần viết trong
      brew unlink php
      brew link --overwrite [email protected]
      
      08
    • 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ì
      brew unlink php
      brew link --overwrite [email protected]
      
      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ác

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 [email protected]
85, được dịch, biên dịch thành tệp
brew unlink php
brew link --overwrite [email protected]
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ước

1. 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 [email protected]
9
  • brew unlink php
    brew link --overwrite [email protected]
    
    13 chỉ cần dịch một
    brew unlink php
    brew link --overwrite [email protected]
    
    92 thành một
    brew unlink php
    brew link --overwrite [email protected]
    
    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 [email protected]
    
    16 hoạt động theo cách tương tự;
  • brew unlink php
    brew link --overwrite [email protected]
    
    17 cũng làm như vậy nhưng với quy tắc số nhiều;
  • Ngoài ra còn có
    brew unlink php
    brew link --overwrite [email protected]
    
    18 và
    brew unlink php
    brew link --overwrite [email protected]
    
    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 theo

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

70

3. 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 [email protected]
21 hoặc
brew unlink php
brew link --overwrite [email protected]
83

Bâ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à
    brew unlink php
    brew link --overwrite [email protected]
    
    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;
  • 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
    brew unlink php
    brew link --overwrite [email protected]
    
    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”

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 [email protected]
25), bạn có thể gặp sự cố với tệp
brew unlink php
brew link --overwrite [email protected]
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ết

Cá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 [email protected]
16 thay vì
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
30 hoặc
brew unlink php
brew link --overwrite [email protected]
31 cho
brew unlink php
brew link --overwrite [email protected]
17, hoặc có thể là một
brew unlink php
brew link --overwrite [email protected]
33 ưa thích sẽ tham gia các cuộc gọi
brew unlink php
brew link --overwrite [email protected]
13 và
brew unlink php
brew link --overwrite [email protected]
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ày

Trong 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 [email protected]
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ư
    brew unlink php
    brew link --overwrite [email protected]
    
    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 [email protected]
    
    38. Gettext sẽ biết đối số duy nhất của hàm là chuỗi cần dịch;
  • 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.
    brew unlink php
    brew link --overwrite [email protected]
    
    39, thông số kỹ thuật sẽ là
    brew unlink php
    brew link --overwrite [email protected]
    
    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 [email protected]
    
    41, biểu thị dạng đầu tiên là đối số thứ hai, v.v.

Sau khi bao gồm các quy tắc mới đó trong tệp

brew unlink php
brew link --overwrite [email protected]
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 đây

Ngườ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 [email protected]
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 [email protected]
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

71

Mã 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

72

Bây giờ chúng tôi đang cung cấp cho lớp

brew unlink php
brew link --overwrite [email protected]
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 [email protected]
46 là
brew unlink php
brew link --overwrite [email protected]
47, chúng tôi có thể đặt nó trực tiếp

Vấ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 [email protected]
48 định nghĩa một phương thức
brew unlink php
brew link --overwrite [email protected]
49 và chúng ta có các lớp
brew unlink php
brew link --overwrite [email protected]
50 và
brew unlink php
brew link --overwrite [email protected]
51 mà cả hai đều triển khai giao diện
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
54 hoặc một lớp
brew unlink php
brew link --overwrite [email protected]
55 triển khai giao diện
brew unlink php
brew link --overwrite [email protected]
48, chúng ta sẽ biết và hiểu phương thức
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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ình

Nguyê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 [email protected]
59 hoặc
brew unlink php
brew link --overwrite [email protected]
60 sẽ quan tâm đến phương thức
brew unlink php
brew link --overwrite [email protected]
61, nhưng một lớp
brew unlink php
brew link --overwrite [email protected]
62 hoặc
brew unlink php
brew link --overwrite [email protected]
63 sẽ không. Ngược lại, lớp
brew unlink php
brew link --overwrite [email protected]
62 hoặc
brew unlink php
brew link --overwrite [email protected]
63 sẽ quan tâm đến phương pháp
brew unlink php
brew link --overwrite [email protected]
66, nhưng lớp
brew unlink php
brew link --overwrite [email protected]
59 hoặc
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
61 cũng như
brew unlink php
brew link --overwrite [email protected]
66, vì vậy chúng ta nên chia nhỏ giao diện nguồn

Nguyê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

73

Hiện tại có một số lợi ích đối với lớp

brew unlink php
brew link --overwrite [email protected]
43 tùy thuộc vào giao diện thay vì cụ thể hóa

Hã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 [email protected]
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 [email protected]
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 [email protected]
74 và
brew unlink php
brew link --overwrite [email protected]
75 hiển thị, thì
brew unlink php
brew link --overwrite [email protected]
76 đang được sử dụng

Ngay 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 [email protected]
73 bằng
brew unlink php
brew link --overwrite [email protected]
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 PDO

Phầ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

74

PDO 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 [email protected]
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ộc

Giả 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 [email protected]
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 [email protected]
81 sáng tạo bằng cách gọi một URL như
brew unlink php
brew link --overwrite [email protected]
82. Thao tác này sẽ đặt biến
brew unlink php
brew link --overwrite [email protected]
83 thành
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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ười

foo. php


if formSubmitted = yes
  validateData
  if no validationError
    include (dbconnect.inc)
    insertRecord
  .
.
HTML FORM GOES HERE

79

người mẫu/FooModel. php


if formSubmitted = yes
  validateData
  if no validationError
    include (dbconnect.inc)
    insertRecord
  .
.
HTML FORM GOES HERE

90

lượ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

92

Ví 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____194

Mẫ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

95

Ví 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

99

Sự 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 [email protected]
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ới

Thay đổ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 [email protected]
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ắt

brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
93 hoặc
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
95 hoặc
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
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ỗi

Thứ 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 [email protected]
6
brew unlink php
brew link --overwrite [email protected]
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ất

Trướ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 [email protected]
81 của mình bằng cách sau

> php -S localhost:8000
53

Bạ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

704

brew unlink php
brew link --overwrite [email protected]
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àng

Mộ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
55

Ngoạ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____1717

Trong 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. 7

Dướ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àm
brew unlink php
brew link --overwrite [email protected]
6
phpcbf -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ài

Mặ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 [email protected]
59 hoặc
brew unlink php
brew link --overwrite [email protected]
61

Mộ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 thi

Mộ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ảm

vệ 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ậy

Nế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ực

Thẩ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à
    brew unlink php
    brew link --overwrite [email protected]
    
    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úy
  • 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ừ đâu

Ví 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 [email protected]
93, có thể ghi đè các biến đã được khai báo

Nếu bạn đang sử dụng PHP <5. 4. 0 đảm bảo rằng


if formSubmitted = yes
  validateData
  if no validationError
    include (dbconnect.inc)
    insertRecord
  .
.
HTML FORM GOES HERE

737 đã tắt

Báo cáo lỗi

Ghi nhật ký lỗi có thể hữu ích trong việc tìm ra các điểm có vấn đề trong ứng dụng của bạn, nhưng nó cũng có thể làm lộ thông tin về cấu trúc ứng dụng của bạn ra thế giới bên ngoài. Để bảo vệ ứng dụng của bạn một cách hiệu quả khỏi các sự cố có thể do đầu ra của những thông báo này gây ra, bạn cần định cấu hình máy chủ của mình theo cách khác trong quá trình phát triển so với sản xuất (trực tiếp)

Sự phát triển

Để hiển thị mọi lỗi có thể xảy ra trong quá trình phát triển, hãy định cấu hình các cài đặt sau trong

brew unlink php
brew link --overwrite [email protected]
81 của bạn

> php -S localhost:8000
58

Truyền vào giá trị


if formSubmitted = yes
  validateData
  if no validationError
    include (dbconnect.inc)
    insertRecord
  .
.
HTML FORM GOES HERE

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ưới

Hằng số mức lỗi

brew unlink php
brew link --overwrite [email protected]
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

752

Báo cáo mọi lỗi có thể xảy ra theo phiên bản PHP

  • < 5. 3
    
    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
    
    
    747
  • 5. 3
    
    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
    
    
    752
  • > 5. 3
    
    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
    
    
    747

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 [email protected]
81 của bạn dưới dạng

> php -S localhost:8000
59

Vớ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 nhau

Docker 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

763

phpcbf -w --standard=PSR1 file.php
0

Thao 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 [email protected]
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

Nêu các bước kết nối cơ sở dữ liệu PHP?

Trong PHP, chúng ta có thể kết nối với cơ sở dữ liệu bằng máy chủ web XAMPP bằng cách sử dụng đường dẫn sau. .
Khởi động máy chủ XAMPP bằng cách khởi động Apache và MySQL
Viết PHP script để kết nối với XAMPP
Chạy nó trong trình duyệt cục bộ
Cơ sở dữ liệu được tạo thành công dựa trên mã PHP

Đó là cách chính xác để kết nối PHP với máy chủ MySQL?

Đây là hai bước để kết nối PHP với cơ sở dữ liệu MySQL. .
Kết nối các ứng dụng PHP với MySQL (và MariaDB)
Truy xuất thông tin máy chủ cơ sở dữ liệu
Quản lý lỗi được tạo từ các cuộc gọi cơ sở dữ liệu
Làm việc với các bản ghi cơ sở dữ liệu bằng các chức năng Tạo, Đọc, Cập nhật và Xóa (CRUD)

Chúng ta có thể kết nối cơ sở dữ liệu bằng PHP không?

PHP Kết nối với MySQL. PHP 5 trở lên có thể hoạt động với cơ sở dữ liệu MySQL bằng cách sử dụng. Phần mở rộng MySQLi (chữ "i" là viết tắt của cải tiến) PDO (Đối tượng dữ liệu PHP)

Cách chính xác để kết nối với cơ sở dữ liệu MySQLi là gì?

Để kết nối với Máy chủ MySQL. .
Định vị máy khách dòng lệnh MySQL. .
Chạy ứng dụng khách. .
Nhập mật khẩu của bạn. .
Lấy danh sách cơ sở dữ liệu. .
Tạo cơ sở dữ liệu. .
Chọn cơ sở dữ liệu bạn muốn sử dụng. .
Tạo bảng và chèn dữ liệu. .
Kết thúc làm việc với MySQL Command-Line Client