Trong điều kiện nào nó buộc php dừng tập lệnh?

Hàm này trả về một giá trị khác 0 nếu cuộc gọi bị gián đoạn bởi tín hiệu. Trên Windows, giá trị này sẽ luôn là 192, là giá trị của hằng số WAIT_IO_COMPLETION trong Windows API. Trên các nền tảng khác, giá trị trả về sẽ là số giây còn lại để ngủ

Show

- Tôi có một tập lệnh chỉ cần tải F3 để tôi có thể sử dụng lớp \DB\SQL\Mapper và gửi dữ liệu được trả về từ API Infusion tới bảng cơ sở dữ liệu của tôi

- Tôi có tệp CSV được phân tích cú pháp và các hàng được chuẩn bị thành một mảng

- Tôi xử lý mảng đã chuẩn bị và gửi dữ liệu đến Infusion, đồng thời chèn/cập nhật bản ghi với thông tin hàng cập nhật

- Tập lệnh chạy trong vài giây và sau đó tôi gặp 500 Lỗi máy chủ nội bộ

- Nhật ký của tôi không có lỗi. Nhà cung cấp dịch vụ lưu trữ của tôi đã tìm thấy một lỗi trong nhật ký của họ báo cáo rằng tập lệnh đã hết thời gian chờ

- Tôi có thể thấy các hàng mới được thêm vào cơ sở dữ liệu sau khi tập lệnh được báo cáo là hết thời gian chờ

- Tôi đã xác nhận với máy chủ của mình rằng tập lệnh tiếp tục được xử lý cho đến khi hoàn thành và lỗi 500 là không có thật

Kịch bản đầu tiên của tôi không sử dụng F3 hoặc cơ sở dữ liệu và ổn định khi thực thi

Tôi có một tập lệnh xử lý CSV và giao tiếp với Infusions bằng API của họ. Infusion điều chỉnh API của họ, do đó, tập lệnh sẽ ngủ (1) rồi tiếp tục. Tập lệnh sẽ thực hiện hơn 100 nghìn lần lặp lại và không bao giờ hết thời gian.  

Đây là nơi tôi gặp vấn đề. Tập lệnh này được định cấu hình hơi khác một chút, chúng không giống nhau và tập lệnh này sử dụng F3 và cơ sở dữ liệu. Infusion iSDK là các tệp thư viện giống như trong kịch bản 1. Tập lệnh này không thể chạy 30 lần lặp lại trước khi báo cáo rằng nó đã hết thời gian chờ. Trên thực tế, tôi chỉ có thể thực hiện thành công qua 28 lần lặp mà không gặp phải Lỗi 500

Tôi đoán rằng câu hỏi duy nhất tôi có, là F3 có thể bị lỗi trong trường hợp này theo cách nào đó, có thể gây ra lỗi 500 sớm không?

Toàn bộ tình huống này khiến tôi bối rối nghiêm trọng và khiến quá trình di chuyển dữ liệu mà tôi đang thực hiện mất nhiều thời gian hơn bình thường

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 hiện nay

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 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ọ đã làm trong nhiều năm mà chưa từng 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. 2)

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. 2. 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 hiện 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. Việc nâng cấp rất dễ dàng vì không có nhiều lỗi tương thích ngược với PHP 8. 0, PHP8. 1, PHP8. 2. 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. There are multiple ways to install the latest PHP version on macOS

Install PHP via Homebrew

Homebrew is a package manager for macOS that helps you easily install PHP and various extensions. The Homebrew core repository provides “formulae” for PHP 7. 4, 8. 0, 8. 1 and PHP 8. 2. Install the latest version with this command

You can switch between Homebrew PHP versions by modifying your

phpcbf -w --standard=PSR1 file.php
3 variable. Alternatively, you can use brew-php-switcher to switch PHP versions automatically

You can also switch between PHP versions manually by unlinking and linking the wanted version

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

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

Install PHP via Macports

The MacPorts Project is an open-source community initiative to design an easy-to-use system for compiling, installing, and upgrading either command-line, X11 or Aqua based open-source software on the OS X operating system

MacPorts supports pre-compiled binaries, so you don’t need to recompile every dependency from the source tarball files, it saves your life if you don’t have any package installed on your system

At this point, you can install

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,
php-cs-fixer fix -v --rules=@PSR1 file.php
0,
php-cs-fixer fix -v --rules=@PSR1 file.php
1,
php-cs-fixer fix -v --rules=@PSR1 file.php
2,
php-cs-fixer fix -v --rules=@PSR1 file.php
3 or
php-cs-fixer fix -v --rules=@PSR1 file.php
4 using the
php-cs-fixer fix -v --rules=@PSR1 file.php
5 command, for example

sudo port install php74
sudo port install php82

And you can run

php-cs-fixer fix -v --rules=@PSR1 file.php
6 command to switch your active PHP

sudo port select --set php php82

Install PHP via phpbrew

phpbrew is a tool for installing and managing multiple PHP versions. Đ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 pháp 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,

php-cs-fixer fix -v --rules=@PSR1 file.php
7 phải trỏ đến
php-cs-fixer fix -v --rules=@PSR1 file.php
9, các bài kiểm tra đơn vị phải nằm trong thư mục
> php -i
0 và các thư viện của bên thứ ba, như được cài đặt bởi , thuộc thư mục
> php -i
1. Đố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 kết hợp 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

phpcs -sw --standard=PSR1 file.php

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 mà cấu trúc mã có trước khi sửa chúng

php-cs-fixer fix -v --rules=@PSR1 file.php

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 -i
2,
> php -i
3,
> php -i
4,
> php -i
5,
> php -i
6, 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 thiếu
> php -i
7, nhưng nó có sẵn dưới dạng
> php -i
8 và
> php -i
9

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. Both PSR-0 and PSR-4 are still perfectly usable. 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 triển khai 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 -i

Tùy chọn

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
0 sẽ in cấu hình PHP của bạn giống như hàm
" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
1

Tùy chọn

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
2 cung cấp một 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

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
3, như bên dưới

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;

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.

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
4 là biến số nguyên chứa số đối số và
" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
5 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à
" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
3

Biểu thức

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
7 đượ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

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
8/
" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
9 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

brew unlink php
brew link --overwrite [email protected]
00 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 sẽ cài đặt tệp nhị phân

brew unlink php
brew link --overwrite [email protected]
01 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]
02). Để 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]
03

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

Cài đặt trên Windows

Đối với người dùng Windows, cách dễ dàng nhất để khởi động 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 toàn cầu và thiết lập

brew unlink php
brew link --overwrite [email protected]
06 của bạn để bạn có thể chỉ cần gọi
brew unlink php
brew link --overwrite [email protected]
05 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à

brew unlink php
brew link --overwrite [email protected]
00. 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]
09 thêm một phụ thuộc dự án và nếu bạn không có tệp
brew unlink php
brew link --overwrite [email protected]
00, 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]
11 sẽ hướng dẫn bạn cách tạo tệp
brew unlink php
brew link --overwrite [email protected]
00 đầy đủ cho dự án của bạn. Dù bằng cách nào, khi bạn đã tạo tệp
brew unlink php
brew link --overwrite [email protected]
00 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 -i
1. Đ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
brew unlink php
brew link --overwrite [email protected]
00

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]
16 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 lần đầu tiên
brew unlink php
brew link --overwrite [email protected]
17. 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]
18, để khi họ chạy
brew unlink php
brew link --overwrite [email protected]
17, 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]
20. Không sử dụng
brew unlink php
brew link --overwrite [email protected]
20 khi triển khai, chỉ sử dụng
brew unlink php
brew link --overwrite [email protected]
17, nếu không, bạn có thể nhận được 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 về phiên bản của

brew unlink php
brew link --overwrite [email protected]
23 có nghĩa là “bất cứ thứ gì mới hơn
brew unlink php
brew link --overwrite [email protected]
24, nhưng ít hơn
brew unlink php
brew link --overwrite [email protected]
25”. Bạn cũng có thể sử dụng ký tự đại diện
brew unlink php
brew link --overwrite [email protected]
26 như trong
brew unlink php
brew link --overwrite [email protected]
27. Bây giờ, lệnh
brew unlink php
brew link --overwrite [email protected]
20 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

Local PHP Security Checker là một công cụ dòng lệnh, sẽ kiểm tra tệp

brew unlink php
brew link --overwrite [email protected]
18 của bạn và cho bạn biết liệu bạn có cần cập nhật bất kỳ tệp phụ thuộc nào không

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]
30. 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

Thao tác này sẽ tạo một thư mục

brew unlink php
brew link --overwrite [email protected]
31 nơi chứa các phần phụ thuộc toàn cầu của bạn. Để các tệp nhị phân của các gói đã cài đặt có sẵn ở mọi nơi, sau đó bạn sẽ thêm thư mục
brew unlink php
brew link --overwrite [email protected]
32 vào biến
brew unlink php
brew link --overwrite [email protected]
06 của mình

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

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]
36 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]
37

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

Phần đầu tiên

brew unlink php
brew link --overwrite [email protected]
38 sẽ được sử dụng để cho Composer biết rằng nó nên “khởi tạo” (hoặc “khám phá” theo thuật ngữ PEAR) kho lưu trữ lê. Sau đó, phần
brew unlink php
brew link --overwrite [email protected]
39 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]
40 phương pháp xuất xưởng hoặc thực hiện
brew unlink php
brew link --overwrite [email protected]
41 để lấy ngày giờ hiện tại. Sử dụng phương pháp
brew unlink php
brew link --overwrite [email protected]
42 để 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]
43 và
brew unlink php
brew link --overwrite [email protected]
44 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]
45. 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]
46
brew unlink php
brew link --overwrite [email protected]
47 và
brew unlink php
brew link --overwrite [email protected]
48, 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]
49. ví dụ:
brew unlink php
brew link --overwrite [email protected]
50 và
brew unlink php
brew link --overwrite [email protected]
51. Các chuỗi
brew unlink php
brew link --overwrite [email protected]
49 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 hàm

brew unlink php
brew link --overwrite [email protected]
49 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]
54 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. Hàm chính xác để sử dụng sẽ là đối tác nhiều byte,
brew unlink php
brew link --overwrite [email protected]
55

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

brew unlink php
brew link --overwrite [email protected]
49 mọi lúc. 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]
49. 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]
58 ở đầu mỗi tập lệnh PHP mà bạn viết (hoặc ở đầu tập lệnh bao gồm chung của bạn) và hàm
brew unlink php
brew link --overwrite [email protected]
59 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]
60 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]
60 và
brew unlink php
brew link --overwrite [email protected]
62

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]
63 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]
63 nếu có sẵn 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 chuỗi của bạn có thể được lưu trữ dưới dạng 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]
65, đồng thời bạn sử dụng bộ ký tự
brew unlink php
brew link --overwrite [email protected]
65 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]
65 để hỗ trợ UTF-8 hoàn chỉnh, không phải bộ ký tự
brew unlink php
brew link --overwrite [email protected]
68. 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]
59 để đảm bảo rằng tập lệnh PHP của bạn xuất 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]
70 trong thẻ 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]
71. 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 gặp rắc rối 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]
    
    72 (bao gồm cả tin nhắn số nhiều)
  • php-gettext/Gettext. Gettext support with an OO interface; includes improved helper functions, powerful extractors for several file formats (some of them not supported natively by the
    brew unlink php
    brew link --overwrite [email protected]
    
    73 command), and can also export to other formats besides
    brew unlink php
    brew link --overwrite [email protected]
    
    74 files. Can be useful if you need to integrate your translation files into other parts of the system, like a JavaScript interface
  • symfony/translation. supports a lot of different formats, but recommends using verbose XLIFF’s. Doesn’t include helper functions nor a built-in extractor, but supports placeholders using
    brew unlink php
    brew link --overwrite [email protected]
    
    75 internally
  • laminas/laminas-i18n. supports array and INI files, or Gettext formats. Implements a caching layer to save you from reading the filesystem every time. It also includes view helpers, and locale-aware input filters and validators. However, it has no message extractor

Other frameworks also include i18n modules, but those are not available outside of their codebases

  • Laravel supports basic array files, has no automatic extractor but includes a
    brew unlink php
    brew link --overwrite [email protected]
    
    76 helper for template files
  • Yii supports array, Gettext, and database-based translation, and includes a messages extractor. It is backed by the
    brew unlink php
    brew link --overwrite [email protected]
    
    77 extension, available since PHP 5. 3, and based on the ICU project; this enables Yii to run powerful replacements, like spelling out numbers, formatting dates, times, intervals, currency, and ordinals

If you decide to go for one of the libraries that provide no extractors, you may want to use the gettext formats, so you can use the original gettext toolchain (including Poedit) as described in the rest of the chapter

Gettext

Installation

You might need to install Gettext and the related PHP library by using your package manager, like

brew unlink php
brew link --overwrite [email protected]
78 or
brew unlink php
brew link --overwrite [email protected]
79. After installed, enable it by adding
brew unlink php
brew link --overwrite [email protected]
80 (Linux/Unix) or
brew unlink php
brew link --overwrite [email protected]
81 (Windows) to your
brew unlink php
brew link --overwrite [email protected]
82

Here we will also be using Poedit to create translation files. You will probably find it in your system’s package manager; it is available for Unix, Mac, and Windows, and can be downloaded for free on their website as well

Structure

Types of files

There are three files you usually deal with while working with gettext. The main ones are PO (Portable Object) and MO (Machine Object) files, the first being a list of readable “translated objects” and the second, the corresponding binary to be interpreted by gettext when doing localization. There’s also a POT (Template) file, which simply contains all existing keys from your source files, and can be used as a guide to generate and update all PO files. Those template files are not mandatory. depending on the tool you are using to do l10n, you can go just fine with only PO/MO files. You will always have one pair of PO/MO files per language and region, but only one POT per domain

Domains

There are some cases, in big projects, where you might need to separate translations when the same words convey different meaning given a context. In those cases, you split them into different domains. They are, basically, named groups of POT/PO/MO files, where the filename is the said translation domain. Small and medium-sized projects usually, for simplicity, use only one domain; its name is arbitrary, but we will be using “main” for our code samples. In Symfony projects, for example, domains are used to separate the translation for validation messages

Locale code

A locale is simply a code that identifies one version of a language. It is defined following the ISO 639-1 and ISO 3166-1 alpha-2 specs. two lower-case letters for the language, optionally followed by an underline and two upper-case letters identifying the country or regional code. For , three letters are used

For some speakers, the country part may seem redundant. In fact, some languages have dialects in different countries, such as Austrian German (

brew unlink php
brew link --overwrite [email protected]
83) or Brazilian Portuguese (
brew unlink php
brew link --overwrite [email protected]
84). The second part is used to distinguish between those dialects - when it is not present, it is taken as a “generic” or “hybrid” version of the language

Directory structure

To use Gettext, we will need to adhere to a specific structure of folders. First, you will need to select an arbitrary root for your l10n files in your source repository. Inside it, you will have a folder for each needed locale, and a fixed

brew unlink php
brew link --overwrite [email protected]
85 folder that will contain all your PO/MO pairs. Example

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

Hình thức số nhiều

As we said in the introduction, different languages might sport different plural rules. However, gettext saves us from this trouble once again. When creating a new

brew unlink php
brew link --overwrite [email protected]
86 file, you will have to declare the plural rules for that language, and translated pieces that are plural-sensitive will have a different form for each of those rules. When calling Gettext in code, you will have to specify the number related to the sentence, and it will work out the correct form to use - even using string substitution if needed

Plural rules include the number of plurals available and a boolean test with

brew unlink php
brew link --overwrite [email protected]
87 that would define in which rule the given number falls (starting the count with 0). For example

  • Japanese.
    brew unlink php
    brew link --overwrite [email protected]
    
    88 - only one rule
  • English.
    brew unlink php
    brew link --overwrite [email protected]
    
    89 - two rules, first if N is one, second rule otherwise
  • Brazilian Portuguese.
    brew unlink php
    brew link --overwrite [email protected]
    
    90 - two rules, second if N is bigger than one, first otherwise

Now that you understood the basis of how plural rules works - and if you didn’t, please look at a deeper explanation on the -, you might want to copy the ones you need from a list instead of writing them by hand

When calling out Gettext to do localization on sentences with counters, you will have to provide it the related number as well. Gettext will work out what rule should be in effect and use the correct localized version. You will need to include in the

brew unlink php
brew link --overwrite [email protected]
86 file a different sentence for each plural rule defined

Sample implementation

After all that theory, let’s get a little practical. Here’s an excerpt of a

brew unlink php
brew link --overwrite [email protected]
86 file - don’t mind with its format, but with the overall content instead; you will learn how to edit it easily later

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

The first section works like a header, having the

brew unlink php
brew link --overwrite [email protected]
93 and
brew unlink php
brew link --overwrite [email protected]
94 especially empty. It describes the file encoding, plural forms and other things that are less relevant. The second section translates a simple string from English to Brazilian Portuguese, and the third does the same, but leveraging string replacement from
brew unlink php
brew link --overwrite [email protected]
95 so the translation may contain the user name and visit date. The last section is a sample of pluralization forms, displaying the singular and plural version as
brew unlink php
brew link --overwrite [email protected]
93 in English and their corresponding translations as
brew unlink php
brew link --overwrite [email protected]
94 0 and 1 (following the number given by the plural rule). There, string replacement is used as well so the number can be seen directly in the sentence, by using
brew unlink php
brew link --overwrite [email protected]
98. The plural forms always have two
brew unlink php
brew link --overwrite [email protected]
93 (singular and plural), so it is advised not to use a complex language as the source of translation

Discussion on l10n keys

As you might have noticed, we are using as source ID the actual sentence in English. That

brew unlink php
brew link --overwrite [email protected]
93 is the same used throughout all your
brew unlink php
brew link --overwrite [email protected]
86 files, meaning other languages will have the same format and the same
brew unlink php
brew link --overwrite [email protected]
93 fields but translated
brew unlink php
brew link --overwrite [email protected]
94 lines

Talking about translation keys, there are two main “schools” here

  1. brew unlink php
    brew link --overwrite [email protected]
    
    93 as a real sentence. The main advantages are
    • if there are pieces of the software untranslated in any given language, the key displayed will still maintain some meaning. Example. if you happen to translate by heart from English to Spanish but need help to translate to French, you might publish the new page with missing French sentences, and parts of the website would be displayed in English instead;
    • it is much easier for the translator to understand what’s going on and do a proper translation based on the
      brew unlink php
      brew link --overwrite [email protected]
      
      93;
    • it gives you “free” l10n for one language - the source one;
    • The only disadvantage. if you need to change the actual text, you would need to replace the same
      brew unlink php
      brew link --overwrite [email protected]
      
      93 across several language files
  2. brew unlink php
    brew link --overwrite [email protected]
    
    93 as a unique, structured key. It would describe the sentence role in the application in a structured way, including the template or part where the string is located instead of its content
    • it is a great way to have the code organized, separating the text content from the template logic
    • however, that could bring problems to the translator that would miss the context. A source language file would be needed as a basis for other translations. Example. the developer would ideally have an
      brew unlink php
      brew link --overwrite [email protected]
      
      08 file, that translators would read to understand what to write in
      brew unlink php
      brew link --overwrite [email protected]
      
      09 for instance
    • missing translations would display meaningless keys on screen (
      brew unlink php
      brew link --overwrite [email protected]
      
      10 instead of
      brew unlink php
      brew link --overwrite [email protected]
      
      11 on the said untranslated French page). That is good it as would force translation to be complete before publishing - however, bad as translation issues would be remarkably awful in the interface. Some libraries, though, include an option to specify a given language as “fallback”, having a similar behavior as the other approach

The Gettext manual favors the first approach as, in general, it is easier for translators and users in case of trouble. That is how we will be working here as well. However, the favors keyword-based translation, to allow for independent changes of all translations without affecting templates as well

Everyday usage

In a typical application, you would use some Gettext functions while writing static text in your pages. Those sentences would then appear in

brew unlink php
brew link --overwrite [email protected]
86 files, get translated, compiled into
brew unlink php
brew link --overwrite [email protected]
13 files and then, used by Gettext when rendering the actual interface. Given that, let’s tie together what we have discussed so far in a step-by-step example

1. A sample template file, including some different gettext calls

brew unlink php
brew link --overwrite [email protected]
9
  • brew unlink php
    brew link --overwrite [email protected]
    
    14 simply translates a
    brew unlink php
    brew link --overwrite [email protected]
    
    93 into its corresponding
    brew unlink php
    brew link --overwrite [email protected]
    
    94 for a given language. There’s also the shorthand function
    brew unlink php
    brew link --overwrite [email protected]
    
    17 that works the same way;
  • brew unlink php
    brew link --overwrite [email protected]
    
    18 does the same but with plural rules;
  • There are also
    brew unlink php
    brew link --overwrite [email protected]
    
    19 and
    brew unlink php
    brew link --overwrite [email protected]
    
    20, that allow you to override the domain for a single call. More on domain configuration in the next example

2. A sample setup file (
brew unlink php
brew link --overwrite [email protected]
21 as used above), selecting the correct locale and configuring Gettext

sudo port install php74
sudo port install php82
0

3. Chuẩn bị dịch cho lần chạy đầu tiên

One of the great advantages Gettext has over custom framework i18n packages is its extensive and powerful file format. “Oh man, that’s quite hard to understand and edit by hand, a simple array would be easier. ” Make no mistake, applications like Poedit are here to help - a lot. You can get the program from their website, it’s free and available for all platforms. It’s a pretty easy tool to get used to, and a very powerful one at the same time - using all features Gettext has available. This guide is based on PoEdit 1. 8

In the first run, you should select “File > New…” from the menu. You’ll be asked straight ahead for the language. here you can select/filter the language you want to translate to, or use that format we mentioned before, such as

brew unlink php
brew link --overwrite [email protected]
22 or
brew unlink php
brew link --overwrite [email protected]
84

Now, save the file - using that directory structure we mentioned as well. Then you should click “Extract from sources”, and here you’ll configure various settings for the extraction and translation tasks. 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”

  • Source paths. here you must include all folders from the project where
    brew unlink php
    brew link --overwrite [email protected]
    
    14 (and siblings) are called - this is usually your templates/views folder(s). This is the only mandatory setting;
  • Translation properties
    • Tên và phiên bản dự án, Nhóm và địa chỉ email của Nhóm. useful information that goes in the . po file header;
    • Plural forms. đâ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ữ
    • Charsets. 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?
  • Source keywords. The underlying software knows how
    brew unlink php
    brew link --overwrite [email protected]
    
    14 and similar function calls look like in several programming languages, but you might as well create your own translation functions. It will be here you’ll add those other methods. This will be discussed later in the “Tips” section

After setting those points it will run a scan through your source files to find all the localization calls. After every scan PoEdit will display a summary of what was found and what was removed from the source files. New entries will fed empty into the translation table, and you’ll start typing in the localized versions of those strings. Save it and a . mo file will be (re)compiled into the same folder and ta-dah. your project is internationalized

4. Translating strings

As you may have noticed before, there are two main types of localized strings. simple ones and those with plural forms. The first ones have simply two boxes. source and localized string. The source string cannot be modified as Gettext/Poedit do not include the powers to alter your source files - you should change the source itself and rescan the files. Tip. you may right-click a translation line and it will hint you with the source files and lines where that string is being used. On the other hand, plural form strings include two boxes to show the two source strings, and tabs so you can configure the different final forms

Whenever you change your sources and need to update the translations, just hit Refresh and Poedit will rescan the code, removing non-existent entries, merging the ones that changed and adding new ones. It may also try to guess some translations, based on other ones you did. Those guesses and the changed entries will receive a “Fuzzy” marker, indicating it needs review, appearing golden in the list. It is also useful if you have a translation team and someone tries to write something they are not sure about. just mark Fuzzy, and someone else will review later

Finally, it is advised to leave “View > Untranslated entries first” marked, as it will help you a lot to not forget any entry. From that menu, you can also open parts of the UI that allow you to leave contextual information for translators if needed

Tips & Tricks

Possible caching issues

If you are running PHP as a module on Apache (

brew unlink php
brew link --overwrite [email protected]
26), you might face issues with the
brew unlink php
brew link --overwrite [email protected]
13 file being cached. It happens the first time it is read, and then, to update it, you might need to restart the server. On Nginx and PHP5 it usually takes only a couple of page refreshes to refresh the translation cache, and on PHP7 it is rarely needed

Additional helper functions

As preferred by many people, it is easier to use

brew unlink php
brew link --overwrite [email protected]
17 instead of
brew unlink php
brew link --overwrite [email protected]
14. Many custom i18n libraries from frameworks use something similar to
brew unlink php
brew link --overwrite [email protected]
30 as well, to make translated code shorter. However, that is the only function that sports a shortcut. You might want to add in your project some others, such as
brew unlink php
brew link --overwrite [email protected]
31 or
brew unlink php
brew link --overwrite [email protected]
32 for
brew unlink php
brew link --overwrite [email protected]
18, or maybe a fancy
brew unlink php
brew link --overwrite [email protected]
34 that would join
brew unlink php
brew link --overwrite [email protected]
14 and
brew unlink php
brew link --overwrite [email protected]
36 calls. Other libraries, such as php-gettext’s Gettext also provide helper functions like these

In those cases, you’ll need to instruct the Gettext utility on how to extract the strings from those new functions. Đừng sợ; . It is just a field in the

brew unlink php
brew link --overwrite [email protected]
86 file, or a Settings screen on Poedit. In the editor, that option is inside “Catalog > Properties > Source keywords”. Remember. Gettext already knows the default functions for many languages, so don’t be afraid if that list seems empty. You need to include there the specifications of those new functions, following

  • if you create something like
    brew unlink php
    brew link --overwrite [email protected]
    
    30 that simply returns the translation for a string, you can specify it as
    brew unlink php
    brew link --overwrite [email protected]
    
    39. Gettext will know the only function argument is the string to be translated;
  • if the function has more than one argument, you can specify in which one the first string is - and if needed, the plural form as well. For instance, if we call our function like this.
    brew unlink php
    brew link --overwrite [email protected]
    
    40, the specification would be
    brew unlink php
    brew link --overwrite [email protected]
    
    41, meaning the first form is the first argument, and the second form is the second argument. If your number comes as the first argument instead, the spec would be
    brew unlink php
    brew link --overwrite [email protected]
    
    42, indicating the first form is the second argument, and so on

After including those new rules in the

brew unlink php
brew link --overwrite [email protected]
86 file, a new scan will bring in your new strings just as easy as before

References

From Wikipedia

Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it possible to change them, whether at run-time or compile-time

This quote makes the concept sound much more complicated than it actually is. Dependency Injection is providing a component with its dependencies either through constructor injection, method calls or the setting of properties. It is that simple

Basic Concept

We can demonstrate the concept with a simple, yet naive example

Here we have a

brew unlink php
brew link --overwrite [email protected]
44 class that requires an adapter to speak to the database. We instantiate the adapter in the constructor and create a hard dependency. This makes testing difficult and means the
brew unlink php
brew link --overwrite [email protected]
44 class is very tightly coupled to the adapter

sudo port install php74
sudo port install php82
1

This code can be refactored to use Dependency Injection and therefore loosen the dependency

sudo port install php74
sudo port install php82
2

Now we are giving the

brew unlink php
brew link --overwrite [email protected]
44 class its dependency rather than creating it itself. We could even create a method that would accept an argument of the dependency and set it that way, or if the
brew unlink php
brew link --overwrite [email protected]
47 property was
brew unlink php
brew link --overwrite [email protected]
48 we could set it directly

Complex Problem

If you have ever read about Dependency Injection then you have probably seen the terms “Inversion of Control” or “Dependency Inversion Principle”. These are the complex problems that Dependency Injection solves

Inversion of Control

Inversion of Control is as it says, “inverting the control” of a system by keeping organizational control entirely separate from our objects. In terms of Dependency Injection, this means loosening our dependencies by controlling and instantiating them elsewhere in the system

For years, PHP frameworks have been achieving Inversion of Control, however, the question became, which part of control are we inverting, and where to? For example, MVC frameworks would generally provide a super object or base controller that other controllers must extend to gain access to its dependencies. This is Inversion of Control, however, instead of loosening dependencies, this method simply moved them

Dependency Injection allows us to more elegantly solve this problem by only injecting the dependencies we need, when we need them, without the need for any hard coded dependencies at all

S. O. L. I. D

Single Responsibility Principle

The Single Responsibility Principle is about actors and high-level architecture. It states that “A class should have only one reason to change. ” This means that every class should only have responsibility over a single part of the functionality provided by the software. The largest benefit of this approach is that it enables improved code reusability. By designing our class to do just one thing, we can use (or re-use) it in any other program without changing it

Open/Closed Principle

The Open/Closed Principle is about class design and feature extensions. It states that “Software entities (classes, modules, functions, etc. ) should be open for extension, but closed for modification. ” This means that we should design our modules, classes and functions in a way that when a new functionality is needed, we should not modify our existing code but rather write new code that will be used by existing code. Practically speaking, this means that we should write classes that implement and adhere to interfaces, then type-hint against those interfaces instead of specific classes

The largest benefit of this approach is that we can very easily extend our code with support for something new without having to modify existing code, meaning that we can reduce QA time, and the risk for negative impact to the application is substantially reduced. We can deploy new code, faster, and with more confidence

Liskov Substitution Principle

The Liskov Substitution Principle is about subtyping and inheritance. It states that “Child classes should never break the parent class’ type definitions. ” Or, in Robert C. Martin’s words, “Subtypes must be substitutable for their base types. ”

For example, if we have a

brew unlink php
brew link --overwrite [email protected]
49 interface which defines an
brew unlink php
brew link --overwrite [email protected]
50 method, and we have
brew unlink php
brew link --overwrite [email protected]
51 and
brew unlink php
brew link --overwrite [email protected]
52 classes which both implement the
brew unlink php
brew link --overwrite [email protected]
49 interface, then we can expect that the usage of the
brew unlink php
brew link --overwrite [email protected]
50 method will always do the thing that we intend. If we later create a
brew unlink php
brew link --overwrite [email protected]
55 class or a
brew unlink php
brew link --overwrite [email protected]
56 class which implement the
brew unlink php
brew link --overwrite [email protected]
49 interface, we will already know and understand what the
brew unlink php
brew link --overwrite [email protected]
50 method will do. The largest benefit of this approach is that we have the ability to build flexible and easily-configurable programs, because when we change one object of a type (e. g. ,
brew unlink php
brew link --overwrite [email protected]
49) to another we don’t need to change anything else in our program

Interface Segregation Principle

The Interface Segregation Principle (ISP) is about business-logic-to-clients communication. It states that “No client should be forced to depend on methods it does not use. ” This means that instead of having a single monolithic interface that all conforming classes need to implement, we should instead provide a set of smaller, concept-specific interfaces that a conforming class implements one or more of

For example, a

brew unlink php
brew link --overwrite [email protected]
60 or
brew unlink php
brew link --overwrite [email protected]
61 class would be interested in a
brew unlink php
brew link --overwrite [email protected]
62 method, but a
brew unlink php
brew link --overwrite [email protected]
63 or
brew unlink php
brew link --overwrite [email protected]
64 class would not. Conversely, a
brew unlink php
brew link --overwrite [email protected]
63 or
brew unlink php
brew link --overwrite [email protected]
64 class would be interested in a
brew unlink php
brew link --overwrite [email protected]
67 method, but a
brew unlink php
brew link --overwrite [email protected]
60 or
brew unlink php
brew link --overwrite [email protected]
61 class would not. There is no need to have all of these types of vehicles implement support for both
brew unlink php
brew link --overwrite [email protected]
62 as well as
brew unlink php
brew link --overwrite [email protected]
67, so we should break-apart the source interface

Dependency Inversion Principle

The Dependency Inversion Principle is about removing hard-links between discrete classes so that new functionality can be leveraged by passing a different class. It states that one should “Depend on Abstractions. Do not depend on concretions. ”. Put simply, this means our dependencies should be interfaces/contracts or abstract classes rather than concrete implementations. We can easily refactor the above example to follow this principle

sudo port install php74
sudo port install php82
3

There are several benefits to the

brew unlink php
brew link --overwrite [email protected]
44 class now depending on an interface rather than a concretion

Consider that we are working in a team and the adapter is being worked on by a colleague. In our first example, we would have to wait for said colleague to finish the adapter before we could properly mock it for our unit tests. Now that the dependency is an interface/contract we can happily mock that interface knowing that our colleague will build the adapter based on that contract

An even bigger benefit to this method is that our code is now much more scalable. If a year down the line we decide that we want to migrate to a different type of database, we can write an adapter that implements the original interface and injects that instead, no more refactoring would be required as we can ensure that the adapter follows the contract set by the interface

Containers

The first thing you should understand about Dependency Injection Containers is that they are not the same thing as Dependency Injection. A container is a convenience utility that helps us implement Dependency Injection, however, they can be and often are misused to implement an anti-pattern, Service Location. Injecting a DI container as a Service Locator in to your classes arguably creates a harder dependency on the container than the dependency you are replacing. It also makes your code much less transparent and ultimately harder to test

Most modern frameworks have their own Dependency Injection Container that allows you to wire your dependencies together through configuration. Đ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 was to use native drivers such as mysqli, pgsql, mssql, etc

Native drivers are great if you are only using one database in your application, but if, for example, you are using MySQL and a little bit of MSSQL, or you need to connect to an Oracle database, then you will not be able to use the same drivers. You’ll need to learn a brand new API for each database — and that can get silly

MySQL Extension

The mysql extension for PHP is incredibly old and has been superseded by two other extensions

Not only did development stop long ago on mysql, but it has been officially removed in PHP 7. 0

To save digging into your

brew unlink php
brew link --overwrite [email protected]
82 settings to see which module you are using, one option is to search for
brew unlink php
brew link --overwrite [email protected]
74 in your editor of choice. If any functions such as
brew unlink php
brew link --overwrite [email protected]
75 and
brew unlink php
brew link --overwrite [email protected]
76 show up, then
brew unlink php
brew link --overwrite [email protected]
77 is in use

Even if you are not using PHP 7. x or later yet, failing to consider this upgrade as soon as possible will lead to greater hardship when the PHP upgrade does come about. The best option is to replace mysql usage with mysqli or PDO in your applications within your own development schedules so you won’t be rushed later on

If you are upgrading from mysql to mysqli, beware lazy upgrade guides that suggest you can simply find and replace

brew unlink php
brew link --overwrite [email protected]
74 with
brew unlink php
brew link --overwrite [email protected]
79. Not only is that a gross oversimplification, it misses out on the advantages that mysqli provides, such as parameter binding, which is also offered in PDO

PDO Extension

PDO is a database connection abstraction library — built into PHP since 5. 1. 0 — that provides a common interface to talk with many different databases. For example, you can use basically identical code to interface with MySQL or SQLite

sudo port install php74
sudo port install php82
4

PDO will not translate your SQL queries or emulate missing features; it is purely for connecting to multiple types of database with the same API

More importantly,

brew unlink php
brew link --overwrite [email protected]
80 allows you to safely inject foreign input (e. g. IDs) into your SQL queries without worrying about database SQL injection attacks. This is possible using PDO statements and bound parameters

Let’s assume a PHP script receives a numeric ID as a query parameter. This ID should be used to fetch a user record from a database. This is the

brew unlink php
brew link --overwrite [email protected]
81 way to do this

sudo port install php74
sudo port install php82
5

This is terrible code. You are inserting a raw query parameter into a SQL query. This will get you hacked in a heartbeat, using a practice called SQL Injection. Just imagine if a hacker passes in an inventive

brew unlink php
brew link --overwrite [email protected]
82 parameter by calling a URL like
brew unlink php
brew link --overwrite [email protected]
83. This will set the
brew unlink php
brew link --overwrite [email protected]
84 variable to
brew unlink php
brew link --overwrite [email protected]
85 which will delete all of your users. Instead, you should sanitize the ID input using PDO bound parameters

sudo port install php74
sudo port install php82
6

This is correct code. It uses a bound parameter on a PDO statement. This escapes the foreign input ID before it is introduced to the database preventing potential SQL injection attacks

For writes, such as INSERT or UPDATE, it’s especially critical to still first and sanitize it for other things (removal of HTML tags, JavaScript, etc). PDO will only sanitize it for SQL, not for your application

You should also be aware that database connections use up resources and it was not unheard-of to have resources exhausted if connections were not implicitly closed, however this was more common in other languages. Using PDO you can implicitly close the connection by destroying the object by ensuring all remaining references to it are deleted, i. e. set to NULL. If you don’t do this explicitly, PHP will automatically close the connection when your script ends - unless of course you are using persistent connections

Interacting with Databases

When developers first start to learn PHP, they often end up mixing their database interaction up with their presentation logic, using code that might look like this

sudo port install php74
sudo port install php82
7

This is bad practice for all sorts of reasons, mainly that it’s hard to debug, hard to test, hard to read and it is going to output a lot of fields if you don’t put a limit on there

While there are many other solutions to doing this - depending on if you prefer or - there must be some element of separation

Consider the most basic step

sudo port install php74
sudo port install php82
8

That is a good start. Put those two items in two different files and you’ve got some clean separation

Create a class to place that method in and you have a “Model”. Create a simple

brew unlink php
brew link --overwrite [email protected]
86 file to put the presentation logic in and you have a “View”, which is very nearly MVC - a common OOP architecture for most

foo. php

sudo port install php74
sudo port install php82
9

models/FooModel. php

sudo port select --set php php82
0

views/foo-list. php

sudo port select --set php php82
1

This is essentially the same as what most modern frameworks are doing, albeit a little more manual. You might not need to do all of that every time, but mixing together too much presentation logic and database interaction can be a real problem if you ever want to your application

Abstraction Layers

Many frameworks provide their own abstraction layer which may or may not sit on top of PDO. These will often emulate features for one database system that is missing from another by wrapping your queries in PHP methods, giving you actual database abstraction instead of just the connection abstraction that PDO provides. This will of course add a little overhead, but if you are building a portable application that needs to work with MySQL, PostgreSQL and SQLite then a little overhead will be worth it for the sake of code cleanliness

Some abstraction layers have been built using the PSR-0 or PSR-4 namespace standards so can be installed in any application you like

Templates provide a convenient way of separating your controller and domain logic from your presentation logic. Templates typically contain the HTML of your application, but may also be used for other formats, such as XML. Templates are often referred to as “views”, which make up part of the second component of the (MVC) software architecture pattern

Benefits

The main benefit to using templates is the clear separation they create between the presentation logic and the rest of your application. Templates have the sole responsibility of displaying formatted content. They are not responsible for data lookup, persistence or other more complex tasks. This leads to cleaner, more readable code which is especially helpful in a team environment where developers work on the server-side code (controllers, models) and designers work on the client-side code (markup)

Templates also improve the organization of presentation code. Templates are typically placed in a “views” folder, each defined within a single file. This approach encourages code reuse where larger blocks of code are broken into smaller, reusable pieces, often called partials. For example, your site header and footer can each be defined as templates, which are then included before and after each page template

Finally, depending on the library you use, templates can offer more security by automatically escaping user-generated content. Some libraries even offer sand-boxing, where template designers are only given access to white-listed variables and functions

Plain PHP Templates

Plain PHP templates are simply templates that use native PHP code. They are a natural choice since PHP is actually a template language itself. That simply means that you can combine PHP code within other code, like HTML. This is beneficial to PHP developers as there is no new syntax to learn, they know the functions available to them, and their code editors already have PHP syntax highlighting and auto-completion built-in. Further, plain PHP templates tend to be very fast as no compiling stage is required

Every modern PHP framework employs some kind of template system, most of which use plain PHP by default. Outside of frameworks, libraries like Plates or Aura. View make working with plain PHP templates easier by offering modern template functionality such as inheritance, layouts and extensions

Simple example of a plain PHP template

Using the Plates library

sudo port select --set php php82
2

Example of plain PHP templates using inheritance

Using the Plates library

sudo port select --set php php82
3
sudo port select --set php php82
4

Mẫu đã biên dịch

While PHP has evolved into a mature, object oriented language, it hasn’t improved much as a templating language. Compiled templates, like Twig, Brainy, or Smarty*, fill this void by offering a new syntax that has been geared specifically to templating. From automatic escaping, to inheritance and simplified control structures, compiled templates are designed to be easier to write, cleaner to read and safer to use. Compiled templates can even be shared across different languages, Mustache being a good example of this. Since these templates must be compiled there is a slight performance hit, however this is very minimal when proper caching is used

*While Smarty offers automatic escaping, this feature is NOT enabled by default

Ví dụ đơn giản về mẫu đã biên dịch

Sử dụng thư viện Twig

sudo port select --set php php82
5

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

sudo port select --set php php82
6
sudo port select --set php php82
7

Đọ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ụ

sudo port select --set php php82
8

Đâ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ệ

sudo port select --set php php82
9

The only real difference is that Python will freak out over any small thing, so that developers can be super sure any potential issue or edge-case is caught, whereas PHP will keep on processing unless something extreme happens, at which point it will throw an error and report it

Error Severity

PHP has several levels of error severity. The three most common types of messages are errors, notices and warnings. These have different levels of severity;

brew unlink php
brew link --overwrite [email protected]
87,
brew unlink php
brew link --overwrite [email protected]
88, and
brew unlink php
brew link --overwrite [email protected]
89. Errors are fatal run-time errors and are usually caused by faults in your code and need to be fixed as they’ll cause PHP to stop executing. Notices are advisory messages caused by code that may or may not cause problems during the execution of the script, execution is not halted. Warnings are non-fatal errors, execution of the script will not be halted

Another type of error message reported at compile time are

brew unlink php
brew link --overwrite [email protected]
90 messages. These messages are used to suggest changes to your code to help ensure best interoperability and forward compatibility with upcoming versions of PHP

Changing PHP’s Error Reporting Behaviour

Error Reporting can be changed by using PHP settings and/or PHP function calls. Using the built in PHP function

brew unlink php
brew link --overwrite [email protected]
91 you can set the level of errors for the duration of the script execution by passing one of the predefined error level constants, meaning if you only want to see Errors and Warnings - but not Notices - then you can configure that

brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
92. You put this operator at the beginning of an expression, and any error that’s a direct result of the expression is silenced

brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
93 if it exists, but will simply return a null and print nothing if the variable
brew unlink php
brew link --overwrite [email protected]
94 or
brew unlink php
brew link --overwrite [email protected]
95 key does not exist. Without the error control operator, this expression could create a
brew unlink php
brew link --overwrite [email protected]
96 or
brew unlink php
brew link --overwrite [email protected]
97 error

This might seem like a good idea, but there are a few undesirable tradeoffs. PHP handles expressions using an

brew unlink php
brew link --overwrite [email protected]
98 in a less performant way than expressions without an
brew unlink php
brew link --overwrite [email protected]
98. Premature optimization may be the root of all programming arguments, but if performance is particularly important for your application/library it’s important to understand the error control operator’s performance implications

Secondly, the error control operator completely swallows the error. The error is not displayed, and the error is not sent to the error log. Also, stock/production PHP systems have no way to turn off the error control operator. While you may be correct that the error you’re seeing is harmless, a different, less harmless error will be just as silent

If there’s a way to avoid the error suppression operator, you should consider it. For example, our code above could be rewritten like this

brew unlink php
brew link --overwrite [email protected]
6
sudo port install php74
sudo port install php82
00 fails to find a file to load. You could check for the existence of the file before you try to load it, but if the file is deleted after the check and before the
sudo port install php74
sudo port install php82
01 (which might sound impossible, but it can happen) then
sudo port install php74
sudo port install php82
01 will return false and throw an error. This is potentially something PHP should resolve, but is one case where error suppression might seem like the only valid solution

Earlier we mentioned there’s no way in a stock PHP system to turn off the error control operator. However, Xdebug has an

sudo port install php74
sudo port install php82
03 ini setting which will disable the error control operator. You can set this via your
brew unlink php
brew link --overwrite [email protected]
82 file with the following

phpcs -sw --standard=PSR1 file.php
3

You can also set this value at runtime with the

sudo port install php74
sudo port install php82
05 function

brew unlink php
brew link --overwrite [email protected]
6
sudo port install php74
sudo port install php82
06 class, which extends the
sudo port install php74
sudo port install php82
07 class

This is a common practice implemented by a large number of modern frameworks such as Symfony and Laravel. In debug mode (or dev mode) both of these frameworks will display a nice and clean stack trace

There are also some packages available for better error and exception handling and reporting. Like Whoops. , which comes with the default installation of Laravel and can be used in any framework as well

By throwing errors as exceptions in development you can handle them better than the usual result, and if you see an exception during development you can wrap it in a catch statement with specific instructions on how to handle the situation. Each exception you catch instantly makes your application that little bit more robust

More information on this and details on how to use

sudo port install php74
sudo port install php82
08 with error handling can be found at ErrorException Class

sudo port install php74
sudo port install php82
09 thường sẽ chỉ cho bạn một
sudo port install php74
sudo port install php82
10 và một cảnh báo. Many older PHP frameworks like CodeIgniter will just return a false, log a message to their proprietary logs and maybe let you use a method like
sudo port install php74
sudo port install php82
11 to see what went wrong. The problem here is that you have to go looking for a mistake and check the docs to see what the error method is for this class, instead of having it made extremely obvious

Another problem is when classes automatically throw an error to the screen and exit the process. When you do this you stop another developer from being able to dynamically handle that error. Exceptions should be thrown to make a developer aware of an error; they then can choose how to handle this. E. g

phpcs -sw --standard=PSR1 file.php
5

SPL Exceptions

The generic

sudo port install php74
sudo port install php82
07 class provides very little debugging context for the developer; however, to remedy this, it is possible to create a specialized
sudo port install php74
sudo port install php82
07 type by sub-classing the generic
sudo port install php74
sudo port install php82
07 class

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

This means you can add multiple catch blocks and handle different Exceptions differently. This can lead to the creation of a lot of custom Exceptions, some of which could have been avoided using the SPL Exceptions provided in the .

If for example you use the ________22_______8 Magic Method and an invalid method is requested then instead of throwing a standard Exception which is vague, or creating a custom Exception just for that, you could just ________16_______16.

sudo port install php74
sudo port install php82
17

In PHP 5. 5

sudo port install php74
sudo port install php82
18 was introduced. At this time it is using BCrypt, the strongest algorithm currently supported by PHP. It will be updated in the future to support more algorithms as needed though. The
sudo port install php74
sudo port install php82
19 library was created to provide forward compatibility for PHP >= 5. 3. 7

Below we hash a string, and then check the hash against a new string. Because our two source strings are different (‘secret-password’ vs. ‘bad-password’) this login will fail

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

________16_______18 takes care of password salting for you. The salt is stored, along with the algorithm and “cost”, as part of the hash. ________16_______21 extracts this to determine how to check the password, so you don’t need a separate database field to store your salts.

sudo port install php74
sudo port install php82
22 and
sudo port install php74
sudo port install php82
23 functions can sanitize text and validate text formats (e. g. email addresses)

Foreign input can be anything.

sudo port install php74
sudo port install php82
24 and
sudo port install php74
sudo port install php82
25 form input data, some values in the
sudo port install php74
sudo port install php82
26 superglobal, and the HTTP request body via
sudo port install php74
sudo port install php82
27. Remember, foreign input is not limited to form data submitted by the user. Uploaded and downloaded files, session values, cookie data, and data from third-party web services are foreign input, too

While foreign data can be stored, combined, and accessed later, it is still foreign input. Every time you process, output, concatenate, or include data in your code, ask yourself if the data is filtered properly and can it be trusted

Data may be filtered differently based on its purpose. For example, when unfiltered foreign input is passed into HTML page output, it can execute HTML and JavaScript on your site. This is known as Cross-Site Scripting (XSS) and can be a very dangerous attack. One way to avoid XSS is to sanitize all user-generated data before outputting it to your page by removing HTML tags with the

sudo port install php74
sudo port install php82
28 function or escaping characters with special meaning into their respective HTML entities with the
brew unlink php
brew link --overwrite [email protected]
60 or
brew unlink php
brew link --overwrite [email protected]
62 functions

Another example is passing options to be executed on the command line. This can be extremely dangerous (and is usually a bad idea), but you can use the built-in

sudo port install php74
sudo port install php82
31 function to sanitize the executed command’s arguments

One last example is accepting foreign input to determine a file to load from the filesystem. This can be exploited by changing the filename to a file path. You need to remove

sudo port install php74
sudo port install php82
32,
sudo port install php74
sudo port install php82
33, null bytes, or other characters from the file path so it can’t load hidden, non-public, or sensitive files

Sanitization

Sanitization removes (or escapes) illegal or unsafe characters from foreign input

For example, you should sanitize foreign input before including the input in HTML or inserting it into a raw SQL query. When you use bound parameters with , it will sanitize the input for you

Sometimes it is required to allow some safe HTML tags in the input when including it in the HTML page. This is very hard to do and many avoid it by using other more restricted formatting like Markdown or BBCode, although whitelisting libraries like HTML Purifier exist for this reason

See Sanitization Filters

Unserialization

It is dangerous to

sudo port install php74
sudo port install php82
34 data from users or other untrusted sources. Doing so can allow malicious users to instantiate objects (with user-defined properties) whose destructors will be executed, even if the objects themselves aren’t used. You should therefore avoid unserializing untrusted data

If you absolutely must unserialize data from untrusted sources, use PHP 7’s

sudo port install php74
sudo port install php82
35 option to restrict which object types are allowed to be unserialized

Validation

Validation ensures that foreign input is what you expect. For example, you may want to validate an email address, a phone number, or age when processing a registration submission

See Validation Filters

Configuration Files

When creating configuration files for your applications, best practices recommend that one of the following methods be followed

  • It is recommended that you store your configuration information where it cannot be accessed directly and pulled in via the file system
  • If you must store your configuration files in the document root, name the files with a
    brew unlink php
    brew link --overwrite [email protected]
    
    86 extension. Đ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
  • Information in configuration files should be protected accordingly, either through encryption or group/user file system permissions
  • It is a good idea to ensure that you do not commit configuration files containing sensitive information e. g. mật khẩu hoặc mã thông báo API để kiểm soát nguồn

Register Globals

GHI CHÚ. Kể từ PHP 5. 4. 0 cài đặt

sudo port install php74
sudo port install php82
37 đã 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

sudo port install php74
sudo port install php82
37 làm cho một số loại biến (bao gồm các biến từ
sudo port install php74
sudo port install php82
25,
sudo port install php74
sudo port install php82
24 và
sudo port install php74
sudo port install php82
41) 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ụ.

sudo port install php74
sudo port install php82
42 sẽ khả dụng qua
brew unlink php
brew link --overwrite [email protected]
94, 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

sudo port install php74
sudo port install php82
37 đã 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)

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]
82 của bạn

phpcs -sw --standard=PSR1 file.php
8

Truyền vào giá trị

sudo port install php74
sudo port install php82
46 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ố
sudo port install php74
sudo port install php82
47 cũng hoạt động theo cách này kể từ PHP 5. 4. - php. net

Hằng số mức lỗi

brew unlink php
brew link --overwrite [email protected]
90 đã được giới thiệu trong 5. 3. 0 và không phải là một phần của
sudo port install php74
sudo port install php82
47, tuy nhiên nó đã trở thành một phần của
sudo port install php74
sudo port install php82
47 trong 5. 4. 0. Điều đó có nghĩa là gì? . 3 có nghĩa là bạn phải sử dụng
sudo port install php74
sudo port install php82
46 hoặc
sudo port install php74
sudo port install php82
52

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

  • < 5. 3
    sudo port install php74
    sudo port install php82
    
    46 hoặc
    sudo port install php74
    sudo port install php82
    
    47
  • 5. 3
    sudo port install php74
    sudo port install php82
    
    46 hoặc
    sudo port install php74
    sudo port install php82
    
    52
  • > 5. 3
    sudo port install php74
    sudo port install php82
    
    46 hoặc
    sudo port install php74
    sudo port install php82
    
    47

Sản lượng

Để ẩ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]
82 của bạn dưới dạng

phpcs -sw --standard=PSR1 file.php
9

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

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

There are several different types of testing that you can do for your application

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à

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
8 trong một bài kiểm tra. php, which is no way to build an application - large or small

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

From 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
  • Mink
  • 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

Behavior Driven Development

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ô. You can find a list of in our

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
  • Packaging
  • 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

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ủ”. In the master/client mode the clients will poll the central master(s) for new configuration on set intervals and update themselves if necessary. Ở 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

There are different ways to implement continuous integration for 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ì, tạo tệp

sudo port install php74
sudo port install php82
61 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ạ

sudo port install php74
sudo port install php82
62 tới thư mục gốc của tài liệu mà bạn có thể xem tại
sudo port install php74
sudo port install php82
63

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.

sudo port install php74
sudo port install php82
64 làm cho nó chạy ở chế độ nền. Để dừng và khởi động nó, chỉ cần chạy
sudo port install php74
sudo port install php82
65 và
sudo port install php74
sudo port install php82
66 (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

It’s likely an opcode cache will make a significant speed improvement to your application. Kể từ PHP 5. 5 there is one built in - 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

" . PHP_EOL;
    exit(1);
}
$name = $argv[1];
echo "Hello, $name" . PHP_EOL;
1 để đả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

Many of the popular bytecode caching solutions let you cache custom data as well, so there’s even more reason to take advantage of them. APCu 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
sudo port install php74
sudo port install php82
68
sudo port install php74
sudo port install php82
69 thông báo rõ ràng cho chúng tôi rằng không có hàng 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à

Both of these repositories have command line tools associated with them to help the installation and upgrade processes, and have been explained in more detail in the section

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 an toàn - 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

sudo port install php74
sudo port install php82
71 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 nghì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

Làm cách nào để dừng thực thi tập lệnh PHP?

Trong PHP, lập trình viên có thể chấm dứt việc thực thi tập lệnh bằng cách chỉ định một phương thức/hàm được gọi là phương thức exit() trong tập lệnh . Ngay cả khi hàm exit() được gọi, các hàm tắt máy và hàm hủy đối tượng sẽ được thực thi mà không bị gián đoạn.

Lỗi PHP nào gây ra việc chấm dứt tập lệnh?

Lỗi phân tích cú pháp (Cú pháp) . Trình biên dịch bắt lỗi và chấm dứt tập lệnh.

Chức năng nào giết chết việc thực thi tập lệnh ngay lập tức trong PHP?

Tôi biết thoát nhưng nó ghi rõ. Chấm dứt thực thi tập lệnh. Các chức năng tắt máy và các hàm hủy đối tượng sẽ luôn được thực thi ngay cả khi lệnh thoát được gọi.

Làm cách nào để kết thúc tập lệnh PHP?

Giống như trong C hoặc Perl, PHP yêu cầu các lệnh phải được kết thúc bằng dấu chấm phẩy ở cuối mỗi câu lệnh . Thẻ đóng của một khối mã PHP tự động bao hàm dấu chấm phẩy; .