Ngày nào sau đây là ngày phát hành của phiên bản 7.2 mới nhất của php?

There’s a lot of outdated information on the Web that leads new PHP users astray, propagating bad practices and insecure code. PHP. The Right Way is an easy-to-read, quick reference for PHP popular coding standards, links to authoritative tutorials around the Web and what the contributors consider to be best practices at the present time

There is no canonical way to use PHP. This website aims to introduce new PHP developers to some topics which they may not discover until it is too late, and aims to give seasoned pros some fresh ideas on those topics they’ve been doing for years without ever reconsidering. This website will also not tell you which tools to use, but instead offer suggestions for multiple options, when possible explaining the differences in approach and use-case

This is a living document and will continue to be updated with more helpful information and examples as they become available

Translations

PHP. The Right Way is translated into many different languages

Book

The most recent version of PHP. The Right Way is also available in PDF, EPUB and MOBI formats. Go to Leanpub

How to Contribute

Help make this website the best resource for new PHP programmers. Contribute on GitHub

Use the Current Stable Version [8. 1]

If you are getting started with PHP, start with the current stable release of PHP 8. 1. PHP 8. x adds many new features over the older 7. x and 5. x versions. The engine has been largely re-written, and PHP is now even quicker than older versions. PHP 8 is a major update of the language and contains many new features and optimizations

You should try to upgrade to the latest stable version quickly - PHP 7. 4 is already End of Life. Upgrading is easy, as there are not many backwards compatibility breaks. If you are not sure which version a function or feature is in, you can check the PHP documentation on the php. net website

Built-in web server

Với PHP5. 4 or newer, you can start learning PHP without installing and configuring a full-fledged web server. To start the server, run the following command from your terminal in your project’s web root

> php -S localhost:8000

Mac Setup

macOS comes prepackaged with PHP but it is normally a little behind the latest stable release. 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 5. 6, 7. 0, 7. 1, 7. 2, 7. 3, 7. 4, 8. 0 and PHP 8. 1. 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 php@8.0

brew unlink php
brew link --overwrite php@8.1

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,
phpcbf -w --standard=PSR1 file.php
00,
phpcbf -w --standard=PSR1 file.php
01,
phpcbf -w --standard=PSR1 file.php
02 or
phpcbf -w --standard=PSR1 file.php
03 using the
phpcbf -w --standard=PSR1 file.php
04 command, for example

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

And you can run

phpcbf -w --standard=PSR1 file.php
05 command to switch your active PHP

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

Install PHP via phpbrew

phpbrew is a tool for installing and managing multiple PHP versions. This can be really useful if two different applications/projects require different versions of PHP, and you are not using virtual machines

Install PHP via Liip’s binary installer

Another popular option is php-osx. liip. ch which provides one liner installation methods for versions 5. 3 through 7. 3. It doesn’t overwrite the PHP binaries installed by Apple, but installs everything in a separate location [/usr/local/php5]

Compile from Source

Another option that gives you control over the version of PHP you install, is to compile it yourself. In that case be sure to have installed either Xcode or Apple’s substitute “Command Line Tools for XCode” downloadable from Apple’s Mac Developer Center

All-in-One Installers

The solutions listed above mainly handle PHP itself, and do not supply things like Apache, Nginx or a SQL server. “All-in-one” solutions such as MAMP and XAMPP will install these other bits of software for you and tie them all together, but ease of setup comes with a trade-off of flexibility

Windows Setup

You can download the binaries from windows. php. net/download. After the extraction of PHP, it is recommended to set the PATH to the root of your PHP folder [where php. exe is located] so you can execute PHP from anywhere

For learning and local development, you can use the built in webserver with PHP 5. 4+ so you don’t need to worry about configuring it. If you would like an “all-in-one” which includes a full-blown webserver and MySQL too then tools such as the XAMPP, EasyPHP, OpenServer and WAMP will help get a Windows development environment up and running fast. That said, these tools will be a little different from production so be careful of environment differences if you are working on Windows and deploying to Linux

If you need to run your production system on Windows, then IIS7 will give you the most stable and best performance. You can use phpmanager [a GUI plugin for IIS7] to make configuring and managing PHP simple. IIS7 comes with FastCGI built in and ready to go, you just need to configure PHP as a handler. Để đượ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. net for PHP

Generally running your application on different environment in development and production can lead to strange bugs popping up when you go live. If you are developing on Windows and deploying to Linux [or anything non-Windows] then you should consider using a Virtual Machine

Chris Tankersley has a very helpful blog post on what tools he uses to do PHP development using Windows

Common Directory structure

A common question among those starting out with writing programs for the web is, “where do I put my stuff?” Over the years, this answer has consistently been “where the

phpcbf -w --standard=PSR1 file.php
06 is. ” Although this answer is not complete, it’s a great place to start

For security reasons, configuration files should not be accessible by a site’s visitors; therefore, public scripts are kept in a public directory and private configurations and data are kept outside of that directory

For each team, CMS, or framework one works in, a standard directory structure is used by each of those entities. However, if one is starting a project alone, knowing which filesystem structure to use can be daunting

Paul M. Jones has done some fantastic research into common practices of tens of thousands of github projects in the realm of PHP. He has compiled a standard file and directory structure, the Standard PHP Package Skeleton, based on this research. In this directory structure,

phpcbf -w --standard=PSR1 file.php
06 should point to
phpcbf -w --standard=PSR1 file.php
08, unit tests should be in the
phpcbf -w --standard=PSR1 file.php
09 directory, and third party libraries, as installed by composer, belong in the
brew unlink php
brew link --overwrite php@8.0
20 directory. For other files and directories, abiding by the Standard PHP Package Skeleton will make the most sense to contributors of a project

The PHP community is large and diverse, composed of innumerable libraries, frameworks, and components. It is common for PHP developers to choose several of these and combine them into a single project. It is important that PHP code adhere [as close as possible] to a common code style to make it easy for developers to mix and match various libraries for their projects

The Framework Interop Group has proposed and approved a series of style recommendations. Not all of them related to code-style, but those that do are PSR-1, PSR-12 and PSR-4. These recommendations are merely a set of rules that many projects like Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, etc are adopting. You can use them for your own projects, or continue to use your own personal style

Ideally, you should write PHP code that adheres to a known standard. This could be any combination of PSRs, or one of the coding standards made by PEAR or Zend. This means other developers can easily read and work with your code, and applications that implement the components can have consistency even when working with lots of third-party code

You can use PHP_CodeSniffer to check code against any one of these recommendations, and plugins for text editors like Sublime Text to be given real-time feedback

You can fix the code layout automatically by using one of the following tools

And you can run phpcs manually from shell

brew unlink php
brew link --overwrite php@8.0
3

It will show errors and describe how to fix them. It can also be helpful to include this command in a git hook. That way, branches which contain violations against the chosen standard cannot enter the repository until those violations have been fixed

If you have PHP_CodeSniffer, then you can fix the code layout problems reported by it, automatically, with the PHP Code Beautifier and Fixer

phpcbf -w --standard=PSR1 file.php

Another option is to use the PHP Coding Standards Fixer. It will show which kind of errors the code structure had before it fixed them

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

English is preferred for all symbol names and code infrastructure. 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ư

brew unlink php
brew link --overwrite php@8.0
21,
brew unlink php
brew link --overwrite php@8.0
22,
brew unlink php
brew link --overwrite php@8.0
23,
brew unlink php
brew link --overwrite php@8.0
24,
brew unlink php
brew link --overwrite php@8.0
25, v.v. cho phép các nhà phát triển kết nối với hành vi của lớp. Các nhà phát triển Ruby thường nói rằng PHP đang thiếu
brew unlink php
brew link --overwrite php@8.0
26, nhưng nó có sẵn dưới dạng
brew unlink php
brew link --overwrite php@8.0
27 và
brew unlink php
brew link --overwrite php@8.0
28

không gian tên

Như đã đề cập ở trên, cộng đồng PHP có rất nhiều nhà phát triển tạo ra rất nhiều mã. Điều này có nghĩa là mã PHP của một thư viện có thể sử dụng cùng tên lớp với một thư viện khác. Khi cả hai thư viện được sử dụng trong cùng một không gian tên, chúng xung đột và gây ra sự cố

Không gian tên giải quyết vấn đề này. Như được mô tả trong hướng dẫn tham khảo PHP, các không gian tên có thể được so sánh với các thư mục hệ điều hành chứa các tệp không gian tên; . Tương tự như vậy, hai lớp PHP có cùng tên có thể cùng tồn tại trong các không gian tên PHP riêng biệt. Nó đơn giản như vậy

Điều quan trọng là bạn phải đặt tên cho mã của mình để các nhà phát triển khác có thể sử dụng mã đó mà không sợ xung đột với các thư viện khác

Một cách được đề xuất để sử dụng không gian tên được nêu trong PSR-4, nhằm mục đích cung cấp một quy ước không gian tên, lớp và tệp tiêu chuẩn để cho phép mã plug-and-play

Vào tháng 10 năm 2014, PHP-FIG đã ngừng sử dụng tiêu chuẩn tự động tải trước đó. PSR-0. Cả PSR-0 và PSR-4 vẫn hoàn toàn có thể sử dụng được. Cái sau yêu cầu PHP 5. 3, rất nhiều PHP 5. Các dự án chỉ có 2 người triển khai PSR-0

Nếu bạn định sử dụng tiêu chuẩn trình tải tự động cho một ứng dụng hoặc gói mới, hãy xem PSR-4

Thư viện PHP chuẩn

Thư viện PHP chuẩn [SPL] được đóng gói với PHP và cung cấp một tập hợp các lớp và giao diện. Nó chủ yếu được tạo thành từ các lớp cấu trúc cơ sở dữ liệu thường cần thiết [ngăn xếp, hàng đợi, đống, v.v.] và các trình vòng lặp có thể duyệt qua các cấu trúc cơ sở dữ liệu này hoặc các lớp của riêng bạn thực hiện các giao diện SPL

Giao diện dòng lệnh

PHP được tạo ra để viết các ứng dụng web, nhưng cũng hữu ích cho các chương trình giao diện dòng lệnh [CLI]. Các chương trình PHP dòng lệnh có thể giúp tự động hóa các tác vụ phổ biến như thử nghiệm, triển khai và quản trị ứng dụng

Các chương trình CLI PHP rất mạnh mẽ vì bạn có thể sử dụng trực tiếp mã ứng dụng của mình mà không cần phải tạo và bảo mật GUI web cho nó. Chỉ cần đảm bảo không đặt các tập lệnh PHP CLI của bạn vào thư mục gốc web công cộng của bạn

Hãy thử chạy PHP từ dòng lệnh của bạn

brew unlink php
brew link --overwrite php@8.0
2

Tùy chọn

brew unlink php
brew link --overwrite php@8.0
29 sẽ in cấu hình PHP của bạn giống như hàm
brew unlink php
brew link --overwrite php@8.1
60

Tùy chọn

brew unlink php
brew link --overwrite php@8.1
61 cung cấp shell tương tác, tương tự như IRB của ruby ​​hoặc shell tương tác của python. There are a number of other useful command line options, too

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

brew unlink php
brew link --overwrite php@8.1
62, như bên dưới

brew unlink php
brew link --overwrite php@8.1
6

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.

brew unlink php
brew link --overwrite php@8.1
63 là biến số nguyên chứa số đối số và
brew unlink php
brew link --overwrite php@8.1
64 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à
brew unlink php
brew link --overwrite php@8.1
62

Biểu thức

brew unlink php
brew link --overwrite php@8.1
66 được sử dụng với một số khác 0 để cho hệ vỏ biết rằng lệnh không thành công. Mã thoát thường được sử dụng có thể được tìm thấy ở đây

Để chạy tập lệnh của chúng tôi, ở trên, từ dòng lệnh

brew unlink php
brew link --overwrite php@8.0
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

brew unlink php
brew link --overwrite php@8.1
67/
brew unlink php
brew link --overwrite php@8.1
68 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 php@8.0
1

“Máy chủ từ xa” và “cổng từ xa” sẽ tương ứng với máy tính cục bộ của bạn và cổng mà bạn định cấu hình IDE của mình để nghe trên đó. Sau đó, vấn đề chỉ là đặt IDE của bạn ở chế độ “lắng nghe kết nối” và tải URL

brew unlink php
brew link --overwrite php@8.0
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 duyệt 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 - Composer và PEAR. 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 php@8.1
69 và với một vài lệnh đơn giản, Trình soạn thảo sẽ tự động tải xuống các phần phụ thuộc của dự án và thiết lập tự động tải cho bạn. Trình soạn thảo tương tự như NPM trong nút. js hoặc Bundler trong thế giới Ruby

Có rất nhiều thư viện PHP tương thích với Composer và sẵn sàng để sử dụng trong dự án của bạn. Các “gói” này được liệt kê trên Packagist, kho lưu trữ chính thức cho các thư viện PHP tương thích với Composer

Cách cài đặt Trình soạn nhạc

Cách an toàn nhất để tải xuống trình soạn nhạc là làm theo hướng dẫn chính thức. Điều này sẽ xác minh trình cài đặt không bị hỏng hoặc giả mạo. Trình cài đặt cài đặt tệp nhị phân

brew unlink php
brew link --overwrite php@8.0
00 trong thư mục làm việc hiện tại của bạn

Chúng tôi khuyên bạn nên cài đặt Composer trên toàn cầu [e. g. một bản duy nhất trong

brew unlink php
brew link --overwrite php@8.0
01]. Để làm như vậy, hãy chạy lệnh này tiếp theo

brew unlink php
brew link --overwrite php@8.0
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 php@8.0
02

Để chạy Trình soạn thảo được cài đặt cục bộ, bạn sẽ sử dụng

brew unlink php
brew link --overwrite php@8.0
03, trên toàn cầu, nó chỉ đơn giản là
brew unlink php
brew link --overwrite php@8.0
04

Cài đặt trên Windows

Đối với người dùng Windows, cách dễ nhất để thiết lập và chạy là sử dụng trình cài đặt ComposerSetup, trình cài đặt này thực hiện cài đặt chung và thiết lập

brew unlink php
brew link --overwrite php@8.0
05 của bạn để bạn có thể chỉ cần gọi
brew unlink php
brew link --overwrite php@8.0
04 từ bất kỳ thư mục nào trong dòng lệnh của mì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 php@8.1
69. Bạn có thể quản lý nó bằng tay nếu muốn hoặc sử dụng chính Composer. Lệnh
brew unlink php
brew link --overwrite php@8.0
08 thêm một phụ thuộc dự án và nếu bạn không có tệp
brew unlink php
brew link --overwrite php@8.1
69, một tệp sẽ được tạo. Here’s an example that adds Twig as a dependency of your project

brew unlink php
brew link --overwrite php@8.0
4

Ngoài ra, lệnh

brew unlink php
brew link --overwrite php@8.0
10 sẽ hướng dẫn bạn cách tạo tệp
brew unlink php
brew link --overwrite php@8.1
69 đầ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 php@8.1
69 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
brew unlink php
brew link --overwrite php@8.0
20. Đ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 php@8.1
69

brew unlink php
brew link --overwrite php@8.0
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 php@8.0
6
brew unlink php
brew link --overwrite php@8.0
15 lưu trữ phiên bản chính xác của từng gói mà nó đã tải xuống khi bạn chạy lần đầu tiên
brew unlink php
brew link --overwrite php@8.0
16. Nếu bạn chia sẻ dự án của mình với người khác, hãy đảm bảo bao gồm tệp
brew unlink php
brew link --overwrite php@8.0
17, để khi họ chạy
brew unlink php
brew link --overwrite php@8.0
16, họ sẽ nhận được các phiên bản giống như bạn. Để cập nhật các phụ thuộc của bạn, hãy chạy
brew unlink php
brew link --overwrite php@8.0
19. Không sử dụng
brew unlink php
brew link --overwrite php@8.0
19 khi triển khai, chỉ sử dụng
brew unlink php
brew link --overwrite php@8.0
16, nếu không, bạn có thể kết thúc với các phiên bản gói khác nhau khi sản xuất

Điều này hữu ích nhất khi bạn xác định các yêu cầu phiên bản của mình một cách linh hoạt. Chẳng hạn, yêu cầu phiên bản của

brew unlink php
brew link --overwrite php@8.0
22 có nghĩa là “mọi thứ mới hơn
brew unlink php
brew link --overwrite php@8.0
23, nhưng ít hơn
brew unlink php
brew link --overwrite php@8.0
24”. Bạn cũng có thể sử dụng ký tự đại diện
brew unlink php
brew link --overwrite php@8.0
25 như trong
brew unlink php
brew link --overwrite php@8.0
26. Giờ đây, lệnh
brew unlink php
brew link --overwrite php@8.0
19 của Nhà soạn nhạc sẽ nâng cấp tất cả các phụ thuộc của bạn lên phiên bản mới nhất phù hợp với các hạn chế mà bạn xác định

Để nhận thông báo về các bản phát hành phiên bản mới, bạn có thể đăng ký thư viện. io, một dịch vụ web có thể giám sát các phụ thuộc và gửi cho bạn thông báo về các bản cập nhật

Kiểm tra các phụ thuộc của bạn để tìm các vấn đề bảo mật

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 php@8.0
17 của bạn và cho bạn biết liệu bạn có cần cập nhật bất kỳ phần 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 php@8.0
29. Ví dụ: nếu bạn muốn cài đặt PHPUnit và nó có sẵn trên toàn cầu, bạn sẽ chạy lệnh sau

brew unlink php
brew link --overwrite php@8.0
7

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

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

Trình cài đặt
brew unlink php
brew link --overwrite php@8.0
33 và thực thi nó. Tài liệu PEAR có hướng dẫn cài đặt chi tiết cho mọi hệ điều hà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 php@8.0
34

Làm thế nào để cài đặt một gói

Nếu gói được liệt kê trong danh sách gói PEAR, bạn có thể cài đặt nó bằng cách chỉ định tên chính thức

brew unlink php
brew link --overwrite php@8.0
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 php@8.0
35 kênh đó và cũng chỉ định kênh đó khi cài đặt. Xem tài liệu Sử dụng kênh để biết thêm thông tin về chủ đề này

Xử lý các phụ thuộc PEAR với Composer

Nếu bạn đang sử dụng Trình soạn thảo và bạn cũng muốn cài đặt một số mã PEAR, bạn có thể sử dụng Trình soạn thảo để xử lý các phụ thuộc PEAR của mình. Ví dụ này sẽ cài đặt mã từ

brew unlink php
brew link --overwrite php@8.0
36

brew unlink php
brew link --overwrite php@8.0
9

Phần đầu tiên

brew unlink php
brew link --overwrite php@8.0
37 sẽ được sử dụng để cho Composer biết nó nên “khởi tạo” [hoặc “khám phá” theo thuật ngữ PEAR] repo lê. Sau đó, phần
brew unlink php
brew link --overwrite php@8.0
38 sẽ thêm tiền tố vào tên gói như thế nà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 php@8.0
6
brew unlink php
brew link --overwrite php@8.0
39 phương pháp xuất xưởng hoặc thực hiện
brew unlink php
brew link --overwrite php@8.0
40 để lấy ngày giờ hiện tại. Sử dụng phương pháp
brew unlink php
brew link --overwrite php@8.0
41 để chuyển đổi DateTime trở lại chuỗi cho đầu ra

brew unlink php
brew link --overwrite php@8.1
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 php@8.0
42 và
brew unlink php
brew link --overwrite php@8.0
43 lấy DateInterval làm đối số. Không viết mã có cùng số giây mỗi ngày. Both daylight saving and time zone alterations will break that assumption. Thay vào đó hãy sử dụng khoảng thời gian ngày. Để tính chênh lệch ngày, hãy sử dụng phương pháp
brew unlink php
brew link --overwrite php@8.0
44. Nó sẽ trả về DateInterval mới, rất dễ hiển thị

brew unlink php
brew link --overwrite php@8.1
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 php@8.0
6
brew unlink php
brew link --overwrite php@8.0
45
brew unlink php
brew link --overwrite php@8.0
46 và
brew unlink php
brew link --overwrite php@8.0
47, cần được xem xét đặc biệt. Các chức năng này thường có một đối tác
brew unlink php
brew link --overwrite php@8.0
48. ví dụ:
brew unlink php
brew link --overwrite php@8.0
49 và
brew unlink php
brew link --overwrite php@8.0
50. Các chuỗi
brew unlink php
brew link --overwrite php@8.0
48 này được cung cấp cho bạn thông qua Tiện ích mở rộng chuỗi nhiều byte và được thiết kế đặc biệt để hoạt động trên các chuỗi Unicode

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

brew unlink php
brew link --overwrite php@8.0
48 bất cứ khi nào bạn thao tác trên chuỗi Unicode. Ví dụ: nếu bạn sử dụng
brew unlink php
brew link --overwrite php@8.0
53 trên chuỗi UTF-8, rất có thể kết quả sẽ bao gồm một số nửa ký tự bị cắt xén. Hàm chính xác để sử dụng sẽ là đối tác nhiều byte,
brew unlink php
brew link --overwrite php@8.0
54

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

brew unlink php
brew link --overwrite php@8.0
48. Nếu bạn quên dù chỉ một lần, chuỗi Unicode của bạn có khả năng bị cắt xén trong quá trình xử lý tiếp 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 php@8.0
48. Nếu không có cái nào 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 php@8.0
57 ở đầu mỗi tập lệnh PHP mà bạn viết [hoặc ở đầu tập lệnh bao gồm toàn cầu của bạn] và hàm
brew unlink php
brew link --overwrite php@8.0
58 ngay sau nó nếu tập lệnh của bạn xuất ra trình duyệt. Việc xác định rõ ràng mã hóa các chuỗi của bạn trong mọi tập lệnh sẽ giúp bạn đỡ phải đau đầu hơn rất nhiề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 php@8.0
59 có tùy chọn mã hóa ký tự và bạn phải luôn chỉ định UTF-8 nếu xử lý các chuỗi như vậy. Lưu ý rằng kể từ PHP 5. 4. 0, UTF-8 là mã hóa mặc định cho
brew unlink php
brew link --overwrite php@8.0
59 và
brew unlink php
brew link --overwrite php@8.0
61

Cuối cùng, nếu bạn đang xây dựng một ứng dụng phân tán và không thể chắc chắn rằng tiện ích mở rộng

brew unlink php
brew link --overwrite php@8.0
62 sẽ được kích hoạt, thì hãy cân nhắc sử dụng gói symfony/polyfill-mbstring Composer. Điều này sẽ sử dụng
brew unlink php
brew link --overwrite php@8.0
62 nếu 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

If your PHP script accesses MySQL, there’s a chance your strings could be stored as non-UTF-8 strings in the database even if you follow all of the precautions above

To make sure your strings go from PHP to MySQL as UTF-8, make sure your database and tables are all set to the

brew unlink php
brew link --overwrite php@8.0
64 character set and collation, and that you use the
brew unlink php
brew link --overwrite php@8.0
64 character set in the PDO connection string. 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 php@8.0
64 để hỗ trợ UTF-8 hoàn chỉnh, không phải bộ ký tự
brew unlink php
brew link --overwrite php@8.0
67. Xem phần Đọc thêm để biết tại sao

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

Sử dụng hàm

brew unlink php
brew link --overwrite php@8.0
58 để đảm bảo rằng tập lệnh PHP của bạn xuất ra các chuỗi UTF-8 cho trình duyệt của bạ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 php@8.0
6
brew unlink php
brew link --overwrite php@8.0
69 trong thẻ trang của bạn

brew unlink php
brew link --overwrite php@8.1
6

đọc thêm

brew unlink php
brew link --overwrite php@8.0
70. Nó có từ năm 1995 và vẫn là một triển khai hoàn chỉnh để dịch phần mềm. Thật dễ dàng để chạy, trong khi vẫn có các công cụ hỗ trợ mạnh mẽ. Đó là về Gettext chúng ta sẽ nói ở đây. Ngoài ra, để giúp bạn không 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 các đị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 php@8.0
    
    71 [bao gồm cả tin nhắn số nhiều]
  • oscarotero/Gettext. Hỗ trợ gettext với giao diện OO; . Có thể hữu ích nếu bạn cần tích hợp các tệp dịch của mình vào các phần khác của hệ thống, chẳng hạn như giao diện JavaScript
  • symfony/bản dịch. hỗ trợ rất nhiều định dạng khác nhau, nhưng khuyên bạn nên sử dụng XLIFF dài dòng. Không bao gồm các chức năng của trình trợ giúp cũng như trình trích xuất tích hợp, nhưng hỗ trợ trình giữ chỗ bằng cách sử dụng nội bộ
    brew unlink php
    brew link --overwrite php@8.0
    
    74
  • laminas/laminas-i18n. hỗ trợ các tệp mảng và INI hoặc định dạng Gettext. Triển khai một lớp bộ nhớ đệm để giúp bạn không phải đọc hệ thống tệp mỗi lần. Nó cũng bao gồm các trình trợ giúp chế độ xem cũng như các trình xác thực và bộ lọc đầu vào nhận biết ngôn ngữ. Tuy nhiên, nó không có trình trích xuất tin nhắn

Các khung khác cũng bao gồm các mô-đun i18n, nhưng chúng không có sẵn bên ngoài cơ sở mã của chúng

  • Laravel hỗ trợ các tệp mảng cơ bản, không có trình trích xuất tự động nhưng bao gồm trình trợ giúp
    brew unlink php
    brew link --overwrite php@8.0
    
    75 cho các tệp mẫu
  • Yii hỗ trợ dịch mảng, Gettext và dựa trên cơ sở dữ liệu, đồng thời bao gồm một trình trích xuất thông báo. Nó được hỗ trợ bởi tiện ích mở rộng
    brew unlink php
    brew link --overwrite php@8.0
    
    76, có sẵn kể từ PHP 5. 3, và dựa trên dự án ICU;

Nếu bạn quyết định sử dụng một trong những thư viện không cung cấp trình trích xuất, bạn có thể muốn sử dụng các định dạng gettext, vì vậy bạn có thể sử dụng chuỗi công cụ gettext gốc [bao gồm cả Poedit] như được mô tả trong phần còn lại của chương

Nhận văn bản

Cài đặt

Bạn có thể cần cài đặt Gettext và thư viện PHP có liên quan bằng cách sử dụng trình quản lý gói của mình, như

brew unlink php
brew link --overwrite php@8.0
77 hoặc
brew unlink php
brew link --overwrite php@8.0
78. Sau khi cài đặt, hãy kích hoạt nó bằng cách thêm
brew unlink php
brew link --overwrite php@8.0
79 [Linux/Unix] hoặc
brew unlink php
brew link --overwrite php@8.0
80 [Windows] vào
brew unlink php
brew link --overwrite php@8.0
81 của bạn

Ở đây chúng tôi cũng sẽ sử dụng Poedit để tạo tệp dịch. Bạn có thể sẽ tìm thấy nó trong trình quản lý gói của hệ thống;

Cấu trúc

Các loại tệp

Có ba tệp bạn thường xử lý khi làm việc với gettext. Các tệp chính là các tệp PO [Đối tượng di động] và MO [Đối tượng máy], tệp đầu tiên là danh sách các “đối tượng được dịch” có thể đọc được và tệp thứ hai, tệp nhị phân tương ứng được gettext giải thích khi thực hiện bản địa hóa. Ngoài ra còn có một tệp POT [Mẫu], chỉ chứa tất cả các khóa hiện có từ các tệp nguồn của bạn và có thể được sử dụng làm hướng dẫn để tạo và cập nhật tất cả các tệp PO. Các tệp mẫu đó không bắt buộc. tùy thuộc vào công cụ bạn đang sử dụng để thực hiện l10n, bạn có thể thực hiện tốt chỉ với các tệp PO/MO. You will always have one pair of PO/MO files per language and region, but only one POT per domain

tên miền

Có một số trường hợp, trong các dự án lớn, bạn có thể cần phải tách các bản dịch khi cùng một từ truyền đạt ý nghĩa khác nhau tùy theo ngữ cảnh. Trong những trường hợp đó, bạn chia chúng thành các miền khác nhau. Về cơ bản, chúng là các nhóm tệp POT/PO/MO được đặt tên, trong đó tên tệp là miền dịch đã nói. Các dự án vừa và nhỏ thường chỉ sử dụng một miền để đơn giản; . Ví dụ, trong các dự án Symfony, các miền được sử dụng để phân tách bản dịch cho các thông báo xác thực

mã địa phương

Ngôn ngữ chỉ đơn giản là một mã xác định một phiên bản của ngôn ngữ. Nó được xác định theo thông số kỹ thuật ISO 639-1 và ISO 3166-1 alpha-2. hai chữ cái viết thường cho ngôn ngữ, tùy chọn theo sau là gạch dưới và hai chữ cái viết hoa xác định quốc gia hoặc mã vùng. Đối với các ngôn ngữ hiếm, ba chữ cái được sử dụng

Đối với một số người nói, phần quốc gia có vẻ dư thừa. Trên thực tế, một số ngôn ngữ có phương ngữ ở các quốc gia khác nhau, chẳng hạn như tiếng Đức gốc Áo [

brew unlink php
brew link --overwrite php@8.0
82] hoặc tiếng Bồ Đào Nha Brazil [
brew unlink php
brew link --overwrite php@8.0
83]. Phần thứ hai được sử dụng để phân biệt giữa các phương ngữ đó - khi nó không có mặt, nó được coi là phiên bản “chung” hoặc “lai” của ngôn ngữ

Cấu trúc thư mục

Để sử dụng Gettext, chúng ta cần tuân theo một cấu trúc thư mục cụ thể. Trước tiên, bạn sẽ cần chọn một gốc tùy ý cho các tệp l10n trong kho lưu trữ nguồn của mình. Bên trong nó, bạn sẽ có một thư mục cho từng ngôn ngữ cần thiết và một thư mục

brew unlink php
brew link --overwrite php@8.0
84 cố định sẽ chứa tất cả các cặp PO/MO của bạn. Ví dụ

brew unlink php
brew link --overwrite php@8.1
7

Hình thức số nhiều

Như chúng tôi đã nói trong phần giới thiệu, các ngôn ngữ khác nhau có thể áp dụng các quy tắc số nhiều khác nhau. Tuy nhiên, gettext cứu chúng ta khỏi rắc rối này một lần nữa. Khi tạo tệp

brew unlink php
brew link --overwrite php@8.0
85 mới, bạn sẽ phải khai báo các quy tắc số nhiều cho ngôn ngữ đó và các phần đã dịch nhạy cảm với số nhiều sẽ có dạng khác nhau cho từng quy tắc đó. Khi gọi Gettext trong mã, bạn sẽ phải chỉ định số liên quan đến câu và nó sẽ tìm ra dạng chính xác để sử dụng - thậm chí sử dụng thay thế chuỗi nếu cần

Quy tắc số nhiều bao gồm số lượng số nhiều có sẵn và phép thử boolean với

brew unlink php
brew link --overwrite php@8.0
86 sẽ xác định số đã cho rơi vào quy tắc nào [bắt đầu đếm bằng 0]. Ví dụ

  • tiếng Nhật.
    brew unlink php
    brew link --overwrite php@8.0
    
    87 - chỉ có một quy tắc
  • Tiếng Anh.
    brew unlink php
    brew link --overwrite php@8.0
    
    88 - hai quy tắc, quy tắc thứ nhất nếu N là một, quy tắc thứ hai ngược lại
  • tiếng Bồ Đào Nha của người brazi.
    brew unlink php
    brew link --overwrite php@8.0
    
    89 - hai quy tắc, thứ hai nếu N lớn hơn một, thứ nhất nếu không

Bây giờ bạn đã hiểu cơ sở về cách thức hoạt động của các quy tắc số nhiều - và nếu bạn chưa hiểu, vui lòng xem phần giải thích sâu hơn về hướng dẫn LingoHub -, bạn có thể muốn sao chép những cái bạn cần từ danh sách thay vì viết chúng bằng tay

Khi gọi Gettext để bản địa hóa các câu có bộ đếm, bạn cũng sẽ phải cung cấp cho nó số liên quan. Gettext sẽ tìm ra quy tắc nào sẽ có hiệu lực và sử dụng đúng phiên bản đã bản địa hóa. Bạn sẽ cần đưa vào tệp

brew unlink php
brew link --overwrite php@8.0
85 một câu khác cho mỗi quy tắc số nhiều được xác định

triển khai mẫu

Sau tất cả những lý thuyết đó, chúng ta hãy thực hành một chút. Đây là đoạn trích của tệp

brew unlink php
brew link --overwrite php@8.0
85 - đừng bận tâm đến định dạng của nó, thay vào đó hãy quan tâm đến nội dung tổng thể;

brew unlink php
brew link --overwrite php@8.1
8

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

brew unlink php
brew link --overwrite php@8.0
92 và
brew unlink php
brew link --overwrite php@8.0
93 đặc biệt trống. Nó mô tả mã hóa tệp, dạng số nhiều và những thứ khác ít liên quan hơn. Phần thứ hai dịch một chuỗi đơn giản từ tiếng Anh sang tiếng Bồ Đào Nha Brazil và phần thứ ba thực hiện tương tự, nhưng tận dụng thay thế chuỗi từ
brew unlink php
brew link --overwrite php@8.0
94 để bản dịch có thể chứa tên người dùng và ngày truy cập. Phần cuối cùng là một mẫu các dạng số nhiều, hiển thị phiên bản số ít và số nhiều là
brew unlink php
brew link --overwrite php@8.0
92 trong tiếng Anh và các bản dịch tương ứng của chúng là
brew unlink php
brew link --overwrite php@8.0
93 0 và 1 [theo số được đưa ra bởi quy tắc số nhiều]. Ở đó, thay thế chuỗi cũng được sử dụng để số có thể được nhìn thấy trực tiếp trong câu, bằng cách sử dụng
brew unlink php
brew link --overwrite php@8.0
97. Dạng số nhiều luôn có hai
brew unlink php
brew link --overwrite php@8.0
92 [số ít và số nhiều], vì vậy không nên sử dụng ngôn ngữ phức tạp làm nguồn dịch

Thảo luận về phím l10n

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

brew unlink php
brew link --overwrite php@8.0
92 đó được sử dụng giống nhau trong tất cả các tệp
brew unlink php
brew link --overwrite php@8.0
85 của bạn, nghĩa là các ngôn ngữ khác sẽ có cùng định dạng và cùng các trường
brew unlink php
brew link --overwrite php@8.0
92 nhưng đã dịch các dòng
brew unlink php
brew link --overwrite php@8.0
93

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

  1. brew unlink php
    brew link --overwrite php@8.0
    
    92 như một câu thực. Những lợi thế chính là
    • nếu có các phần của phần mềm chưa được dịch sang bất kỳ ngôn ngữ cụ thể nào, khóa được hiển thị sẽ vẫn giữ một số ý nghĩa. Ví dụ. nếu bạn tình cờ dịch thuộc lòng từ tiếng Anh sang tiếng Tây Ban Nha nhưng cần trợ giúp để dịch sang tiếng Pháp, bạn có thể xuất bản trang mới thiếu các câu tiếng Pháp và thay vào đó, các phần của trang web sẽ được hiển thị bằng tiếng Anh;
    • người dịch sẽ dễ dàng hiểu những gì đang diễn ra hơn và thực hiện một bản dịch phù hợp dựa trên
      brew unlink php
      brew link --overwrite php@8.0
      
      92;
    • nó cung cấp cho bạn l10n “miễn phí” cho một ngôn ngữ - ngôn ngữ nguồn;
    • Nhược điểm duy nhất. nếu bạn cần thay đổi văn bản thực tế, bạn sẽ cần thay thế cùng một
      brew unlink php
      brew link --overwrite php@8.0
      
      92 trên một số tệp ngôn ngữ
  2. brew unlink php
    brew link --overwrite php@8.0
    
    92 dưới dạng khóa có cấu trúc, duy nhất. Nó sẽ mô tả vai trò của câu trong ứng dụng theo cách có cấu trúc, bao gồm mẫu hoặc phần chứa chuỗi thay vì nội dung của nó
    • đó là một cách tuyệt vời để sắp xếp mã, tách nội dung văn bản khỏi logic mẫu
    • tuy nhiên, điều đó có thể gây ra vấn đề cho người dịch sẽ bỏ sót ngữ cảnh. Cần có tệp ngôn ngữ nguồn để làm cơ sở cho các bản dịch khác. Ví dụ. lý tưởng nhất là nhà phát triển sẽ có một tệp
      brew unlink php
      brew link --overwrite php@8.1
      
      07, chẳng hạn như người dịch sẽ đọc để hiểu những gì cần viết trong
      brew unlink php
      brew link --overwrite php@8.1
      
      08
    • bản dịch bị thiếu sẽ hiển thị các phím vô nghĩa trên màn hình [
      brew unlink php
      brew link --overwrite php@8.1
      
      09 thay vì
      brew unlink php
      brew link --overwrite php@8.1
      
      10 trên trang tiếng Pháp chưa được dịch nói trên]. Điều đó tốt vì nó sẽ buộc bản dịch phải hoàn thành trước khi xuất bản - tuy nhiên, thật tệ vì các vấn đề dịch thuật sẽ cực kỳ khủng khiếp trong giao diện. Tuy nhiên, một số thư viện bao gồm một tùy chọn để chỉ định một ngôn ngữ nhất định là "dự phòng", có hành vi tương tự như cách tiếp cận khác

Hướng dẫn sử dụng Gettext ủng hộ cách tiếp cận đầu tiên vì nói chung, nó dễ dàng hơn cho người dịch và người dùng trong trường hợp gặp sự cố. Đó là cách chúng tôi sẽ làm việc ở đây. Tuy nhiên, tài liệu Symfony ưu tiên dịch thuật dựa trên từ khóa, để cho phép thay đổi độc lập tất cả các bản dịch mà không ảnh hưởng đến các mẫu

sử dụng hàng ngày

Trong một ứng dụng điển hình, bạn sẽ sử dụng một số chức năng Gettext khi viết văn bản tĩnh trong các trang của mình. Những câu đó sau đó sẽ xuất hiện trong tệp

brew unlink php
brew link --overwrite php@8.0
85, được dịch, biên dịch thành tệp
brew unlink php
brew link --overwrite php@8.1
12 và sau đó, được sử dụng bởi Gettext khi kết xuất giao diện thực tế. Vì vậy, hãy kết hợp những gì chúng ta đã thảo luận cho đến nay trong một ví dụ từng bước

1. Tệp mẫu mẫu, bao gồm một số lệnh gọi gettext khác nhau

brew unlink php
brew link --overwrite php@8.1
9
  • brew unlink php
    brew link --overwrite php@8.1
    
    13 chỉ cần dịch một
    brew unlink php
    brew link --overwrite php@8.0
    
    92 thành
    brew unlink php
    brew link --overwrite php@8.0
    
    93 tương ứng của nó cho một ngôn ngữ nhất định. Ngoài ra còn có hàm tốc ký
    brew unlink php
    brew link --overwrite php@8.1
    
    16 hoạt động theo cách tương tự;
  • brew unlink php
    brew link --overwrite php@8.1
    
    17 làm tương tự nhưng với quy tắc số nhiều;
  • Ngoài ra còn có
    brew unlink php
    brew link --overwrite php@8.1
    
    18 và
    brew unlink php
    brew link --overwrite php@8.1
    
    19, cho phép bạn ghi đè tên miền cho một cuộc gọi. Thông tin thêm về cấu hình miền trong ví dụ tiếp theo

2. Tệp thiết lập mẫu [
brew unlink php
brew link --overwrite php@8.1
20 như được sử dụng ở trên], chọn đúng ngôn ngữ và định cấu hình Gettext

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

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

Một trong những lợi thế lớn của Gettext so với các gói i18n khung tùy chỉnh là định dạng tệp mở rộng và mạnh mẽ của nó. “Ôi trời, hơi khó hiểu và chỉnh sửa bằng tay, một mảng đơn giản sẽ dễ dàng hơn. ” Đừng nhầm lẫn, các ứng dụng như Poedit luôn sẵn sàng trợ giúp - rất nhiều. Bạn có thể lấy chương trình từ trang web của họ, nó miễn phí và có sẵn cho tất cả các nền tảng. Đây là một công cụ khá dễ làm quen và đồng thời là một công cụ rất mạnh - sử dụng tất cả các tính năng mà Gettext có sẵn. Hướng dẫn này dựa trên PoEdit 1. 8

Trong lần chạy đầu tiên, bạn nên chọn “File > New…” từ menu. Bạn sẽ được hỏi thẳng về ngôn ngữ. tại đây bạn có thể chọn/lọc ngôn ngữ bạn muốn dịch sang hoặc sử dụng định dạng mà chúng tôi đã đề cập trước đó, chẳng hạn như

brew unlink php
brew link --overwrite php@8.1
21 hoặc
brew unlink php
brew link --overwrite php@8.0
83

Bây giờ, hãy lưu tệp - cũng sử dụng cấu trúc thư mục mà chúng tôi đã đề cập. Sau đó, bạn nên nhấp vào "Trích xuất từ ​​​​các nguồn" và tại đây, bạn sẽ định cấu hình các cài đặt khác nhau cho các tác vụ trích xuất và dịch thuật. You’ll be able to find all those later through “Catalog > Properties”

  • Đường dẫn nguồn. ở đây bạn phải bao gồm tất cả các thư mục từ dự án có tên là
    brew unlink php
    brew link --overwrite php@8.1
    
    13 [và các anh chị em] - đây thường là [các] thư mục mẫu/lượt xem của bạn. Đây là cài đặt bắt buộc duy nhất;
  • Thuộc tính dịch
    • Tên và phiên bản dự án, Nhóm và địa chỉ email của Nhóm. thông tin hữu ích đi vào. tiêu đề tệp po;
    • Hình thức số nhiều. đây là những quy tắc mà chúng tôi đã đề cập trước đây - có một liên kết trong đó với các mẫu. Hầu hết thời gian, bạn có thể để nó với tùy chọn mặc định, vì PoEdit đã bao gồm một cơ sở dữ liệu tiện dụng gồm các quy tắc số nhiều cho nhiều ngôn ngữ
    • bộ ký tự. UTF-8, tốt nhất là;
    • Bộ ký tự mã nguồn. đặt ở đây bộ ký tự được sử dụng bởi cơ sở mã của bạn - có thể là cả UTF-8, phải không?
  • Source keywords. Phần mềm cơ bản biết cách gọi hàm
    brew unlink php
    brew link --overwrite php@8.1
    
    13 và tương tự trong một số ngôn ngữ lập trình, nhưng bạn cũng có thể tạo các hàm dịch của riêng mình. Nó sẽ ở đây bạn sẽ thêm các phương pháp khác. Điều này sẽ được thảo luận sau trong phần “Mẹo”

Sau khi thiết lập các điểm đó, nó sẽ chạy quét qua các tệp nguồn của bạn để tìm tất cả các cuộc gọi bản địa hóa. 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. Lưu nó và một. 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 php@8.1
25], you might face issues with the
brew unlink php
brew link --overwrite php@8.1
12 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 php@8.1
16 instead of
brew unlink php
brew link --overwrite php@8.1
13. Many custom i18n libraries from frameworks use something similar to
brew unlink php
brew link --overwrite php@8.1
29 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 php@8.1
30 or
brew unlink php
brew link --overwrite php@8.1
31 for
brew unlink php
brew link --overwrite php@8.1
17, or maybe a fancy
brew unlink php
brew link --overwrite php@8.1
33 that would join
brew unlink php
brew link --overwrite php@8.1
13 and
brew unlink php
brew link --overwrite php@8.1
35 calls. Other libraries, such as oscarotero’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. Don’t be afraid; it is very easy. It is just a field in the

brew unlink php
brew link --overwrite php@8.0
85 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 a specific format

  • if you create something like
    brew unlink php
    brew link --overwrite php@8.1
    
    29 that simply returns the translation for a string, you can specify it as
    brew unlink php
    brew link --overwrite php@8.1
    
    38. 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 php@8.1
    
    39, the specification would be
    brew unlink php
    brew link --overwrite php@8.1
    
    40, 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 php@8.1
    
    41, indicating the first form is the second argument, and so on

After including those new rules in the

brew unlink php
brew link --overwrite php@8.0
85 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 php@8.1
43 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 php@8.1
43 class is very tightly coupled to the adapter

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

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

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

Now we are giving the

brew unlink php
brew link --overwrite php@8.1
43 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 php@8.1
46 property was
brew unlink php
brew link --overwrite php@8.1
47 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 php@8.1
48 interface which defines an
brew unlink php
brew link --overwrite php@8.1
49 method, and we have
brew unlink php
brew link --overwrite php@8.1
50 and
brew unlink php
brew link --overwrite php@8.1
51 classes which both implement the
brew unlink php
brew link --overwrite php@8.1
48 interface, then we can expect that the usage of the
brew unlink php
brew link --overwrite php@8.1
49 method will always do the thing that we intend. If we later create a
brew unlink php
brew link --overwrite php@8.1
54 class or a
brew unlink php
brew link --overwrite php@8.1
55 class which implement the
brew unlink php
brew link --overwrite php@8.1
48 interface, we will already know and understand what the
brew unlink php
brew link --overwrite php@8.1
49 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 php@8.1
48] 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 php@8.1
59 or
brew unlink php
brew link --overwrite php@8.1
60 class would be interested in a
brew unlink php
brew link --overwrite php@8.1
61 method, but a
brew unlink php
brew link --overwrite php@8.1
62 or
brew unlink php
brew link --overwrite php@8.1
63 class would not. Conversely, a
brew unlink php
brew link --overwrite php@8.1
62 or
brew unlink php
brew link --overwrite php@8.1
63 class would be interested in a
brew unlink php
brew link --overwrite php@8.1
66 method, but a
brew unlink php
brew link --overwrite php@8.1
59 or
brew unlink php
brew link --overwrite php@8.1
60 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 php@8.1
61 as well as
brew unlink php
brew link --overwrite php@8.1
66, so we should break-apart the source interface

Nguyên tắc đảo ngược phụ thuộc

The Dependency Inversion Principle is about removing hard-links between discrete classes so that new functionality can be leveraged by passing a different class. Nó nói rằng một người nên “Phụ thuộc vào Trừu tượng. Do not depend on concretions. ”. Nói một cách đơn giản, điều này có nghĩa là các phần phụ thuộc của chúng ta phải là các giao diện/hợp đồng hoặc các lớp trừu tượng thay vì các triển khai cụ thể. Chúng ta có thể dễ dàng cấu trúc lại ví dụ trên để tuân theo nguyên tắc này

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

There are several benefits to the

brew unlink php
brew link --overwrite php@8.1
43 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. What this means in practice is that you can write application code that is as clean and de-coupled as the framework it is built on

Further Reading

Many times your PHP code will use a database to persist information. You have a few options to connect and interact with your database. The recommended option until 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 was deprecated as of PHP 5. 5. 0, and has been officially removed in PHP 7. 0

To save digging into your

brew unlink php
brew link --overwrite php@8.0
81 settings to see which module you are using, one option is to search for
brew unlink php
brew link --overwrite php@8.1
73 in your editor of choice. If any functions such as
brew unlink php
brew link --overwrite php@8.1
74 and
brew unlink php
brew link --overwrite php@8.1
75 show up, then
brew unlink php
brew link --overwrite php@8.1
76 is in use

Even if you are not using PHP 7. x yet, failing to consider this upgrade as soon as possible will lead to greater hardship when the PHP 7. x 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 php@8.1
73 with
brew unlink php
brew link --overwrite php@8.1
78. 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

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

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 php@8.1
79 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 php@8.1
80 way to do this

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

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 php@8.1
81 parameter by calling a URL like
brew unlink php
brew link --overwrite php@8.1
82. This will set the
brew unlink php
brew link --overwrite php@8.1
83 variable to
brew unlink php
brew link --overwrite php@8.1
84 which will delete all of your users. Instead, you should sanitize the ID input using PDO bound parameters

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

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 filter your data 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

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

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 OOP or functional programming - there must be some element of separation

Consider the most basic step

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

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 php@8.1
85 file to put the presentation logic in and you have a “View”, which is very nearly MVC - a common OOP architecture for most frameworks

foo. php

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

models/FooModel. php

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

views/foo-list. php

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

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 unit-test 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 model–view–controller [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

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

Example of plain PHP templates using inheritance

Using the Plates library

phpcbf -w --standard=PSR1 file.php
73
phpcbf -w --standard=PSR1 file.php
74

Compiled Templates

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

Simple example of a compiled template

Using the Twig library

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

Example of compiled templates using inheritance

Using the Twig library

phpcbf -w --standard=PSR1 file.php
76
phpcbf -w --standard=PSR1 file.php
77

Further Reading

Articles & Tutorials

Libraries

Errors

In many “exception-heavy” programming languages, whenever anything goes wrong an exception will be thrown. This is certainly a viable way to do things, but PHP is an “exception-light” programming language. While it does have exceptions and more of the core is starting to use them when working with objects, most of PHP itself will try to keep processing regardless of what happens, unless a fatal error occurs

For example

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

This is only a notice error, and PHP will happily carry on. This can be confusing for those coming from “exception-heavy” languages, because referencing a missing variable in Python for example will throw an exception

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

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 php@8.1
86,
brew unlink php
brew link --overwrite php@8.1
87, and
brew unlink php
brew link --overwrite php@8.1
88. 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 php@8.1
89 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 php@8.1
90 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 php@8.0
6
brew unlink php
brew link --overwrite php@8.1
91. 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 php@8.0
6
brew unlink php
brew link --overwrite php@8.1
92 if it exists, but will simply return a null and print nothing if the variable
brew unlink php
brew link --overwrite php@8.1
93 or
brew unlink php
brew link --overwrite php@8.1
94 key does not exist. Without the error control operator, this expression could create a
brew unlink php
brew link --overwrite php@8.1
95 or
brew unlink php
brew link --overwrite php@8.1
96 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 php@8.1
97 in a less performant way than expressions without an
brew unlink php
brew link --overwrite php@8.1
97. 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 php@8.0
6
brew unlink php
brew link --overwrite php@8.1
99 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
phpcbf -w --standard=PSR1 file.php
500 [which might sound impossible, but it can happen] then
phpcbf -w --standard=PSR1 file.php
500 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

phpcbf -w --standard=PSR1 file.php
502 ini setting which will disable the error control operator. You can set this via your
brew unlink php
brew link --overwrite php@8.0
81 file with the following

brew unlink php
brew link --overwrite php@8.0
33

You can also set this value at runtime with the

phpcbf -w --standard=PSR1 file.php
504 function

brew unlink php
brew link --overwrite php@8.0
6
phpcbf -w --standard=PSR1 file.php
505

This is most useful when you’re debugging code and suspect an informative error is suppressed. Use scream with care, and as a temporary debugging tool. There’s lots of PHP library code that may not work with the error control operator disabled

ErrorException

PHP is perfectly capable of being an “exception-heavy” programming language, and only requires a few lines of code to make the switch. Basically you can throw your “errors” as “exceptions” using the

phpcbf -w --standard=PSR1 file.php
506 class, which extends the
phpcbf -w --standard=PSR1 file.php
507 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

phpcbf -w --standard=PSR1 file.php
506 with error handling can be found at ErrorException Class

phpcbf -w --standard=PSR1 file.php
509 will usually just get you a
phpcbf -w --standard=PSR1 file.php
510 and a warning. 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
phpcbf -w --standard=PSR1 file.php
511 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

brew unlink php
brew link --overwrite php@8.0
35

SPL Exceptions

The generic

phpcbf -w --standard=PSR1 file.php
507 class provides very little debugging context for the developer; however, to remedy this, it is possible to create a specialized
phpcbf -w --standard=PSR1 file.php
507 type by sub-classing the generic
phpcbf -w --standard=PSR1 file.php
507 class

brew unlink php
brew link --overwrite php@8.0
6
brew unlink php
brew link --overwrite php@8.1
70
phpcbf -w --standard=PSR1 file.php
517

In PHP 5. 5

phpcbf -w --standard=PSR1 file.php
518 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
phpcbf -w --standard=PSR1 file.php
519 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 php@8.0
6
brew unlink php
brew link --overwrite php@8.1
71
phpcbf -w --standard=PSR1 file.php
522 and
phpcbf -w --standard=PSR1 file.php
523 functions can sanitize text and validate text formats [e. g. email addresses]

Foreign input can be anything.

phpcbf -w --standard=PSR1 file.php
524 and
phpcbf -w --standard=PSR1 file.php
525 form input data, some values in the
phpcbf -w --standard=PSR1 file.php
526 superglobal, and the HTTP request body via
phpcbf -w --standard=PSR1 file.php
527. 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

phpcbf -w --standard=PSR1 file.php
528 function or escaping characters with special meaning into their respective HTML entities with the
brew unlink php
brew link --overwrite php@8.0
59 or
brew unlink php
brew link --overwrite php@8.0
61 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

phpcbf -w --standard=PSR1 file.php
531 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

phpcbf -w --standard=PSR1 file.php
532,
phpcbf -w --standard=PSR1 file.php
533, 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 PDO, 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. Điều này rất khó thực hiện và nhiều người tránh nó bằng cách sử dụng các định dạng hạn chế khác như Markdown hoặc BBCode, mặc dù các thư viện danh sách trắng như HTML Purifier tồn tại vì lý do này

See Sanitization Filters

Unserialization

It is dangerous to

phpcbf -w --standard=PSR1 file.php
534 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

phpcbf -w --standard=PSR1 file.php
535 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 php@8.1
    
    85 extension. This ensures that, even if the script is accessed directly, it will not be output as plain text
  • Information in configuration files should be protected accordingly, either through encryption or group/user file system permissions
  • Bạn nên đảm bảo rằng mình không chuyển giao các tệp cấu hình có chứa thông tin nhạy cảm. g. mật khẩu hoặc mã thông báo API để kiểm soát nguồn

Đăng ký toàn cầu

GHI CHÚ. Kể từ PHP 5. 4. 0 the

phpcbf -w --standard=PSR1 file.php
537 setting has been removed and can no longer be used. This is only included as a warning for anyone in the process of upgrading a legacy application

When enabled, the

phpcbf -w --standard=PSR1 file.php
537 configuration setting makes several types of variables [including ones from
phpcbf -w --standard=PSR1 file.php
525,
phpcbf -w --standard=PSR1 file.php
524 and
phpcbf -w --standard=PSR1 file.php
541] available in the global scope of your application. Đ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ụ.

phpcbf -w --standard=PSR1 file.php
542 sẽ khả dụng qua
brew unlink php
brew link --overwrite php@8.1
93, có thể ghi đè các biến đã được khai báo

Nếu bạn đang sử dụng PHP 5. 3

phpcbf -w --standard=PSR1 file.php
546 or
phpcbf -w --standard=PSR1 file.php
547

Production

To hide errors on your production environment, configure your

brew unlink php
brew link --overwrite php@8.0
81 as

brew unlink php
brew link --overwrite php@8.0
39

With these settings in production, errors will still be logged to the error logs for the web server, but will not be shown to the user. For more information on these settings, see the PHP manual

Writing automated tests for your PHP code is considered a best practice and can lead to well-built applications. Automated tests are a great tool for making sure your application does not break when you are making changes or adding new functionality and should not be ignored

There are several different types of testing tools [or frameworks] available for PHP, which use different approaches - all of which are trying to avoid manual testing and the need for large Quality Assurance teams, just to make sure recent changes didn’t break existing functionality

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 một 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

Unit Testing

Unit Testing is a programming approach to ensure functions, classes and methods are working as expected, from the point you build them all the way through the development cycle. By checking values going in and out of various functions and methods, you can make sure the internal logic is working correctly. By using Dependency Injection and building “mock” classes and stubs you can verify that dependencies are correctly used for even better test coverage

When you create a class or function you should create a unit test for each behavior it must have. At a very basic level you should make sure it errors if you send it bad arguments and make sure it works if you send it valid arguments. This will help ensure that when you make changes to this class or function later on in the development cycle that the old functionality continues to work as expected. Giải pháp thay thế duy nhất cho điều này sẽ là

brew unlink php
brew link --overwrite php@8.1
67 trong một bài kiểm tra. php, đây không phải là cách để xây dựng một ứng dụng - dù lớn hay nhỏ

Việc sử dụng khác cho các bài kiểm tra đơn vị là đóng góp cho nguồn mở. Nếu bạn có thể viết một bài kiểm tra cho thấy chức năng bị hỏng [tôi. e. không thành công], sau đó sửa nó và cho thấy bài kiểm tra đã vượt qua, các bản vá có nhiều khả năng được chấp nhận hơn. Nếu bạn chạy một dự án chấp nhận các yêu cầu kéo thì bạn nên đề xuất đây là một yêu cầu

PHPUnit là khung thử nghiệm thực tế để viết các bài kiểm tra đơn vị cho các ứng dụng PHP, nhưng có một số lựa chọn thay thế

Thử nghiệm hội nhập

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. Kiểm thử tích hợp lấy các mô-đun đầu vào đã được kiểm thử đơn vị, nhóm chúng thành các tập hợp lớn hơn, áp dụng các kiểm thử được xác định trong kế hoạch kiểm thử tích hợp cho các tập hợp đó và cung cấp đầu ra là hệ thống tích hợp sẵn sàng cho kiểm thử 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

Sometimes also known as acceptance testing, functional testing consists of using tools to create automated tests that actually use your application instead of just verifying that individual units of code are behaving correctly and that individual units can speak to each other correctly. Các công cụ này thường hoạt động bằng cách sử dụng dữ liệu thực và mô phỏng người dùng thực của ứng dụng

Công cụ kiểm tra chức năng

  • selen
  • chồn
  • Codeception là một khung thử nghiệm toàn ngăn xếp bao gồm các công cụ thử nghiệm chấp nhận
  • Storyplayer là một khung thử nghiệm toàn ngăn xếp bao gồm hỗ trợ tạo và hủy môi trường thử nghiệm theo yêu cầu

Phát triển hành vi lái xe

There are two different types of Behavior-Driven Development [BDD]. SpecBDD and StoryBDD. SpecBDD focuses on technical behavior of code, while StoryBDD focuses on business or feature behaviors or interactions. PHP has frameworks for both types of 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

With SpecBDD, you write specifications that describe how your actual code should behave. Instead of testing a function or method, you are describing how that function or method should behave. PHP offers the PHPSpec framework for this purpose. 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 is a full-stack testing framework that uses BDD principles

Bên cạnh các khung điều khiển hành vi và thử nghiệm riêng lẻ, còn có một số khung chung và thư viện trợ giúp hữu ích cho bất kỳ phương pháp ưa thích nào được thực hiện

Các ứng dụng PHP có thể được triển khai và chạy trên các máy chủ web sản xuất theo một số cách

Nền tảng dưới dạng Dịch vụ [PaaS]

PaaS cung cấp hệ thống và kiến ​​trúc mạng cần thiết để chạy các ứng dụng PHP trên web. Điều này có nghĩa là ít hoặc không có cấu hình để khởi chạy các ứng dụng PHP hoặc khung công tác PHP

Gần đây PaaS đã trở thành một phương pháp phổ biến để triển khai, lưu trữ và nhân rộng các ứng dụng PHP ở mọi quy mô. Bạn có thể tìm thấy danh sách các nhà cung cấp “Nền tảng như một dịch vụ” PHP PaaS trong phần tài nguyên của chúng tôi

Xây dựng và triển khai ứng dụng của bạn

Nếu bạn thấy mình đang thực hiện các thay đổi lược đồ cơ sở dữ liệu thủ công hoặc chạy thử nghiệm theo cách thủ công trước khi cập nhật tệp của mình [theo cách thủ công], hãy suy nghĩ kỹ. Với mỗi tác vụ thủ công bổ sung cần thiết để triển khai phiên bản mới của ứng dụng, khả năng xảy ra lỗi nghiêm trọng có thể tăng lên. Cho dù bạn đang xử lý một bản cập nhật đơn giản, quy trình xây dựng toàn diện hay thậm chí là chiến lược tích hợp liên tục, tự động hóa bản dựng là bạn của bạn

Trong số các tác vụ bạn có thể muốn tự động hóa là

  • quản lý phụ thuộc
  • Tổng hợp, thu nhỏ tài sản của bạn
  • chạy thử nghiệm
  • Tạo tài liệu
  • bao bì
  • triển khai

Các công cụ triển khai có thể được mô tả như một tập hợp các tập lệnh xử lý các tác vụ phổ biến 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ý quá trình triển khai [triển khai và khôi phục] cho các ứng dụng tập lệnh như PHP, Python và Ruby. Đó là một cổng Ansible cho Capistrano. Nó đã được khá nhiều công ty PHP sử dụng rồi

Rocketeer lấy cảm hứng và triết lý từ Laravel framework. Mục tiêu của nó là nhanh, thanh lịch và dễ sử dụng với các mặc định thông minh. Nó có nhiều máy chủ, nhiều giai đoạn, triển khai nguyên tử và triển khai có thể được thực hiện song song. Mọi thứ trong công cụ đều có thể được hoán đổi hoặc mở rộng nóng và mọi thứ đều được viết bằng PHP

Deployer là một công cụ triển khai được viết bằng PHP. Nó đơn giản và chức năng. Các tính năng bao gồm chạy các tác vụ song song, triển khai nguyên tử và duy trì tính nhất quán giữa các máy chủ. Công thức của các tác vụ phổ biến cho Symfony, Laravel, Zend Framework và Yii có sẵn. Bài viết của Younes Rafie Triển khai dễ dàng các ứng dụng PHP với Deployer là một hướng dẫn tuyệt vời để triển khai ứng dụng của bạn bằng công cụ

Magallanes là một công cụ khác được viết bằng PHP với cấu hình đơn giản được thực hiện trong tệp YAML. Nó có hỗ trợ cho nhiều máy chủ và môi trường, triển khai nguyên tử và có một số tác vụ được tích hợp sẵn mà bạn có thể tận dụng cho các công cụ và khuôn khổ phổ biến

đọc thêm

Cung cấp máy chủ

Quản lý và cấu hình máy chủ có thể là một nhiệm vụ khó khăn khi phải đối mặt với nhiều máy chủ. Có các công cụ để giải quyết vấn đề này để bạn có thể tự động hóa cơ sở hạ tầng của mình nhằm đảm bảo rằng bạn có đúng máy chủ và chúng được định cấu hình đúng cách. Họ thường tích hợp với các nhà cung cấp dịch vụ lưu trữ đám mây lớn hơn [Amazon Web Services, Heroku, DigitalOcean, v.v.] để quản lý các phiên bản, giúp mở rộng ứng dụng dễ dàng hơn rất nhiều

Ansible là một công cụ quản lý cơ sở hạ tầng của bạn thông qua các tệp YAML. Thật đơn giản để bắt đầu và có thể quản lý các ứng dụng quy mô lớn và phức tạp. Có một API để quản lý các phiên bản trên đám mây và nó có thể quản lý chúng thông qua khoảng không quảng cáo động bằng một số công cụ nhất định

Con rối là một công cụ có ngôn ngữ và loại tệp riêng để quản lý máy chủ và cấu hình. Nó có thể được sử dụng trong thiết lập chính/máy khách hoặc nó có thể được sử dụng trong chế độ “không có chủ”. Ở chế độ chính/máy khách, các máy khách sẽ thăm dò [các] máy chủ trung tâm để biết cấu hình mới theo các khoảng thời gian đã đặt và tự cập nhật nếu cần. Ở chế độ không có chủ, bạn có thể đẩy các thay đổi đến các nút của mình

Chef là một khung tích hợp hệ thống dựa trên Ruby mạnh mẽ 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 sự cố tích hợp và cho phép nhóm phát triển phần mềm gắn kết nhanh hơn

– Martin Fowler

Có nhiều cách khác nhau để triển khai tích hợp liên tục cho PHP. Travis CI đã làm rất tốt việc 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 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ì tất cả là 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

phpcbf -w --standard=PSR1 file.php
561 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ạ

phpcbf -w --standard=PSR1 file.php
562 tới thư mục gốc của tài liệu mà bạn có thể xem tại
phpcbf -w --standard=PSR1 file.php
563

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.

phpcbf -w --standard=PSR1 file.php
564 làm cho nó chạy ở chế độ nền. To stop and start it, simply run
phpcbf -w --standard=PSR1 file.php
565 and
phpcbf -w --standard=PSR1 file.php
566 [the other parameters are not needed again]

Learn more about Docker

The command above shows a quick way to run a basic server. There’s much more you can do [and thousands of pre-built images in the Docker Hub]. Take time to learn the terminology and read the Docker User Guide to get the most from it, and don’t run random code you’ve downloaded without checking it’s safe – unofficial images may not have the latest security patches. If in doubt, stick to the official repositiories

The PHPDocker. io site will auto-generate all the files you need for a fully-featured LAMP/LEMP stack, including your choice of PHP version and extensions

PHP is pretty quick by itself, but bottlenecks can arise when you make remote connections, load files, etc. Thankfully, there are various tools available to speed up certain parts of your application, or reduce the number of times these various time-consuming tasks need to run

Opcode Cache

When a PHP file is executed, it must first be compiled into opcodes [machine language instructions for the CPU]. If the source code is unchanged, the opcodes will be the same, so this compilation step becomes a waste of CPU resources

An opcode cache prevents redundant compilation by storing opcodes in memory and reusing them on successive calls. It will typically check signature or modification time of the file first, in case there have been any changes

It’s likely an opcode cache will make a significant speed improvement to your application. Since PHP 5. 5 there is one built in - Zend OPcache. Depending on your PHP package/distribution, it’s usually turned on by default - check opcache. enable and the output of

brew unlink php
brew link --overwrite php@8.1
60 to make sure. For earlier versions there’s a PECL extension

Read more about opcode caches

Object Caching

Đôi khi, việc lưu trữ các đối tượng riêng lẻ trong mã của bạn có thể hữu ích, chẳng hạn như với dữ liệu đắt tiền để lấy hoặc các lệnh gọi cơ sở dữ liệu mà kết quả khó có thể thay đổi. Bạn có thể sử dụng phần mềm bộ nhớ đệm đối tượng để giữ các phần dữ liệu này trong bộ nhớ để truy cập cực nhanh sau này. Nếu bạn lưu các mục này vào kho lưu trữ dữ liệu sau khi truy xuất chúng, sau đó kéo chúng trực tiếp từ bộ nhớ cache cho các yêu cầu sau, bạn có thể đạt được sự cải thiện đáng kể về hiệu suất cũng như giảm tải cho máy chủ cơ sở dữ liệu của mình

Nhiều giải pháp lưu trữ mã byte phổ biến cũng cho phép bạn lưu trữ dữ liệu tùy chỉnh vào bộ đệm ẩn, vì vậy càng có nhiều lý do để tận dụng chúng. APCu, XCache và WinCache đều cung cấp API để lưu dữ liệu từ mã PHP của bạn vào bộ nhớ đệm của chúng

Các hệ thống lưu trữ đối tượng bộ nhớ được sử dụng phổ biến nhất là APCu và memcached. APCu là một lựa chọn tuyệt vời cho bộ nhớ đệm đối tượng, nó bao gồm một API đơn giản để thêm dữ liệu của riêng bạn vào bộ nhớ cache của nó và rất dễ cài đặt cũng như sử dụng. Một hạn chế thực sự của APCu là nó được gắn với máy chủ mà nó được cài đặt trên đó. Mặt khác, Memcached được cài đặt như một dịch vụ riêng biệt và có thể được truy cập qua mạng, nghĩa là bạn có thể lưu trữ các đối tượng trong kho lưu trữ dữ liệu siêu nhanh ở một vị trí trung tâm và nhiều hệ thống khác nhau có thể lấy từ đó

Lưu ý rằng khi chạy PHP dưới dạng [ứng dụng Fastcgi bên trong máy chủ web của bạn, mọi quy trình PHP sẽ có bộ đệm riêng, tôi. e. Dữ liệu APCu không được chia sẻ giữa các quy trình worker của bạn. Trong những trường hợp này, bạn có thể cân nhắc sử dụng memcached để thay thế, vì nó không bị ràng buộc với các quy trình PHP

Trong một cấu hình được nối mạng, APCu thường sẽ vượt trội hơn so với memcached về tốc độ truy cập, nhưng memcached sẽ có thể mở rộng quy mô nhanh hơn và xa hơn. Nếu bạn không muốn có nhiều máy chủ chạy ứng dụng của mình hoặc không cần các tính năng bổ sung mà memcached cung cấp thì APCu có lẽ là lựa chọn tốt nhất của bạn cho bộ nhớ đệm đối tượng

Ví dụ logic sử dụng APCu

brew unlink php
brew link --overwrite php@8.0
6
phpcbf -w --standard=PSR1 file.php
568
phpcbf -w --standard=PSR1 file.php
569 thông báo rõ ràng cho chúng tôi rằng không có sự trở lại;

từ nguồn

Mọi người theo dõi

Rất khó để tìm được những thành viên thú vị và hiểu biết về cộng đồng PHP khi bạn mới bắt đầu. Bạn có thể tìm thấy danh sách viết tắt của các thành viên cộng đồng PHP để giúp bạn bắt đầu tại

Nhà cung cấp PaaS PHP

Để xem các máy chủ PaaS này đang chạy phiên bản nào, hãy truy cập Phiên bản PHP

khung

Thay vì phát minh lại bánh xe, nhiều nhà phát triển PHP sử dụng các khung để xây dựng các ứng dụng web. Các khung trừu tượng hóa nhiều mối quan tâm cấp thấp và cung cấp các giao diện hữu ích, dễ sử dụng để hoàn thành các tác vụ thông thường

Bạn không cần phải sử dụng một framework cho mọi dự án. Đôi khi PHP đơn giản là cách phù hợp, nhưng nếu bạn cần một framework thì có ba loại chính có sẵn

  • Khung vi mô
  • Full-Stack Frameworks
  • Khung thành phần

Các khung vi mô về cơ bản là một trình bao bọc để định tuyến một yêu cầu HTTP tới một cuộc gọi lại, bộ điều khiển, phương thức, v.v. nhanh nhất có thể và đôi khi đi kèm với một vài thư viện bổ sung để hỗ trợ phát triển, chẳng hạn như các trình bao bọc cơ sở dữ liệu cơ bản và những thứ tương tự. Chúng được sử dụng nổi bật để xây dựng các dịch vụ HTTP từ xa

Nhiều khung bổ sung một số lượng đáng kể các tính năng trên những gì có sẵn trong một khung vi mô; . Chúng thường đi kèm với ORM, gói Xác thực, v.v.

Các khung dựa trên thành phần là tập hợp các thư viện chuyên dụng và đơn mục đích. Các khung dựa trên thành phần khác nhau có thể được sử dụng cùng nhau để tạo thành khung vi mô hoặc toàn ngăn xếp

Các thành phần

Như đã đề cập ở trên, “Các thành phần” là một cách tiếp cận khác để đạt được mục tiêu chung là tạo, phân phối và triển khai mã dùng chung. Các kho lưu trữ thành phần khác nhau tồn tại, hai kho chính trong số đó là

Cả hai kho lưu trữ này đều có các công cụ dòng lệnh được liên kết với chúng để trợ giúp quá trình cài đặt và nâng cấp và đã được giải thích chi tiết hơn trong phần Quản lý phụ thuộc

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 được xuất bản mọi lúc mọi nơi

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

phpcbf -w --standard=PSR1 file.php
571 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

Phiên bản mới nhất của PHP Mcq là gì?

Mô tả. PHP được tạo ra bởi Rasmus Lerdorf vào năm 1994 nhưng xuất hiện trên thị trường vào năm 1995. PHP7. 4. 0 là phiên bản mới nhất của PHP, được phát hành vào ngày 28 tháng 11. .

Chủ Đề