Điều nào sau đây có thể được thực hiện trong php?

Có rất nhiều thông tin lỗi thời trên Web khiến người dùng PHP mới lạc hướng, truyền bá các thực tiễn xấu và mã không an toàn. PHP. The Right Way là một tài liệu tham khảo nhanh, dễ đọc về các tiêu chuẩn mã hóa phổ biến của PHP, liên kết đến các hướng dẫn có thẩm quyền trên Web và những gì những người đóng góp coi là thực tiễn tốt nhất tại thời điểm hiện tại

Show

Không có cách kinh điển nào để sử dụng PHP. Trang web này nhằm mục đích giới thiệu cho các nhà phát triển PHP mới một số chủ đề mà họ có thể không khám phá ra cho đến khi quá muộn và nhằm mục đích cung cấp cho các chuyên gia dày dặn kinh nghiệm một số ý tưởng mới về những chủ đề mà họ đã làm trong nhiều năm mà chưa từng xem xét lại. Trang web này cũng sẽ không cho bạn biết nên sử dụng công cụ nào mà thay vào đó đưa ra đề xuất cho nhiều tùy chọn, khi có thể giải thích sự khác biệt trong cách tiếp cận và trường hợp sử dụng

Đây là một tài liệu sống và sẽ tiếp tục được cập nhật với nhiều thông tin và ví dụ hữu ích hơn khi chúng có sẵn

bản dịch

PHP. The Right Way được dịch ra nhiều ngôn ngữ khác nhau

Sách

Phiên bản mới nhất của PHP. Con Đường Đúng Cách cũng có sẵn ở định dạng PDF, EPUB và MOBI. Tới Leanpub

Làm thế nào để đóng góp

Giúp làm cho trang web này trở thành tài nguyên tốt nhất cho các lập trình viên PHP mới. Đóng góp trên GitHub

Sử dụng Phiên bản ổn định hiện tại (8. 1)

Nếu bạn đang bắt đầu với PHP, hãy bắt đầu với bản phát hành ổn định hiện tại của PHP 8. 1. PHP8. x bổ sung nhiều tính năng mới so với 7 cũ hơn. x và 5. phiên bản x. Công cụ đã được viết lại phần lớn và PHP thậm chí còn nhanh hơn các phiên bản cũ hơn. PHP 8 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

With PHP 5. 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 [email protected]

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

Install PHP via Macports

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

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

At this point, you can install

phpcbf -w --standard=PSR1 file.php
4,
phpcbf -w --standard=PSR1 file.php
5,
phpcbf -w --standard=PSR1 file.php
6,
phpcbf -w --standard=PSR1 file.php
7,
phpcbf -w --standard=PSR1 file.php
8,
phpcbf -w --standard=PSR1 file.php
9,
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. For support and additional resources there is a dedicated area on 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 có một bài đăng trên blog rất hữu ích về những công cụ mà anh ấy sử dụng để phát triển PHP bằng Windows

Cấu trúc thư mục chung

Một câu hỏi phổ biến đối với những người bắt đầu viết chương trình cho web là, "tôi đặt nội dung của mình ở đâu?" . ” Mặc dù câu trả lời này chưa hoàn chỉnh, nhưng đó là một nơi tuyệt vời để bắt đầu

Vì lý do bảo mật, khách truy cập trang web không thể truy cập tệp cấu hình;

Đối với mỗi nhóm, CMS hoặc khung mà một người làm việc, một cấu trúc thư mục tiêu chuẩn được sử dụng bởi từng thực thể đó. Tuy nhiên, nếu một người đang bắt đầu một dự án một mình, việc biết sử dụng cấu trúc hệ thống tệp nào có thể gây khó khăn.

Paul M. Jones đã thực hiện một số nghiên cứu tuyệt vời về các thực tiễn chung của hàng chục nghìn dự án github trong lĩnh vực PHP. Ông đã biên soạn một cấu trúc thư mục và tệp tiêu chuẩn, Bộ xương gói PHP tiêu chuẩn, dựa trên nghiên cứu này. Trong cấu trúc thư mục này,

phpcbf -w --standard=PSR1 file.php
06 nên trỏ đến
phpcbf -w --standard=PSR1 file.php
08, các bài kiểm tra đơn vị phải nằm trong thư mục
phpcbf -w --standard=PSR1 file.php
09 và các thư viện của bên thứ ba, do nhà soạn nhạc cài đặt, thuộc về thư mục
brew unlink php
brew link --overwrite [email protected]
20. Đối với các tệp và thư mục khác, việc tuân thủ Bộ khung gói PHP tiêu chuẩn sẽ có ý nghĩa nhất đối với những người đóng góp cho dự án

Cộng đồng PHP lớn và đa dạng, bao gồm vô số thư viện, khung và thành phần. Các nhà phát triển PHP thường chọn một vài trong số này và kết hợp chúng thành một dự án duy nhất. Điều quan trọng là mã PHP phải tuân thủ (càng gần càng tốt) với một kiểu mã phổ biến để giúp các nhà phát triển dễ dàng kết hợp và kết hợp các thư viện khác nhau cho các dự án của họ

Framework Interop Group đã đề xuất và phê duyệt một loạt các đề xuất về phong cách. Không phải tất cả chúng đều liên quan đến kiểu mã, nhưng những thứ đó là PSR-1, PSR-12 và PSR-4. Những đề xuất này chỉ đơn thuần là một bộ quy tắc mà nhiều dự án như Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, v.v. đang áp dụng. Bạn có thể sử dụng chúng cho các dự án của riêng mình hoặc tiếp tục sử dụng phong cách cá nhân của riêng bạn

Tốt nhất, bạn nên viết mã PHP tuân theo một tiêu chuẩn đã biết. Đây có thể là bất kỳ sự kết hợp nào của PSR hoặc một trong các tiêu chuẩn mã hóa do PEAR hoặc Zend tạo ra. Điều này có nghĩa là các nhà phát triển khác có thể dễ dàng đọc và làm việc với mã của bạn và các ứng dụng triển khai các thành phần có thể có tính nhất quán ngay cả khi làm việc với nhiều mã của bên thứ ba

Bạn có thể sử dụng PHP_CodeSniffer để kiểm tra mã dựa trên bất kỳ đề xuất nào trong số này và các plugin dành cho trình soạn thảo văn bản như Sublime Text để nhận phản hồi theo thời gian thực

Bạn có thể tự động sửa bố cục mã bằng cách sử dụng một trong các công cụ sau

And you can run phpcs manually from shell

brew unlink php
brew link --overwrite [email protected]
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. Comments may be written in any language easily readable by all current and future parties who may be working on the codebase

Finally, a good supplementary resource for writing clean PHP code is Clean Code PHP

Programming Paradigms

PHP is a flexible, dynamic language that supports a variety of programming techniques. It has evolved dramatically over the years, notably adding a solid object-oriented model in PHP 5. 0 (2004), anonymous functions and namespaces in PHP 5. 3 (2009), and traits in PHP 5. 4 (2012)

Object-oriented Programming

PHP has a very complete set of object-oriented programming features including support for classes, abstract classes, interfaces, inheritance, constructors, cloning, exceptions, and more

Functional Programming

PHP supports first-class functions, meaning that a function can be assigned to a variable. Both user-defined and built-in functions can be referenced by a variable and invoked dynamically. Functions can be passed as arguments to other functions (a feature called Higher-order Functions) and functions can return other functions

Recursion, a feature that allows a function to call itself, is supported by the language, but most PHP code is focused on iteration

New anonymous functions (with support for closures) are present since PHP 5. 3 (2009)

PHP 5. 4 added the ability to bind closures to an object’s scope and also improved support for callables such that they can be used interchangeably with anonymous functions in almost all cases

PHP supports various forms of meta-programming through mechanisms like the Reflection API and Magic Methods. There are many Magic Methods available like

brew unlink php
brew link --overwrite [email protected]
21,
brew unlink php
brew link --overwrite [email protected]
22,
brew unlink php
brew link --overwrite [email protected]
23,
brew unlink php
brew link --overwrite [email protected]
24,
brew unlink php
brew link --overwrite [email protected]
25, etc. that allow developers to hook into class behavior. Ruby developers often say that PHP is lacking
brew unlink php
brew link --overwrite [email protected]
26, but it is available as
brew unlink php
brew link --overwrite [email protected]
27 and
brew unlink php
brew link --overwrite [email protected]
28

Namespaces

As mentioned above, the PHP community has a lot of developers creating lots of code. This means that one library’s PHP code might use the same class name as another. When both libraries are used in the same namespace, they collide and cause trouble

Namespaces solve this problem. As described in the PHP reference manual, namespaces may be compared to operating system directories that namespace files; two files with the same name may co-exist in separate directories. Likewise, two PHP classes with the same name may co-exist in separate PHP namespaces. It’s as simple as that

It is important for you to namespace your code so that it may be used by other developers without fear of colliding with other libraries

One recommended way to use namespaces is outlined in PSR-4, which aims to provide a standard file, class and namespace convention to allow plug-and-play code

In October 2014 the PHP-FIG deprecated the previous autoloading standard. 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 triển khai các giao diện SPL

Giao diện dòng lệnh

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

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

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

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

Tùy chọn

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

Tùy chọn

brew unlink php
brew link --overwrite [email protected]
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. Ngoài ra còn có một số tùy chọn dòng lệnh hữu ích khác

Hãy viết một chương trình CLI “Xin chào, $name” đơn giản. Để dùng thử, hãy tạo một tệp có tên

brew unlink php
brew link --overwrite [email protected]
62, như bên dưới

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

Biểu thức

brew unlink php
brew link --overwrite [email protected]
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. Commonly used exit codes can be found here

To run our script, above, from the command line

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

Xdebug

Một trong những công cụ hữu ích nhất trong phát triển phần mềm là trình sửa lỗi thích hợp. Nó cho phép bạn theo dõi quá trình thực thi mã của mình và theo dõi nội dung của ngăn xếp. Xdebug, trình sửa lỗi của PHP, có thể được sử dụng bởi nhiều IDE khác nhau để cung cấp Điểm dừng và kiểm tra ngăn xếp. Nó cũng có thể cho phép các công cụ như PHPUnit và KCacheGrind thực hiện phân tích phạm vi mã và lập hồ sơ mã

Nếu bạn thấy mình bị ràng buộc, sẵn sàng dùng đến

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

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

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

IDE của bạn bây giờ sẽ chặn trạng thái hiện tại khi tập lệnh thực thi, cho phép bạn đặt các điểm dừng và thăm dò các giá trị trong bộ nhớ

Trình gỡ lỗi đồ họa giúp dễ dàng chuyển qua mã, kiểm tra các biến và đánh giá mã so với thời gian chạy trực tiếp. Nhiều IDE có hỗ trợ tích hợp sẵn hoặc dựa trên plugin để gỡ lỗi đồ họa với Xdebug. MacGDBp là GUI Xdebug độc lập, mã nguồn mở, miễn phí dành cho Mac

Có rất nhiều thư viện, khung và thành phần PHP để lựa chọn. Dự án của bạn có thể sẽ sử dụng một vài trong số chúng — đây là những phần phụ thuộc của dự án. Cho đến gần đây, PHP không có cách tốt để quản lý các phụ thuộc dự án này. Ngay cả khi bạn quản lý chúng theo cách thủ công, bạn vẫn phải lo lắng về trình tải tự động. Đó không còn là vấn đề

Hiện tại có hai hệ thống quản lý gói chính cho PHP - 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 [email protected]
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 [email protected]
00 trong thư mục làm việc hiện tại của bạn

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

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

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

Ghi chú. Nếu cách trên không thành công do quyền, hãy thêm tiền tố vào

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

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

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

Cài đặt trên Windows

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

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

Cách xác định và cài đặt các phụ thuộc

Trình soạn thảo theo dõi các phụ thuộc của dự án của bạn trong một tệp có tên là

brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
69, một tệp sẽ được tạo. Đây là một ví dụ thêm Twig làm phụ thuộc cho dự án của bạn

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

Ngoài ra, lệnh

brew unlink php
brew link --overwrite [email protected]
10 sẽ hướng dẫn bạn cách tạo tệp
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
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 [email protected]
69

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

Tiếp theo, thêm dòng này vào tệp PHP chính của ứng dụng của bạn;

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

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

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

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

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

Trình kiểm tra bảo mật PHP cục bộ là một công cụ dòng lệnh, sẽ kiểm tra tệp

brew unlink php
brew link --overwrite [email protected]
17 của bạn và cho bạn biết nếu bạn cần cập nhật bất kỳ phần phụ thuộc nào của mình

Xử lý các phụ thuộc toàn cầu với Composer

Trình soạn thảo cũng có thể xử lý các phụ thuộc toàn cầu và các tệp nhị phân của chúng. Cách sử dụng rất đơn giản, tất cả những gì bạn cần làm là thêm tiền tố vào lệnh của bạn với

brew unlink php
brew link --overwrite [email protected]
29. Ví dụ: nếu bạn muốn cài đặt PHPUnit và nó có sẵn trên toàn cầu, bạn sẽ chạy lệnh sau

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

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

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

Trình cài đặt
brew unlink php
brew link --overwrite [email protected]
33 và thực thi nó. Tài liệu PEAR có hướng dẫn cài đặt chi tiết cho mọi hệ điều hành

Nếu bạn đang sử dụng Linux, bạn cũng có thể xem trình quản lý gói phân phối của mình. Ví dụ, Debian và Ubuntu có gói apt

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

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

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

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

Nếu gói được lưu trữ trên một kênh khác, trước tiên bạn cần phải

brew unlink php
brew link --overwrite [email protected]
35 kênh đó và cũng chỉ định kênh đó khi cài đặt. Xem tài liệu Sử dụng kênh để biết thêm thông tin về chủ đề này

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

Nếu bạn đang sử dụng 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 [email protected]
36

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

Phần đầu tiên

brew unlink php
brew link --overwrite [email protected]
37 sẽ được sử dụng để cho Composer biết nó nên “khởi tạo” (hoặc “khám phá” theo thuật ngữ PEAR) repo lê. Sau đó, phần
brew unlink php
brew link --overwrite [email protected]
38 sẽ thêm tiền tố vào tên gói như thế này

lê-kênh/Gói

Tiền tố “lê” được mã hóa cứng để tránh bất kỳ xung đột nào, chẳng hạn như kênh lê có thể giống với tên nhà cung cấp gói khác, sau đó, tên ngắn của kênh (hoặc URL đầy đủ) có thể được sử dụng để tham chiếu gói đó nằm trong kênh nào

Khi mã này được cài đặt, nó sẽ có sẵn trong thư mục nhà cung cấp của bạn và tự động có sẵn thông qua trình tải tự động Trình soạn thảo

nhà cung cấp/lê-lê2. php. net/PEAR2_HTTP_Request/pear2/HTTP/Yêu cầu. php

Để sử dụng gói PEAR này, chỉ cần tham khảo nó như vậy

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

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

Có thể tính toán với DateTime với lớp DateInterval. DateTime có các phương thức như

brew unlink php
brew link --overwrite [email protected]
42 và
brew unlink php
brew link --overwrite [email protected]
43 lấy DateInterval làm đối số. Không viết mã có cùng số giây mỗi ngày. Cả tiết kiệm ánh sáng ban ngày và thay đổi múi giờ sẽ phá vỡ giả định đó. Thay vào đó hãy sử dụng khoảng thời gian ngày. Để tính chênh lệch ngày, hãy sử dụng phương pháp
brew unlink php
brew link --overwrite [email protected]
44. Nó sẽ trả về DateInterval mới, rất dễ hiển thị

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

Bạn có thể sử dụng phép so sánh tiêu chuẩn trên các đối tượng DateTime

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

You must use the

brew unlink php
brew link --overwrite [email protected]
48 functions whenever you operate on a Unicode string. For example, if you use
brew unlink php
brew link --overwrite [email protected]
53 on a UTF-8 string, there’s a good chance the result will include some garbled half-characters. Chức năng chính xác để sử dụng sẽ là đối tác nhiều byte,
brew unlink php
brew link --overwrite [email protected]
54

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

brew unlink php
brew link --overwrite [email protected]
48. Nếu bạn quên dù chỉ một lần, chuỗi Unicode của bạn có khả năng bị cắt xén trong quá trình xử lý tiếp theo

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

brew unlink php
brew link --overwrite [email protected]
48. Nếu không có ai cho những gì bạn muốn làm, thì bạn có thể không gặp may

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

brew unlink php
brew link --overwrite [email protected]
57 ở đầu mỗi tập lệnh PHP mà bạn viết (hoặc ở đầu tập lệnh bao gồm toàn cầu của bạn) và hàm
brew unlink php
brew link --overwrite [email protected]
58 ngay sau nó nếu tập lệnh của bạn xuất ra trình duyệt. Việc xác định rõ ràng mã hóa các chuỗi của bạn trong mọi tập lệnh sẽ giúp bạn đỡ phải đau đầu hơn rất nhiều

Additionally, many PHP functions that operate on strings have an optional parameter letting you specify the character encoding. Bạn phải luôn chỉ rõ ràng UTF-8 khi được cung cấp tùy chọn. Ví dụ:

brew unlink php
brew link --overwrite [email protected]
59 có tùy chọn mã hóa ký tự và bạn phải luôn chỉ định UTF-8 nếu xử lý các chuỗi 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 [email protected]
59 và
brew unlink php
brew link --overwrite [email protected]
61

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

brew unlink php
brew link --overwrite [email protected]
62 sẽ được 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 [email protected]
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

Nếu tập lệnh PHP của bạn truy cập MySQL, thì có khả năng chuỗi của bạn có thể được lưu trữ dưới dạng chuỗi không phải UTF-8 trong cơ sở dữ liệu ngay cả khi bạn tuân theo tất cả các biện pháp phòng ngừa ở trên

Để đảm bảo chuỗi của bạn chuyển từ PHP sang MySQL dưới dạng UTF-8, hãy đảm bảo rằng cơ sở dữ liệu và bảng của bạn đều được đặt thành bộ ký tự và đối chiếu

brew unlink php
brew link --overwrite [email protected]
64, đồng thời bạn sử dụng bộ ký tự
brew unlink php
brew link --overwrite [email protected]
64 trong chuỗi kết nối PDO. Xem mã ví dụ bên dưới. Điều này cực kỳ quan trọng

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

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

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

Sử dụng hàm

brew unlink php
brew link --overwrite [email protected]
58 để đảm bảo rằng tập lệnh PHP của bạn xuất ra các chuỗi UTF-8 cho trình duyệt của bạn

Sau đó, trình duyệt sẽ cần được thông báo bằng phản hồi HTTP rằng trang này phải được coi là UTF-8. Ngày nay, người ta thường đặt bộ ký tự trong tiêu đề phản hồi HTTP như thế này

Thẻ
brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
69 trong thẻ trang của bạn

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

đọc thêm

brew unlink php
brew link --overwrite [email protected]
70. Nó có từ năm 1995 và vẫn là một triển khai hoàn chỉnh để dịch phần mềm. Thật dễ dàng để chạy, trong khi vẫn có các công cụ hỗ trợ mạnh mẽ. Đó là về Gettext chúng ta sẽ nói ở đây. Ngoài ra, để giúp bạn không 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. It uses array formats for messages. Does not provide a message extractor, but does provide advanced message formatting via the
    brew unlink php
    brew link --overwrite [email protected]
    
    71 extension (including pluralized messages)
  • oscarotero/Gettext. Gettext support with an OO interface; includes improved helper functions, powerful extractors for several file formats (some of them not supported natively by the
    brew unlink php
    brew link --overwrite [email protected]
    
    72 command), and can also export to other formats besides
    brew unlink php
    brew link --overwrite [email protected]
    
    73 files. Can be useful if you need to integrate your translation files into other parts of the system, like a JavaScript interface
  • symfony/translation. supports a lot of different formats, but recommends using verbose XLIFF’s. Doesn’t include helper functions nor a built-in extractor, but supports placeholders using
    brew unlink php
    brew link --overwrite [email protected]
    
    74 internally
  • laminas/laminas-i18n. supports array and INI files, or Gettext formats. Implements a caching layer to save you from reading the filesystem every time. It also includes view helpers, and locale-aware input filters and validators. However, it has no message extractor

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

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

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

Gettext

Installation

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

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

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

Structure

Types of files

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

Domains

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

Locale code

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

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

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

Directory structure

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

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

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

Plural forms

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

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

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

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

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

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

When calling out Gettext to do localization on sentences with counters, you will have to provide it the related number as well. Gettext 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. You will need to include in the

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

Sample implementation

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

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

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

The first section works like a header, having the

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

Discussion on l10n keys

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

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

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

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

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

Everyday usage

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

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

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

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

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

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

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

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

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

brew unlink php
brew link --overwrite [email protected]
21 or
brew unlink php
brew link --overwrite [email protected]
83

Now, save the file - using that directory structure we mentioned as well. Then you should click “Extract from sources”, and here you’ll configure various settings for the extraction and translation tasks. You’ll be able to find all those later through “Catalog > Properties”

  • Source paths. ở đây bạn phải bao gồm tất cả các thư mục từ dự án có tên là
    brew unlink php
    brew link --overwrite [email protected]
    
    13 (và các anh chị em) - đây thường là (các) thư mục mẫu/lượt xem của bạn. This is the only mandatory setting;
  • Translation properties
    • Project name and version, Team and Team’s email address. useful information that goes in the . tiêu đề tệp po;
    • Plural forms. đây là những quy tắc mà chúng tôi đã đề cập trước đây - có một liên kết trong đó với các mẫu. Hầu hết thời gian, bạn có thể để nó với tùy chọn mặc định, vì PoEdit đã bao gồm một cơ sở dữ liệu tiện dụng gồm các quy tắc số nhiều cho nhiều ngôn ngữ
    • Charsets. UTF-8, preferably;
    • Bộ ký tự mã nguồn. đặt ở đây bộ ký tự được sử dụng bởi cơ sở mã của bạn - có thể là cả UTF-8, phải không?
  • Source keywords. The underlying software knows how
    brew unlink php
    brew link --overwrite [email protected]
    
    13 and similar function calls look like in several programming languages, but you might as well create your own translation functions. Nó sẽ ở đây, bạn sẽ thêm các phương pháp khác. This will be discussed later in the “Tips” section

Sau khi thiết lập các điểm đó, nó sẽ chạy quét qua các tệp nguồn của bạn để tìm tất cả các cuộc gọi bản địa hóa. Sau mỗi lần quét, PoEdit sẽ hiển thị tóm tắt những gì đã tìm thấy và những gì đã bị xóa khỏi tệp nguồn. Các mục mới sẽ được đưa trống vào bảng dịch và bạn sẽ bắt đầu nhập các phiên bản đã bản địa hóa của các chuỗi đó. Lưu nó và một. tệp mo sẽ được (tái) biên dịch vào cùng một thư mục và ta-dah. dự án của bạn được quốc tế hóa

4. dịch chuỗi

Như bạn có thể nhận thấy trước đây, có hai loại chuỗi bản địa hóa chính. những cái đơn giản và những cái có dạng số nhiều. Những cái đầu tiên chỉ có hai hộp. nguồn và chuỗi cục bộ. 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. Mẹo. bạn có thể nhấp chuột phải vào một dòng dịch và nó sẽ gợi ý cho bạn các tệp nguồn và các dòng nơi chuỗi đó đang được sử dụng. Mặt khác, các chuỗi dạng số nhiều bao gồm hai hộp để hiển thị hai chuỗi nguồn và các tab để bạn có thể định cấu hình các dạng cuối cùng khác nhau

Bất cứ khi nào bạn thay đổi nguồn của mình và cần cập nhật bản dịch, chỉ cần nhấn Làm mới và Poedit sẽ quét lại mã, xóa các mục nhập không tồn tại, hợp nhất những mục đã thay đổi và thêm mục mới. Nó cũng có thể cố gắng đoán một số bản dịch, dựa trên những bản dịch khác mà bạn đã thực hiện. Those guesses and the changed entries will receive a “Fuzzy” marker, indicating it needs review, appearing golden in the list. Nó cũng hữu ích nếu bạn có một nhóm dịch thuật và ai đó đang cố gắng viết điều gì đó mà họ không chắc chắn về nó. just mark Fuzzy, and someone else will review later

Cuối cùng, bạn nên đánh dấu “Xem > Các mục chưa được dịch trước”, vì nó sẽ giúp bạn rất nhiều để không quên bất kỳ mục nào. From that menu, you can also open parts of the UI that allow you to leave contextual information for translators if needed

Mẹo & Thủ thuật

Các vấn đề về bộ nhớ đệm có thể xảy ra

Nếu bạn đang chạy PHP dưới dạng một mô-đun trên Apache (

brew unlink php
brew link --overwrite [email protected]
25), bạn có thể gặp sự cố với tệp
brew unlink php
brew link --overwrite [email protected]
12 được lưu trong bộ đệm. Nó xảy ra lần đầu tiên nó được đọc và sau đó, để cập nhật nó, bạn có thể cần phải khởi động lại máy chủ. 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

Các chức năng trợ giúp bổ sung

As preferred by many people, it is easier to use

brew unlink php
brew link --overwrite [email protected]
16 instead of
brew unlink php
brew link --overwrite [email protected]
13. Nhiều thư viện i18n tùy chỉnh từ các khung cũng sử dụng thứ gì đó tương tự như
brew unlink php
brew link --overwrite [email protected]
29 để làm cho mã được dịch ngắn hơn. Tuy nhiên, đó là chức năng duy nhất có phím tắt. Bạn có thể muốn thêm vào dự án của mình một số thứ khác, chẳng hạn như
brew unlink php
brew link --overwrite [email protected]
30 hoặc
brew unlink php
brew link --overwrite [email protected]
31 cho
brew unlink php
brew link --overwrite [email protected]
17, hoặc có thể là một
brew unlink php
brew link --overwrite [email protected]
33 ưa thích sẽ tham gia các cuộc gọi
brew unlink php
brew link --overwrite [email protected]
13 và
brew unlink php
brew link --overwrite [email protected]
35. Các thư viện khác, chẳng hạn như Gettext của oscarotero cũng cung cấp các hàm trợ giúp như thế này

In those cases, you’ll need to instruct the Gettext utility on how to extract the strings from those new functions. Đừng sợ; . Nó chỉ là một trường trong tệp

brew unlink php
brew link --overwrite [email protected]
85 hoặc màn hình Cài đặt trên Poedit. In the editor, that option is inside “Catalog > Properties > Source keywords”. Nhớ lại. Gettext đã biết các chức năng mặc định cho nhiều ngôn ngữ, vì vậy đừng sợ nếu danh sách đó trống. 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 [email protected]
    
    29 that simply returns the translation for a string, you can specify it as
    brew unlink php
    brew link --overwrite [email protected]
    
    38. Gettext sẽ biết đối số duy nhất của hàm là chuỗi cần dịch;
  • nếu hàm có nhiều hơn một đối số, bạn có thể chỉ định chuỗi đầu tiên thuộc về đối số nào - và nếu cần, cả dạng số nhiều. Chẳng hạn, nếu chúng ta gọi hàm của mình như thế này.
    brew unlink php
    brew link --overwrite [email protected]
    
    39, thông số kỹ thuật sẽ là
    brew unlink php
    brew link --overwrite [email protected]
    
    40, nghĩa là biểu mẫu đầu tiên là đối số thứ nhất và biểu mẫu thứ hai là đối số thứ hai. If your number comes as the first argument instead, the spec would be
    brew unlink php
    brew link --overwrite [email protected]
    
    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 [email protected]
85 file, a new scan will bring in your new strings just as easy as before

Người giới thiệu

từ 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 đang cung cấp một thành phần với các phụ thuộc của nó thông qua hàm tạo, gọi phương thức hoặc cài đặt thuộc tính. Nó đơn giản thế thôi

Khái niệm cơ bản

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

Here we have a

brew unlink php
brew link --overwrite [email protected]
43 class that requires an adapter to speak to the database. We instantiate the adapter in the constructor and create a hard dependency. Điều này làm cho việc kiểm tra trở nên khó khăn và có nghĩa là lớp
brew unlink php
brew link --overwrite [email protected]
43 được liên kết rất chặt chẽ với bộ điều hợp

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

Mã này có thể được tái cấu trúc để sử dụng Dependency Injection và do đó nới lỏng sự phụ thuộc

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

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

brew unlink php
brew link --overwrite [email protected]
43 sự phụ thuộc của nó thay vì tự tạo ra nó. We could even create a method that would accept an argument of the dependency and set it that way, or if the
brew unlink php
brew link --overwrite [email protected]
46 property was
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
48 interface which defines an
brew unlink php
brew link --overwrite [email protected]
49 method, and we have
brew unlink php
brew link --overwrite [email protected]
50 and
brew unlink php
brew link --overwrite [email protected]
51 classes which both implement the
brew unlink php
brew link --overwrite [email protected]
48 interface, then we can expect that the usage of the
brew unlink php
brew link --overwrite [email protected]
49 method will always do the thing that we intend. If we later create a
brew unlink php
brew link --overwrite [email protected]
54 class or a
brew unlink php
brew link --overwrite [email protected]
55 class which implement the
brew unlink php
brew link --overwrite [email protected]
48 interface, we will already know and understand what the
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
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 [email protected]
59 or
brew unlink php
brew link --overwrite [email protected]
60 class would be interested in a
brew unlink php
brew link --overwrite [email protected]
61 method, but a
brew unlink php
brew link --overwrite [email protected]
62 or
brew unlink php
brew link --overwrite [email protected]
63 class would not. Conversely, a
brew unlink php
brew link --overwrite [email protected]
62 or
brew unlink php
brew link --overwrite [email protected]
63 class would be interested in a
brew unlink php
brew link --overwrite [email protected]
66 method, but a
brew unlink php
brew link --overwrite [email protected]
59 or
brew unlink php
brew link --overwrite [email protected]
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 [email protected]
61 as well as
brew unlink php
brew link --overwrite [email protected]
66, so we should break-apart the source interface

Dependency Inversion Principle

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

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

There are several benefits to the

brew unlink php
brew link --overwrite [email protected]
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. Bây giờ phần phụ thuộc là một giao diện/hợp đồng, chúng ta có thể vui vẻ mô phỏng giao diện đó khi biết rằng đồng nghiệp của chúng ta sẽ xây dựng bộ điều hợp dựa trên hợp đồng đó

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. Việc đưa bộ chứa DI làm Bộ định vị dịch vụ vào các lớp của bạn có thể tạo ra sự phụ thuộc khó hơn vào bộ chứa so với sự phụ thuộc mà bạn đang thay thế. Nó cũng làm cho mã của bạn kém minh bạch hơn và cuối cùng khó kiểm tra hơn

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. Tùy chọn được đề xuất cho đến PHP 5. 1. 0 là sử dụng trình điều khiển gốc như mysqli, pgsql, mssql, v.v.

Trình điều khiển gốc rất tuyệt nếu bạn chỉ sử dụng một cơ sở dữ liệu trong ứng dụng của mình, nhưng nếu, ví dụ, bạn đang sử dụng MySQL và một chút MSSQL hoặc bạn cần kết nối với cơ sở dữ liệu Oracle, thì bạn sẽ không thể sử dụng . Bạn sẽ cần tìm hiểu một API hoàn toàn mới cho mỗi cơ sở dữ liệu — và điều đó có thể trở nên ngớ ngẩn

Tiện ích mở rộng MySQL

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

Sự phát triển không chỉ dừng lại từ lâu trên mysql mà còn không được dùng nữa kể từ PHP 5. 5. 0 và đã chính thức bị xóa trong PHP 7. 0

To save digging into your

brew unlink php
brew link --overwrite [email protected]
81 settings to see which module you are using, one option is to search for
brew unlink php
brew link --overwrite [email protected]
73 in your editor of choice. Nếu bất kỳ chức năng nào chẳng hạn như
brew unlink php
brew link --overwrite [email protected]
74 và
brew unlink php
brew link --overwrite [email protected]
75 hiển thị, thì
brew unlink php
brew link --overwrite [email protected]
76 đang được sử dụng

Ngay cả khi bạn không sử dụng PHP 7. x, việc không xem xét nâng cấp này càng sớm càng tốt sẽ dẫn đến khó khăn lớn hơn khi PHP 7. x nâng cấp sắp xảy ra. Tùy chọn tốt nhất là thay thế việc sử dụng mysql bằng mysqli hoặc PDO trong các ứng dụng của bạn trong lịch trình phát triển của riêng bạn để sau này bạn không bị vội vàng

Nếu bạn đang nâng cấp từ mysql lên mysqli, hãy cẩn thận với các hướng dẫn nâng cấp lười biếng gợi ý rằng bạn có thể chỉ cần tìm và thay thế

brew unlink php
brew link --overwrite [email protected]
73 bằng
brew unlink php
brew link --overwrite [email protected]
78. Đó không chỉ là sự đơn giản hóa quá mức mà còn bỏ lỡ những lợi thế mà mysqli mang lại, chẳng hạn như liên kết tham số, cũng được cung cấp trong PDO

Phần mở rộng PDO

PDO là một thư viện trừu tượng hóa kết nối cơ sở dữ liệu — được tích hợp vào PHP từ 5. 1. 0 — that provides a common interface to talk with many different databases. Ví dụ: bạn có thể sử dụng mã cơ bản giống hệt nhau để giao tiếp với MySQL hoặc SQLite

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

Quan trọng hơn,

brew unlink php
brew link --overwrite [email protected]
79 cho phép bạn đưa đầu vào nước ngoài vào một cách an toàn (e. g. ID) vào các truy vấn SQL của bạn mà không phải lo lắng về các cuộc tấn công SQL injection vào cơ sở dữ liệu. Điều này có thể sử dụng các câu lệnh PDO và các tham số ràng buộc

Giả sử tập lệnh PHP nhận ID số làm tham số truy vấn. ID này nên được sử dụng để tìm nạp bản ghi người dùng từ cơ sở dữ liệu. Đây là cách

brew unlink php
brew link --overwrite [email protected]
80 để làm điều này

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

Đây là mã khủng khiếp. You are inserting a raw query parameter into a SQL query. Điều này sẽ giúp bạn bị hack trong tích tắc, sử dụng một phương pháp gọi là SQL Injection. Just imagine if a hacker passes in an inventive

brew unlink php
brew link --overwrite [email protected]
81 parameter by calling a URL like
brew unlink php
brew link --overwrite [email protected]
82. This will set the
brew unlink php
brew link --overwrite [email protected]
83 variable to
brew unlink php
brew link --overwrite [email protected]
84 which will delete all of your users. Thay vào đó, bạn nên làm sạch đầu vào ID bằng các tham số ràng buộc PDO

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

Đây là mã chính xác. Nó sử dụng một tham số ràng buộc trên câu lệnh PDO. Điều này thoát khỏi ID đầu vào nước ngoài trước khi nó được đưa vào cơ sở dữ liệu để ngăn chặn các cuộc tấn công SQL injection tiềm ẩn

Đối với các thao tác ghi, chẳng hạn như CHÈN hoặc CẬP NHẬT, điều đặc biệt quan trọng là vẫn lọc dữ liệu của bạn trước và làm sạch dữ liệu cho những thứ khác (xóa thẻ HTML, JavaScript, v.v.). PDO sẽ chỉ vệ sinh nó cho SQL, không phải cho ứng dụng của bạn

Bạn cũng nên lưu ý rằng các kết nối cơ sở dữ liệu sử dụng hết tài nguyên và việc cạn kiệt tài nguyên không phải là hiếm nếu các kết nối không được đóng hoàn toàn, tuy nhiên điều này phổ biến hơn ở các ngôn ngữ khác. Using PDO you can implicitly close the connection by destroying the object by ensuring all remaining references to it are deleted, i. e. đặt thành NULL. Nếu bạn không làm điều này một cách rõ ràng, PHP sẽ tự động đóng kết nối khi tập lệnh của bạn kết thúc - tất nhiên là trừ khi bạn đang sử dụng các kết nối liên tục

Tương tác với cơ sở dữ liệu

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

Đây là một cách làm không tốt vì đủ loại lý do, chủ yếu là khó gỡ lỗi, khó kiểm tra, khó đọc và sẽ xuất ra rất nhiều trường nếu bạn không đặt giới hạn ở đó

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

Đó là một khởi đầu tốt. Đặt hai mục đó vào hai tệp khác nhau và bạn đã có một số phân tách rõ ràng

Tạo một lớp để đặt phương thức đó vào và bạn có một “Mô hình”. Create a simple

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

người mẫu/FooModel. php

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

lượt xem/danh sách foo. php

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

Điều này về cơ bản giống như những gì mà hầu hết các framework hiện đại đang làm, mặc dù thủ công hơn một chút. Bạn có thể không cần phải làm tất cả những điều đó mọi lúc, nhưng trộn lẫn quá nhiều logic trình bày và tương tác cơ sở dữ liệu có thể là một vấn đề thực sự nếu bạn muốn kiểm tra đơn vị ứng dụng của mình

Lớp trừu tượng

Nhiều khung cung cấp lớp trừu tượng của riêng chúng, có thể có hoặc không nằm trên PDO. 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. Tất nhiên, điều này sẽ thêm một chút chi phí, nhưng nếu bạn đang xây dựng một ứng dụng di động cần hoạt động với MySQL, PostgreSQL và SQLite thì một chút chi phí sẽ đáng giá vì mục đích làm sạch mã

Một số lớp trừu tượng đã được xây dựng bằng cách sử dụng các tiêu chuẩn không gian tên PSR-0 hoặc PSR-4 để có thể được cài đặt trong bất kỳ ứng dụng nào bạn muốn

Templates provide a convenient way of separating your controller and domain logic from your presentation logic. Các mẫu thường chứa HTML của ứng dụng của bạn, nhưng cũng có thể được sử dụng cho các định dạng khác, chẳng hạn như XML. Các mẫu thường được gọi là "các khung nhìn", tạo thành một phần của thành phần thứ hai của mẫu kiến ​​trúc phần mềm mô hình–khung nhìn–bộ điều khiển (MVC)

Lợi ích

The main benefit to using templates is the clear separation they create between the presentation logic and the rest of your application. Các mẫu có trách nhiệm duy nhất là hiển thị nội dung được định dạng. Họ không chịu trách nhiệm tra cứu dữ liệu, kiên trì hoặc các nhiệm vụ phức tạp khác. Điều này dẫn đến mã sạch hơn, dễ đọc hơn, đặc biệt hữu ích trong môi trường nhóm nơi các nhà phát triển làm việc trên mã phía máy chủ (bộ điều khiển, mô hình) và nhà thiết kế làm việc trên mã phía máy khách (đánh dấu)

Các mẫu cũng cải thiện việc tổ chức mã trình bày. Các mẫu thường được đặt trong một thư mục “lượt xem”, mỗi mẫu được xác định trong một tệp. 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

Cuối cùng, tùy thuộc vào thư viện bạn sử dụng, các mẫu có thể cung cấp bảo mật cao hơn bằng cách tự động thoát khỏi nội dung do người dùng tạo. Some libraries even offer sand-boxing, where template designers are only given access to white-listed variables and functions

Mẫu PHP đơn giản

Các mẫu PHP đơn giản là các mẫu đơn giản sử dụng mã PHP gốc. Chúng là một lựa chọn tự nhiên vì PHP thực sự là một ngôn ngữ mẫu. That simply means that you can combine PHP code within other code, like HTML. Điều này có lợi cho các nhà phát triển PHP vì không có cú pháp mới để tìm hiểu, họ biết các chức năng có sẵn cho họ và trình soạn thảo mã của họ đã tích hợp tính năng tô sáng cú pháp và tự động hoàn thành PHP. 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. Bên ngoài các khung, các thư viện như Tấm hoặc Aura. Chế độ xem giúp làm việc với các mẫu PHP đơn giản dễ dàng hơn bằng cách cung cấp chức năng mẫu hiện đại như kế thừa, bố cục và tiện ích mở rộng

Ví dụ đơn giản về mẫu PHP đơn giản

Using the Plates library

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

Ví dụ về các mẫu PHP đơn giản sử dụng tính kế thừa

Using the Plates library

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

Mẫu đã biên dịch

Mặc dù PHP đã phát triển thành một ngôn ngữ hướng đối tượng trưởng thành, nhưng nó vẫn chưa được cải thiện nhiều như một ngôn ngữ tạo khuôn mẫu. Các mẫu đã biên dịch, như Twig, Brainy hoặc Smarty*, lấp đầy khoảng trống này bằng cách cung cấp một cú pháp mới được thiết kế riêng cho việc tạo khuôn mẫu. Từ thoát tự động, kế thừa và cấu trúc điều khiển đơn giản hóa, các mẫu đã biên dịch được thiết kế để dễ viết hơn, dễ đọc hơn và an toàn hơn khi sử dụng. Các mẫu đã biên dịch thậm chí có thể được chia sẻ trên các ngôn ngữ khác nhau, Bộ ria mép là một ví dụ điển hình về điều này. Vì các mẫu này phải được biên dịch nên có một chút ảnh hưởng về hiệu suất, tuy nhiên điều này rất nhỏ khi sử dụng bộ nhớ đệm thích hợp

*Mặc dù Smarty cung cấp khả năng thoát tự động, nhưng tính năng này KHÔNG được bật theo mặc định

Simple example of a compiled template

Using the Twig library

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

Ví dụ về các mẫu được biên dịch bằng cách sử dụng tính kế thừa

Using the Twig library

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

Further Reading

Bài báo & Hướng dẫn

thư viện

lỗi

Trong nhiều ngôn ngữ lập trình “nặng về ngoại lệ”, bất cứ khi nào xảy ra sự cố, một ngoại lệ sẽ được đưa ra. This is certainly a viable way to do things, but PHP is an “exception-light” programming language. Mặc dù nó có ngoại lệ và nhiều lõi bắt đầu sử dụng chúng khi làm việc với các đối tượng, nhưng hầu hết bản thân PHP sẽ cố gắng tiếp tục xử lý bất kể điều gì xảy ra, trừ khi xảy ra lỗi nghiêm trọng

Ví dụ

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

Đây chỉ là một lỗi thông báo và PHP sẽ vui vẻ tiếp tục. Điều này có thể gây nhầm lẫn cho những người đến từ các ngôn ngữ “nặng về ngoại lệ”, bởi vì việc tham chiếu một biến bị thiếu trong Python chẳng hạn sẽ tạo ra một ngoại lệ

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

Sự khác biệt thực sự duy nhất là Python sẽ lo lắng về bất kỳ điều nhỏ nhặt nào, do đó các nhà phát triển có thể chắc chắn rằng mọi vấn đề tiềm ẩn hoặc trường hợp cạnh được phát hiện, trong khi PHP sẽ tiếp tục xử lý trừ khi có điều gì đó nghiêm trọng xảy ra, tại thời điểm đó, nó sẽ ném ra một

Mức độ nghiêm trọng của lỗi

PHP có một số mức độ nghiêm trọng của lỗi. Ba loại thông báo phổ biến nhất là lỗi, thông báo và cảnh báo. These have different levels of severity;

brew unlink php
brew link --overwrite [email protected]
86,
brew unlink php
brew link --overwrite [email protected]
87, and
brew unlink php
brew link --overwrite [email protected]
88. Lỗi là lỗi nghiêm trọng trong thời gian chạy và thường do lỗi trong mã của bạn gây ra và cần được sửa vì chúng sẽ khiến PHP ngừng thực thi. Thông báo là các thông báo tư vấn do mã gây ra có thể hoặc không gây ra sự cố trong quá trình thực thi tập lệnh, quá trình thực thi không bị tạm dừng. Cảnh báo là lỗi không nghiêm trọng, việc thực thi tập lệnh sẽ không bị tạm dừng

Một loại thông báo lỗi khác được báo cáo tại thời điểm biên dịch là thông báo

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

Thay đổi hành vi báo cáo lỗi của PHP

Báo cáo lỗi có thể được thay đổi bằng cách sử dụng cài đặt PHP và/hoặc lệnh gọi hàm PHP. Sử dụng hàm PHP tích hợp sẵn

brew unlink php
brew link --overwrite [email protected]
90, bạn có thể đặt mức lỗi trong khoảng thời gian thực thi tập lệnh bằng cách chuyển một trong các hằng số mức lỗi được xác định trước, nghĩa là nếu bạn chỉ muốn xem Lỗi và Cảnh báo - chứ không phải Thông báo - thì bạn có thể định cấu hình

brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
91. Bạn đặt toán tử này ở đầu biểu thức và bất kỳ lỗi nào là kết quả trực tiếp của biểu thức đều bị tắt

brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
92 if it exists, but will simply return a null and print nothing if the variable
brew unlink php
brew link --overwrite [email protected]
93 or
brew unlink php
brew link --overwrite [email protected]
94 key does not exist. Nếu không có toán tử kiểm soát lỗi, biểu thức này có thể tạo ra lỗi
brew unlink php
brew link --overwrite [email protected]
95 hoặc
brew unlink php
brew link --overwrite [email protected]
96

Điều này có vẻ như là một ý tưởng hay, nhưng có một vài sự đánh đổi không mong muốn. PHP xử lý các biểu thức sử dụng

brew unlink php
brew link --overwrite [email protected]
97 theo cách kém hiệu quả hơn so với các biểu thức không có
brew unlink php
brew link --overwrite [email protected]
97. Tối ưu hóa sớm có thể là gốc rễ của tất cả các đối số lập trình, nhưng nếu hiệu suất đặc biệt quan trọng đối với ứng dụng/thư viện của bạn thì điều quan trọng là phải hiểu ý nghĩa hiệu suất của toán tử kiểm soát lỗi

Thứ hai, người vận hành kiểm soát lỗi hoàn toàn chấp nhận lỗi. Lỗi không được hiển thị và lỗi không được gửi đến nhật ký lỗi. Ngoài ra, các hệ thống PHP chứng khoán/sản xuất không có cách nào để tắt toán tử kiểm soát lỗi. Mặc dù bạn có thể đúng rằng lỗi bạn đang thấy là vô hại, nhưng một lỗi khác, ít vô hại hơn sẽ không gây ra lỗi gì

Nếu có một cách để tránh toán tử chặn lỗi, bạn nên xem xét nó. Ví dụ, mã của chúng tôi ở trên có thể được viết lại như thế này

brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
99 không tìm thấy tệp để tải. Bạn có thể kiểm tra sự tồn tại của tệp trước khi thử tải nó, nhưng nếu tệp bị xóa sau khi kiểm tra và trước
phpcbf -w --standard=PSR1 file.php
500 (điều này nghe có vẻ không khả thi, nhưng nó có thể xảy ra) thì
phpcbf -w --standard=PSR1 file.php
500 sẽ trả về false và báo lỗi. Đây có khả năng là điều mà PHP nên giải quyết, nhưng là một trường hợp mà việc loại bỏ lỗi có vẻ như là giải pháp hợp lệ duy nhất

Trước đó, chúng tôi đã đề cập rằng không có cách nào trong hệ thống PHP gốc để tắt toán tử kiểm soát lỗi. Tuy nhiên, Xdebug có cài đặt ini

phpcbf -w --standard=PSR1 file.php
502 sẽ tắt toán tử kiểm soát lỗi. Bạn có thể thiết lập điều này thông qua tệp
brew unlink php
brew link --overwrite [email protected]
81 của mình với thông tin sau

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

Bạn cũng có thể đặt giá trị này trong thời gian chạy bằng hàm

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

brew unlink php
brew link --overwrite [email protected]
6
phpcbf -w --standard=PSR1 file.php
505

Điều này hữu ích nhất khi bạn đang gỡ lỗi mã và nghi ngờ lỗi thông tin bị chặn. Sử dụng tiếng hét một cách cẩn thận và như một công cụ gỡ lỗi tạm thời. Có rất nhiều mã thư viện PHP có thể không hoạt động khi tắt toán tử kiểm soát lỗi

ErrorException

PHP hoàn toàn có khả năng trở thành ngôn ngữ lập trình “nặng về ngoại lệ” và chỉ yêu cầu một vài dòng mã để thực hiện chuyển đổi. Về cơ bản, bạn có thể biến “lỗi” của mình thành “ngoại lệ” bằng cách sử dụng lớp

phpcbf -w --standard=PSR1 file.php
506, mở rộng lớp
phpcbf -w --standard=PSR1 file.php
507

Đây là một thực tế phổ biến được thực hiện bởi một số lượng lớn các khung hiện đại như Symfony và Laravel. Trong chế độ gỡ lỗi (hoặc chế độ nhà phát triển), cả hai khung này sẽ hiển thị dấu vết ngăn xếp đẹp và rõ ràng

Ngoài ra còn có một số gói có sẵn để xử lý và báo cáo lỗi và ngoại lệ tốt hơn. thích Rất tiếc. , đi kèm với cài đặt mặc định của Laravel và cũng có thể được sử dụng trong bất kỳ khung nào

Bằng cách loại bỏ lỗi dưới dạng ngoại lệ trong quá trình phát triển, bạn có thể xử lý chúng tốt hơn so với kết quả thông thường và nếu bạn thấy một ngoại lệ trong quá trình phát triển, bạn có thể gói nó trong một câu lệnh bắt kèm theo hướng dẫn cụ thể về cách xử lý tình huống. Mỗi ngoại lệ bạn nắm bắt ngay lập tức làm cho ứng dụng của bạn mạnh mẽ hơn một chút

Thông tin thêm về điều này và chi tiết về cách sử dụng

phpcbf -w --standard=PSR1 file.php
506 với xử lý lỗi có thể được tìm thấy tại ErrorException Class

phpcbf -w --standard=PSR1 file.php
509 thường sẽ chỉ nhận được một
phpcbf -w --standard=PSR1 file.php
510 và một cảnh báo. Nhiều khung công tác PHP cũ hơn như CodeIgniter sẽ chỉ trả về giá trị sai, ghi một thông báo vào nhật ký độc quyền của chúng và có thể cho phép bạn sử dụng một phương thức như
phpcbf -w --standard=PSR1 file.php
511 để xem điều gì đã xảy ra. Vấn đề ở đây là bạn phải đi tìm lỗi và kiểm tra tài liệu để xem phương thức lỗi của lớp này là gì, thay vì để nó trở nên cực kỳ rõ ràng

Một vấn đề khác là khi các lớp tự động đưa ra lỗi trên màn hình và thoát khỏi quy trình. Khi bạn làm điều này, bạn ngăn không cho nhà phát triển khác có thể tự động xử lý lỗi đó. Nên đưa ra các ngoại lệ để nhà phát triển nhận biết được lỗi; . e. g

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

Ngoại lệ SPL

Lớp chung chung

phpcbf -w --standard=PSR1 file.php
507 cung cấp rất ít ngữ cảnh gỡ lỗi cho nhà phát triển;

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

Trong PHP5. 5

phpcbf -w --standard=PSR1 file.php
518 đã được giới thiệu. Tại thời điểm này, nó đang sử dụng BCrypt, thuật toán mạnh nhất hiện được hỗ trợ bởi PHP. Nó sẽ được cập nhật trong tương lai để hỗ trợ nhiều thuật toán hơn khi cần thiết. Thư viện
phpcbf -w --standard=PSR1 file.php
519 được tạo để cung cấp khả năng tương thích chuyển tiếp cho PHP >= 5. 3. 7

Dưới đây chúng tôi băm một chuỗi, sau đó kiểm tra hàm băm đối với một chuỗi mới. Bởi vì hai chuỗi nguồn của chúng tôi khác nhau ('mật khẩu bí mật' so với. ‘bad-password’) đăng nhập này sẽ thất bại

Các hàm
brew unlink php
brew link --overwrite [email protected]
6
brew unlink php
brew link --overwrite [email protected]
71____1522 và
phpcbf -w --standard=PSR1 file.php
523 có thể làm sạch văn bản và xác thực các định dạng văn bản (e. g. địa chỉ thư điện tử)

Đầu vào nước ngoài có thể là bất cứ điều gì. Dữ liệu đầu vào biểu mẫu

phpcbf -w --standard=PSR1 file.php
524 và
phpcbf -w --standard=PSR1 file.php
525, một số giá trị trong siêu toàn cầu
phpcbf -w --standard=PSR1 file.php
526 và phần thân yêu cầu HTTP thông qua
phpcbf -w --standard=PSR1 file.php
527. Hãy nhớ rằng, đầu vào nước ngoài không giới hạn ở dạng dữ liệu do người dùng gửi. Các tệp đã tải lên và tải xuống, giá trị phiên, dữ liệu cookie và dữ liệu từ các dịch vụ web của bên thứ ba cũng là đầu vào nước ngoài

Mặc dù dữ liệu nước ngoài có thể được lưu trữ, kết hợp và truy cập sau đó nhưng nó vẫn là đầu vào nước ngoài. Mỗi khi bạn xử lý, xuất, nối hoặc bao gồm dữ liệu trong mã của mình, hãy tự hỏi liệu dữ liệu có được lọc đúng cách không và dữ liệu đó có đáng tin cậy không

Dữ liệu có thể được lọc khác nhau dựa trên mục đích của nó. Ví dụ: khi đầu vào nước ngoài chưa được lọc được chuyển vào đầu ra của trang HTML, nó có thể thực thi HTML và JavaScript trên trang web của bạn. Đây được gọi là Cross-Site Scripting (XSS) và có thể là một cuộc tấn công rất nguy hiểm. Một cách để tránh XSS là làm sạch tất cả dữ liệu do người dùng tạo trước khi xuất nó sang trang của bạn bằng cách xóa các thẻ HTML bằng hàm

phpcbf -w --standard=PSR1 file.php
528 hoặc thoát các ký tự có ý nghĩa đặc biệt thành các thực thể HTML tương ứng của chúng bằng các hàm
brew unlink php
brew link --overwrite [email protected]
59 hoặc
brew unlink php
brew link --overwrite [email protected]
61

Một ví dụ khác là truyền các tùy chọn để thực hiện trên dòng lệnh. Điều này có thể cực kỳ nguy hiểm (và thường là một ý tưởng tồi), nhưng bạn có thể sử dụng hàm

phpcbf -w --standard=PSR1 file.php
531 tích hợp sẵn để làm sạch các đối số của lệnh đã thực thi

Một ví dụ cuối cùng là chấp nhận đầu vào nước ngoài để xác định tệp sẽ tải từ hệ thống tệp. Điều này có thể bị khai thác bằng cách thay đổi tên tệp thành đường dẫn tệp. Bạn cần xóa

phpcbf -w --standard=PSR1 file.php
532,
phpcbf -w --standard=PSR1 file.php
533, byte rỗng hoặc các ký tự khác khỏi đường dẫn tệp để đường dẫn không thể tải các tệp ẩn, không công khai hoặc nhạy cảm

vệ sinh

Sanitization xóa (hoặc thoát) các ký tự không hợp lệ hoặc không an toàn khỏi đầu vào nước ngoài

Ví dụ: bạn nên làm sạch đầu vào nước ngoài trước khi đưa đầu vào vào HTML hoặc chèn nó vào một truy vấn SQL thô. Khi bạn sử dụng các tham số ràng buộc với PDO, nó sẽ khử trùng đầu vào cho bạn

Đôi khi nó được yêu cầu cho phép một số thẻ HTML an toàn trong đầu vào khi đưa nó vào trang HTML. Điều này rất khó thực hiện và nhiều người tránh nó bằng cách sử dụng các định dạng hạn chế khác như Markdown hoặc BBCode, mặc dù các thư viện danh sách trắng như HTML Purifier tồn tại vì lý do này

Xem Bộ lọc Vệ sinh

Unserialization

Thật nguy hiểm đối với dữ liệu

phpcbf -w --standard=PSR1 file.php
534 từ người dùng hoặc các nguồn không đáng tin cậy khác. Làm như vậy có thể cho phép người dùng độc hại khởi tạo các đối tượng (với các thuộc tính do người dùng xác định) mà các hàm hủy của chúng sẽ được thực thi, ngay cả khi bản thân các đối tượng đó không được sử dụng. Do đó, bạn nên tránh hủy xác thực dữ liệu không đáng tin cậy

Nếu bạn hoàn toàn phải hủy xác thực dữ liệu từ các nguồn không đáng tin cậy, hãy sử dụng tùy chọn

phpcbf -w --standard=PSR1 file.php
535 của PHP 7 để hạn chế loại đối tượng nào được phép hủy xác thực

Thẩm định

Xác thực đảm bảo rằng đầu vào nước ngoài là những gì bạn mong đợi. Ví dụ: bạn có thể muốn xác thực địa chỉ email, số điện thoại hoặc độ tuổi khi xử lý việc gửi đăng ký

Xem Bộ lọc xác thực

Tệp cấu hình

Khi tạo tệp cấu hình cho ứng dụng của bạn, các phương pháp hay nhất khuyên bạn nên tuân theo một trong các phương pháp sau

  • Bạn nên lưu trữ thông tin cấu hình của mình ở nơi không thể truy cập trực tiếp và lấy thông tin đó qua hệ thống tệp
  • Nếu bạn phải lưu trữ các tệp cấu hình của mình trong thư mục gốc của tài liệu, hãy đặt tên tệp có phần mở rộng là
    brew unlink php
    brew link --overwrite [email protected]
    
    85. Điều này đảm bảo rằng, ngay cả khi tập lệnh được truy cập trực tiếp, nó sẽ không được xuất ra dưới dạng văn bản thuần túy
  • Thông tin trong các tệp cấu hình phải được bảo vệ tương ứng, thông qua mã hóa hoặc quyền hệ thống tệp của nhóm/người dùng
  • Bạn nên đảm bảo rằng mình không 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, cài đặt

phpcbf -w --standard=PSR1 file.php
537 đã bị xóa và không thể sử dụng được nữa. Điều này chỉ được đưa vào như một cảnh báo cho bất kỳ ai trong quá trình nâng cấp ứng dụng cũ

Khi được bật, cài đặt cấu hình

phpcbf -w --standard=PSR1 file.php
537 sẽ tạo ra một số loại biến (bao gồm cả những biến từ
phpcbf -w --standard=PSR1 file.php
525,
phpcbf -w --standard=PSR1 file.php
524 và
phpcbf -w --standard=PSR1 file.php
541) có sẵn trong phạm vi toàn cầu của ứng dụng của bạn. Điều này có thể dễ dàng dẫn đến các vấn đề bảo mật vì ứng dụng của bạn không thể xác định một cách hiệu quả dữ liệu đến từ đâu

Ví dụ.

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

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

phpcbf -w --standard=PSR1 file.php
537 đã tắt

Báo cáo lỗi

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

Sự phát triển

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

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

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

Truyền vào giá trị

phpcbf -w --standard=PSR1 file.php
546 sẽ hiển thị mọi lỗi có thể xảy ra, ngay cả khi các cấp độ và hằng số mới được thêm vào trong các phiên bản PHP trong tương lai. Hằng số
phpcbf -w --standard=PSR1 file.php
547 cũng hoạt động theo cách này kể từ PHP 5. 4. - php. mạng lưới

Hằng số mức lỗi

brew unlink php
brew link --overwrite [email protected]
89 đã được giới thiệu trong 5. 3. 0 và không phải là một phần của
phpcbf -w --standard=PSR1 file.php
547, tuy nhiên nó đã trở thành một phần của
phpcbf -w --standard=PSR1 file.php
547 trong 5. 4. 0. Điều đó có nghĩa là gì? . 3 có nghĩa là bạn phải sử dụng
phpcbf -w --standard=PSR1 file.php
546 hoặc
phpcbf -w --standard=PSR1 file.php
552

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

  • < 5. 3
    phpcbf -w --standard=PSR1 file.php
    
    546 hoặc
    phpcbf -w --standard=PSR1 file.php
    
    547
  • 5. 3
    phpcbf -w --standard=PSR1 file.php
    
    546 hoặc
    phpcbf -w --standard=PSR1 file.php
    
    552
  • > 5. 3
    phpcbf -w --standard=PSR1 file.php
    
    546 hoặc
    phpcbf -w --standard=PSR1 file.php
    
    547

Sản xuất

Để ẩn lỗi trên môi trường sản xuất của bạn, hãy định cấu hình

brew unlink php
brew link --overwrite [email protected]
81 của bạn dưới dạng

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

Với các cài đặt này trong sản xuất, lỗi sẽ vẫn được ghi vào nhật ký lỗi cho máy chủ web, nhưng sẽ không được hiển thị cho người dùng. Để biết thêm thông tin về các cài đặt này, hãy xem hướng dẫn sử dụng PHP

Viết các bài kiểm tra tự động cho mã PHP của bạn được coi là cách thực hành tốt nhất và có thể dẫn đến các ứng dụng được xây dựng tốt. Kiểm thử tự động là một công cụ tuyệt vời để đảm bảo ứng dụng của bạn không bị hỏng khi bạn thực hiện thay đổi hoặc thêm chức năng mới và không nên bỏ qua

Có một số loại công cụ kiểm tra (hoặc khung) khác nhau có sẵn cho PHP, sử dụng các cách tiếp cận khác nhau - tất cả đều cố gắng tránh kiểm tra thủ công và nhu cầu về các nhóm Đảm bảo chất lượng lớn, chỉ để đảm bảo những thay đổi gần đây không phá vỡ hiện có

Hướng phát triển thử nghiệm

từ Wikipedia

Phát triển dựa trên thử nghiệm (TDD) là một quy trình phát triển phần mềm dựa trên sự lặp lại của một chu kỳ phát triển rất ngắn. đầu tiên, nhà phát triển viết một trường hợp thử nghiệm tự động bị lỗi xác định cải tiến mong muốn hoặc chức năng mới, sau đó tạo mã để vượt qua thử nghiệm đó và cuối cùng tái cấu trúc mã mới theo tiêu chuẩn chấp nhận được. Kent Beck, người được cho là đã phát triển hoặc 'khám phá lại' kỹ thuật này, đã tuyên bố vào năm 2003 rằng TDD khuyến khích các thiết kế đơn giản và truyền cảm hứng cho sự tự tin.

Có một số loại thử nghiệm khác nhau mà bạn có thể thực hiện cho ứng dụng của mình

Kiểm tra đơn vị

Kiểm tra đơn vị là một phương pháp lập trình để đảm bảo các chức năng, lớp và phương thức hoạt động như mong đợi, từ thời điểm bạn xây dựng chúng trong suốt chu kỳ phát triển. Bằng cách kiểm tra các giá trị vào và ra của các hàm và phương thức khác nhau, bạn có thể đảm bảo logic bên trong đang hoạt động chính xác. Bằng cách sử dụng Dependency Injection và xây dựng các lớp và sơ khai “giả”, bạn có thể xác minh rằng các phần phụ thuộc được sử dụng đúng cách để có phạm vi kiểm tra tốt hơn

Khi bạn tạo một lớp hoặc chức năng, bạn nên tạo một bài kiểm tra đơn vị cho từng hành vi mà nó phải có. Ở cấp độ rất cơ bản, bạn nên đảm bảo rằng nó bị lỗi nếu bạn gửi cho nó các đối số không hợp lệ và đảm bảo rằng nó hoạt động nếu bạn gửi cho nó các đối số hợp lệ. Điều này sẽ giúp đảm bảo rằng khi bạn thực hiện các thay đổi đối với lớp hoặc chức năng này sau này trong chu kỳ phát triển thì chức năng cũ vẫn tiếp tục hoạt động như mong đợi. Giải pháp thay thế duy nhất cho điều này sẽ là

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

từ Wikipedia

Kiểm thử tích hợp (đôi khi được gọi là Kiểm thử và Tích hợp, viết tắt là “I&T”) là giai đoạn kiểm thử phần mềm trong đó các mô-đun phần mềm riêng lẻ được kết hợp và kiểm thử theo nhóm. Nó xảy ra sau khi kiểm tra đơn vị và trước khi kiểm tra xác nhận. 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

Đôi khi còn được gọi là thử nghiệm chấp nhận, thử nghiệm chức năng bao gồm việc sử dụng các công cụ để tạo các thử nghiệm tự động thực sự sử dụng ứng dụng của bạn thay vì chỉ xác minh rằng các đơn vị mã riêng lẻ đang hoạt động chính xác và các đơn vị riêng lẻ có thể giao tiếp với nhau một cách chính xác. Các công cụ này thường hoạt động bằng cách sử dụng dữ liệu thực và mô phỏng người dùng thực của ứng dụng

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

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

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

Có hai loại Phát triển theo định hướng hành vi (BDD) khác nhau. SpecBDD và StoryBDD. SpecBDD tập trung vào hành vi kỹ thuật của mã, trong khi StoryBDD tập trung vào hành vi hoặc tương tác kinh doanh hoặc tính năng. PHP có các khung cho cả hai loại BDD

Với StoryBDD, bạn viết những câu chuyện mà con người có thể đọc được để mô tả hành vi của ứng dụng của bạn. Những câu chuyện này sau đó có thể được chạy dưới dạng thử nghiệm thực tế đối với ứng dụng của bạn. Khung được sử dụng trong các ứng dụng PHP cho StoryBDD là Behat, được lấy cảm hứng từ dự án Ruby’s Cucumber và triển khai Gherkin DSL để mô tả hành vi của tính năng

Với SpecBDD, bạn viết các thông số kỹ thuật mô tả cách thức hoạt động của mã thực tế của bạn. Thay vì kiểm tra một hàm hoặc phương thức, bạn đang mô tả cách thức hoạt động của hàm hoặc phương thức đó. PHP cung cấp khung công tác PHPSpec cho mục đích này. Khung này được lấy cảm hứng từ dự án RSpec cho Ruby

  • Behat, khung StoryBDD cho PHP, lấy cảm hứng từ dự án Ruby’s Cucumber;
  • PHPSpec, khung công tác SpecBDD cho PHP, lấy cảm hứng từ dự án RSpec của Ruby;
  • Codeception là một khung thử nghiệm toàn ngăn xếp sử dụng các nguyên tắc BDD

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

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

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

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

Gần đây PaaS đã trở thành một phương pháp phổ biến để triển khai, lưu trữ và nhân rộng các ứng dụng PHP ở mọi quy mô. Bạn có thể tìm thấy 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ụ chung của việc triển khai phần mềm. Công cụ triển khai không phải là một phần của phần mềm của bạn, nó hoạt động trên phần mềm của bạn từ 'bên ngoài'

Có rất nhiều công cụ nguồn mở có sẵn để giúp bạn triển khai và tự động hóa bản dựng, một số được viết bằng PHP, một số khác thì không. Điều này sẽ không cản trở bạn sử dụng chúng, nếu chúng phù hợp hơn cho công việc cụ thể. Đây là vài ví dụ

Phing có thể kiểm soát quy trình đóng gói, triển khai hoặc thử nghiệm của bạn từ bên trong tệp bản dựng XML. Phing (dựa trên Apache Ant) cung cấp một tập hợp phong phú các tác vụ thường cần thiết để cài đặt hoặc cập nhật ứng dụng web và có thể được mở rộng với các tác vụ tùy chỉnh bổ sung, được viết bằng PHP. Đây là một công cụ chắc chắn và mạnh mẽ và đã xuất hiện từ lâu, tuy nhiên, công cụ này có thể bị coi là hơi lỗi thời do cách nó xử lý cấu hình (tệp XML)

Capistrano là một hệ thống dành cho các lập trình viên từ trung cấp đến cao cấp để thực thi các lệnh theo cách có cấu trúc, có thể lặp lại trên một hoặc nhiều máy từ xa. Nó được cấu hình sẵn để triển khai các ứng dụng Ruby on Rails, tuy nhiên bạn có thể triển khai thành công các hệ thống PHP với nó. Việc sử dụng thành công Capistrano phụ thuộc vào kiến ​​thức làm việc về Ruby và Rake

Ansistrano là một vài vai trò Ansible để dễ dàng quản lý 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 mạnh mẽ dựa trên Ruby mà bạn có thể xây dựng toàn bộ môi trường máy chủ hoặc hộp ảo của mình với. Nó tích hợp tốt với Amazon Web Services thông qua dịch vụ của họ có tên là OpsWorks

đọc thêm

Hội nhập liên tục

Tích hợp liên tục là một phương pháp phát triển phần mềm trong đó các thành viên trong nhóm tích hợp công việc của họ thường xuyên, thông thường mỗi người tích hợp ít nhất hàng ngày — dẫn đến nhiều lần tích hợp mỗi ngày. Nhiều nhóm nhận thấy rằng cách tiếp cận này giúp giảm đáng kể các 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 đã hoàn thành xuất sắc nhiệm vụ biến việc tích hợp liên tục thành hiện thực ngay cả đối với các dự án nhỏ. Travis CI là một dịch vụ tích hợp liên tục được lưu trữ cho cộng đồng nguồn mở. Nó được tích hợp với GitHub và cung cấp hỗ trợ hạng nhất cho nhiều ngôn ngữ bao gồm PHP

đọc thêm

Chạy ứng dụng của bạn trên các môi trường khác nhau trong quá trình phát triển và sản xuất có thể dẫn đến các lỗi lạ xuất hiện khi bạn phát hành trực tiếp. Cũng rất khó để cập nhật các môi trường phát triển khác nhau với cùng một phiên bản cho tất cả các thư viện được sử dụng khi làm việc với một nhóm các nhà phát triển

Nếu bạn đang phát triển trên Windows và triển khai lên Linux (hoặc bất kỳ thứ gì không phải Windows) hoặc đang phát triển theo nhóm, bạn nên cân nhắc sử dụng máy ảo. Điều này nghe có vẻ phức tạp, nhưng bên cạnh các môi trường ảo hóa được biết đến rộng rãi như VMware hoặc VirtualBox, còn có các công cụ bổ sung có thể giúp bạn thiết lập môi trường ảo chỉ bằng một vài bước đơn giản

lang thang

Vagrant giúp bạn xây dựng các hộp ảo của mình trên các môi trường ảo đã biết và sẽ định cấu hình các môi trường này dựa trên một tệp cấu hình duy nhất. Các hộp này có thể được thiết lập thủ công hoặc bạn có thể sử dụng phần mềm “cung cấp” như Puppet hoặc Chef để thực hiện việc này cho bạn. Cung cấp hộp cơ sở là một cách tuyệt vời để đảm bảo rằng nhiều hộp được thiết lập theo cách giống hệt nhau và loại bỏ nhu cầu duy trì danh sách lệnh “thiết lập” phức tạp của bạn. Bạn cũng có thể “phá hủy” hộp cơ sở của mình và tạo lại nó mà không cần thực hiện nhiều bước thủ công, giúp dễ dàng tạo cài đặt “mới”

Vagrant tạo các thư mục để chia sẻ mã của bạn giữa máy chủ và máy ảo của bạn, điều đó có nghĩa là bạn có thể tạo và chỉnh sửa các tệp của mình trên máy chủ, sau đó chạy mã bên trong máy ảo của bạn

Một sự giúp đỡ nho nhỏ

Nếu bạn cần một chút trợ giúp để bắt đầu sử dụng Vagrant, có một số dịch vụ có thể hữu ích

  • con rối. GUI đơn giản để thiết lập các máy ảo để phát triển PHP. Tập trung nhiều vào PHP. Bên cạnh các máy ảo cục bộ, nó cũng có thể được sử dụng để triển khai cho các dịch vụ đám mây. Việc cung cấp được thực hiện với Puppet
  • khả thi. cung cấp một giao diện dễ sử dụng giúp bạn tạo Ansible Playbooks cho các dự án dựa trên PHP

docker

Docker - a lightweight alternative to a full virtual machine - is so called because it’s all about “containers”. A container is a building block which, in the simplest case, does one specific job, e. g. running a web server. An “image” is the package you use to build the container - Docker has a repository full of them

A typical LAMP application might have three containers. a web server, a PHP-FPM process and MySQL. As with shared folders in Vagrant, you can leave your application files where they are and tell Docker where to find them

You can generate containers from the command line (see example below) or, for ease of maintenance, build a

phpcbf -w --standard=PSR1 file.php
561 file for your project specifying which to create and how they communicate with one another

Docker may help if you’re developing multiple websites and want the separation that comes from installing each on its own virtual machine, but don’t have the necessary disk space or the time to keep everything up to date. It’s efficient. the installation and downloads are quicker, you only need to store one copy of each image however often it’s used, containers need less RAM and share the same OS kernel, so you can have more servers running simultaneously, and it takes a matter of seconds to stop and start them, no need to wait for a full server boot

After installing docker on your machine, you can start a web server with one command. The following will download a fully functional Apache installation with the latest PHP version, map

phpcbf -w --standard=PSR1 file.php
562 to the document root, which you can view at
phpcbf -w --standard=PSR1 file.php
563

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

This will initialize and launch your container.

phpcbf -w --standard=PSR1 file.php
564 makes it run in the background. 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)

Tìm hiểu thêm về 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. Nếu nghi ngờ, hãy bám vào kho lưu trữ chính thức

PHPDocker. io sẽ tự động tạo tất cả các tệp bạn cần cho ngăn xếp LAMP/LEMP đầy đủ tính năng, bao gồm lựa chọn phiên bản PHP và tiện ích mở rộng của bạn

Bản thân PHP khá nhanh, nhưng có thể phát sinh tắc nghẽn khi bạn thực hiện kết nối từ xa, tải tệp, v.v. Rất may, có sẵn nhiều công cụ khác nhau để tăng tốc một số phần nhất định trong ứng dụng của bạn hoặc giảm số lần các tác vụ tốn thời gian khác nhau này cần chạy

bộ nhớ đệm opcode

Khi một tệp PHP được thực thi, trước tiên nó phải được biên dịch thành opcodes (hướng dẫn ngôn ngữ máy cho CPU). Nếu mã nguồn không thay đổi thì các opcode sẽ giống nhau nên bước biên dịch này trở nên lãng phí tài nguyên CPU

Bộ đệm opcode ngăn chặn quá trình biên dịch dư thừa bằng cách lưu trữ opcode trong bộ nhớ và sử dụng lại chúng trong các cuộc gọi liên tiếp. Nó thường sẽ kiểm tra chữ ký hoặc thời gian sửa đổi của tệp trước, trong trường hợp có bất kỳ thay đổi nào

Có khả năng bộ đệm opcode sẽ giúp cải thiện tốc độ đáng kể cho ứng dụng của bạn. Kể từ PHP 5. 5 có một cái được tích hợp sẵn - Zend OPcache. Tùy thuộc vào gói/bản phân phối PHP của bạn, tính năng này thường được bật theo mặc định - hãy kiểm tra opcache. kích hoạt và đầu ra của

brew unlink php
brew link --overwrite [email protected]
60 để đảm bảo. Đối với các phiên bản trước đó, có phần mở rộng PECL

Đọc thêm về bộ đệm opcode

Object Caching

There are times when it can be beneficial to cache individual objects in your code, such as with data that is expensive to get or database calls where the result is unlikely to change. You can use object caching software to hold these pieces of data in memory for extremely fast access later on. If you save these items to a data store after you retrieve them, then pull them directly from the cache for following requests, you can gain a significant improvement in performance as well as reduce the load on your database servers

Many of the popular bytecode caching solutions let you cache custom data as well, so there’s even more reason to take advantage of them. APCu, XCache, and WinCache all provide APIs to save data from your PHP code to their memory cache

The most commonly used memory object caching systems are APCu and memcached. APCu is an excellent choice for object caching, it includes a simple API for adding your own data to its memory cache and is very easy to setup and use. The one real limitation of APCu is that it is tied to the server it’s installed on. Memcached on the other hand is installed as a separate service and can be accessed across the network, meaning that you can store objects in a hyper-fast data store in a central location and many different systems can pull from it

Note that when running PHP as a (Fast-)CGI application inside your webserver, every PHP process will have its own cache, i. e. APCu data is not shared between your worker processes. In these cases, you might want to consider using memcached instead, as it’s not tied to the PHP processes

In a networked configuration APCu will usually outperform memcached in terms of access speed, but memcached will be able to scale up faster and further. If you do not expect to have multiple servers running your application, or do not need the extra features that memcached offers then APCu is probably your best choice for object caching

Example logic using APCu

brew unlink php
brew link --overwrite [email protected]
6
phpcbf -w --standard=PSR1 file.php
568
phpcbf -w --standard=PSR1 file.php
569 explicitly informs us that there is no return; historically omitting the
phpcbf -w --standard=PSR1 file.php
570 statement also results in the same (no return) action

From the Source

People to Follow

It’s difficult to find interesting and knowledgeable PHP community members when you are first starting out. You can find an abbreviated list of PHP community members to get you started at

PHP PaaS Providers

To see which versions these PaaS hosts are running, head over to PHP Versions

Frameworks

Rather than re-invent the wheel, many PHP developers use frameworks to build out web applications. Frameworks abstract away many of the low-level concerns and provide helpful, easy-to-use interfaces to complete common tasks

You do not need to use a framework for every project. Sometimes plain PHP is the right way to go, but if you do need a framework then there are three main types available

  • Micro Frameworks
  • Full-Stack Frameworks
  • Component Frameworks

Micro-frameworks are essentially a wrapper to route a HTTP request to a callback, controller, method, etc as quickly as possible, and sometimes come with a few extra libraries to assist development such as basic database wrappers and the like. They are prominently used to build remote HTTP services

Many frameworks add a considerable number of features on top of what is available in a micro-framework; these are called Full-Stack Frameworks. These often come bundled with ORMs, Authentication packages, etc

Component-based frameworks are collections of specialized and single-purpose libraries. Disparate component-based frameworks can be used together to make a micro- or full-stack framework

Components

As mentioned above “Components” are another approach to the common goal of creating, distributing and implementing shared code. Various component repositories exist, the main two of which are

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

There are also component-based frameworks and component-vendors that offer no framework at all. These projects provide another source of packages which ideally have little to no dependencies on other packages, or specific frameworks

For example, you can use the FuelPHP Validation package, without needing to use the FuelPHP framework itself

Laravel’s Illuminate components will become better decoupled from the Laravel framework. For now, only the components best decoupled from the Laravel framework are listed above

Other Useful Resources

Cheatsheets

More best practices

News around the PHP and web development communities

You can subscribe to weekly newsletters to keep yourself informed on new libraries, latest news, events and general announcements, as well as additional resources being published every now and then

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;

PHP universe

Video Tutorials

YouTube Channels

Books

There are many PHP books; sadly some are now quite old and no longer accurate. In particular, avoid books on “PHP 6”, a version that will now never exist. The next major release of PHP after 5. 6 was “PHP 7”, partly because of this

This section aims to be a living document for recommended books on PHP development in general. If you would like your book to be added, send a PR and it will be reviewed for relevancy

Free Books

Paid Books

  • 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
  • Building Secure PHP Apps - Learn the security basics that a senior developer usually acquires over years of experience, all condensed down into one quick and easy handbook
  • Modernizing Legacy Applications In PHP - Get your code under control in a series of small, specific steps
  • Securing PHP. Core Concepts - A guide to some of the most common security terms and provides some examples of them in every day PHP
  • Scaling PHP - Stop playing sysadmin and get back to coding
  • Signaling PHP - PCNLT signals are a great help when writing PHP scripts that run from the command line
  • Minimum Viable Tests - Long-time PHP testing evangelist Chris Hartjes goes over what he feels is the minimum you need to know to get started
  • Domain-Driven Design in PHP - See real examples written in PHP showcasing Domain-Driven Design Architectural Styles (Hexagonal Architecture, CQRS or Event Sourcing), Tactical Design Patterns, and Bounded Context Integration

PHP User Groups

If you live in a larger city, odds are there’s a PHP user group nearby. You can easily find your local PUG at PHP. ug. Alternate sources might be Meetup. com or a search for

phpcbf -w --standard=PSR1 file.php
571 using your favorite search engine (i. e. Google). If you live in a smaller town, there may not be a local PUG; if that’s the case, start one

Special mention should be made of two global user groups. NomadPHP and PHPWomen. NomadPHP offers twice monthly online user group meetings with presentations by some of the top speakers in the PHP community. PHPWomen is a non-exclusive user group originally targeted towards the women in the PHP world. Membership is open to everyone who supports a more diverse community. PHPWomen provide a network for support, mentorship and education, and generally promote the creating of a “female friendly” and professional atmosphere

Read about User Groups on the PHP Wiki

PHP Conferences

The PHP community also hosts larger regional and national conferences in many countries around the world. Well-known members of the PHP community usually speak at these larger events, so it’s a great opportunity to learn directly from industry leaders

Find a PHP Conference

ElePHPants

ElePHPant is that beautiful mascot of the PHP project with an elephant in its design. It was originally designed for the PHP project in 1998 by Vincent Pontier - spiritual father of thousands of elePHPants around the world - and ten years later adorable plush elephant toys came to birth as well. Now elePHPants are present at many PHP conferences and with many PHP developers at their computers for fun and inspiration

What are the three main ways that PHP is used?

There are three main areas where PHP scripts are used. .
Server-side scripting. This is the most traditional and main target field for PHP. .
Command line scripting. You can make a PHP script to run it without any server or browser. .
Writing desktop applications

What should PHP be used for?

PHP is mostly used for making web servers . It runs on the browser and is also capable of running in the command line. So, if you don't feel like showing your code output in the browser, you can show it in the terminal.

What can be developed using PHP?

PHP is a server-side scripting language that is widely used for web development and business application . The open-source tools and high running speed make PHP one of the most preferred languages for creating interactive websites and web applications.

Which of the following best describes PHP?

Explanation. PHP là ngôn ngữ kịch bản mã nguồn mở phía máy chủ được sử dụng để xây dựng các trang web hoặc ứng dụng web động và tương tác