Học PHP dành cho các nhà phát triển có kinh nghiệm

Trong nỗ lực giúp đỡ một đồng nghiệp, tôi phát hiện ra rằng có rất ít tài nguyên dành cho những người đã là lập trình viên ở các ngôn ngữ khác có thể học PHP. Một cái gì đó không phải là trình độ dành cho người mới bắt đầu, không giải thích các khái niệm lập trình cơ bản … chỉ cần đi sâu vào trọng tâm của những gì làm cho PHP trở nên độc đáo và một số tài nguyên chất lượng được đề xuất để tìm hiểu thêm.
Đây là những gì tôi đã viết ở đây. Đó là tổng quan cấp cao về ngôn ngữ và một số tài nguyên đã được kiểm duyệt để thiết lập và tìm hiểu thêm.
Bắt đầu nào…
Contents
Thiết lập môi trường nhà phát triển cục bộ
Ngay cả khi bạn sẽ không sử dụng một khung công tác chính như Symfony hoặc Laravel … nếu bạn thiết lập một môi trường có thể chạy các khung công tác này, bạn sẽ có mọi thứ mà bạn có thể cần cho hầu hết việc phát triển PHP. Chúng thường bao gồm:
- PHP – thời gian chạy ngôn ngữ
- MySQL – cơ sở dữ liệu
- NGINX hoặc Apache – máy chủ web
- Composer – trình quản lý gói của PHP
Bạn có thích máy ảo không? Sử dụng hộp Vagrant tuyệt vời được tùy chỉnh để phát triển PHP được gọi là Homestead . (Bản thân tôi đã sử dụng cái này.)
Giống như Docker? Thử:
- https://laradock.io/
- https://www.digitalocean.com/community/tech_talks/how-to-create-php-developer-en canh-with-docker-compose
Có / muốn một máy chủ web cục bộ?
XAMPP là một trong những giải pháp phổ biến nhất. Nó là một bản phân phối của Apache có bao gồm MariaDB & PHP.
Nếu bạn đã cài đặt Apache hoặc NGINX cục bộ và muốn phát triển cục bộ mà không cần máy ảo – bạn có thể cài đặt trực tiếp PHP và các phần mở rộng phổ biến nhất của nó. Đây là các lệnh tôi sử dụng trên Ubuntu (Linux) để cài đặt PHP:
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update
sudo apt install -y php7.4 php7.4-common php7.4-cli php7.4-fpm libapache2-mod-php7.4 php-pear php7.4-bcmath php7.4-bz2 php7.4-curl php7.4-dev php7.4-gd php7.4-intl php-gettext php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-soap php7.4-sqlite3 php-xdebug php7.4-xml php7.4-xmlrpc php7.4-zip
Trên Windows, nhiều nhà phát triển sử dụng WAMP . Bạn cũng có thể cài đặt nó trực tiếp bằng WSL (Windows Subsystem For Linux) hoặc sử dụng hướng dẫn cài đặt Windows trong sách hướng dẫn PHP chính thức . Việc chuyển sang WSL2 có nghĩa là người dùng Windows ít nhiều có thể làm theo các hướng dẫn của Linux. Laragon là một môi trường dành cho nhà phát triển khác dành cho Windows.
Người dùng trên Mac thường sử dụng MAMP .
Đối với bản thân tôi, tôi làm việc trên máy Ubuntu và tôi đã cài đặt trực tiếp PHP, MySQL & Apache.
Đây là một số hướng dẫn tuyệt vời để thiết lập môi trường cục bộ:
- Windows: https://netbeans.apache.org/kb/docs/php/configure-php-enosystem-windows.html
- Linux: https://netbeans.apache.org/kb/docs/php/configure-php-enosystem-ubuntu.html
- Mac: https://netbeans.apache.org/kb/docs/php/configure-php-enosystem-mac-os.html
Dùng thử
Bạn sẽ biết mình đã sẵn sàng để tung ra khi bạn có thể chạy:
php -v
trên dòng lệnh và xem thông tin phiên bản PHP.
PHP có một chế độ tương tác dòng lệnh được tích hợp sẵn cho phép bạn nhập và chạy các lệnh PHP để thử mọi thứ. Loại hình:
php -a
Nó sẽ cung cấp cho bạn lời nhắc nơi bạn có thể nhập các dòng mã PHP và khi bạn nhấn enter, nó sẽ chạy các dòng đó và hiển thị đầu ra. Nếu bạn thích sử dụng một cái gì đó như thế này, tôi khuyên bạn nên sử dụng PsySH nâng cao hơn , nó làm được điều tương tự nhưng đẹp hơn nhiều.
Bạn có thể chạy một tệp PHP từ dòng lệnh như sau:
php index.php
PHP cũng có một máy chủ web tích hợp mà bạn có thể sử dụng thay vì phải cài đặt Apache hoặc NGINX. Điều này là tốt để thử nghiệm nhanh chóng. Trên thực tế, phần lớn quá trình phát triển của tôi sử dụng máy chủ web tích hợp sẵn này và cài đặt cục bộ của MySQL. Tôi có Apache nhưng thường không cần nó. Chạy máy chủ web tích hợp trong thư mục có tệp .php như sau:
php -S localhost:8000
Thao tác này sẽ khởi động máy chủ web lắng nghe trên máy chủ và cổng nhất định. Sau đó, nếu bạn truy cập http: // localhost: 8000 / trong trình duyệt của mình, bạn có thể thực thi ứng dụng PHP tồn tại trong thư mục đó.
Lưu ý rằng tệp index.php là điểm nhập cho hầu hết các ứng dụng PHP. URL ở trên sẽ gọi index.php theo mặc định.
Tổng quan về ngôn ngữ PHP
PHP là một ngôn ngữ thông dịch có nghĩa là các chương trình PHP của bạn không được biên dịch trước thời hạn. Khi trình duyệt đưa ra yêu cầu đối với máy chủ web đối với tài nguyên PHP (thường là tệp .php), máy chủ web sẽ cung cấp tất cả các chi tiết của yêu cầu (ví dụ: tham số URL GET, giá trị POST, cookie, tiêu đề, v.v.) cho Trình thông dịch PHP thực thi tệp PHP được yêu cầu. Nếu bạn chỉnh sửa tệp PHP trên máy chủ, thay đổi đó sẽ diễn ra ngay lập tức.
Hầu hết thời gian, tệp index.php là điểm vào của một ứng dụng PHP và nó thường thực hiện một số khởi động và thực thi khung công tác để xử lý các giá trị yêu cầu thường được đóng gói cùng nhau thành một đối tượng Yêu cầu. Các ứng dụng cũ hơn có thể không sử dụng đối tượng Yêu cầu, trong trường hợp đó, các giá trị từ yêu cầu có thể được tìm thấy trong $_GET, $_POST, $_COOKIE, $_SERVER
các mảng siêu toàn cục có thể truy cập từ bất kỳ đâu trong ứng dụng. Các khung công tác hiện đại đặt chúng vào một đối tượng Yêu cầu, sau đó xóa sạch các giá trị siêu toàn cục đó để ngăn chặn các cạm bẫy của các biến toàn cục.
Khi chương trình PHP thực thi, đầu ra được trả về trình duyệt. Một số chương trình gửi đầu ra theo cách đặc biệt bằng cách sử dụng echo()
các câu lệnh và các lệnh tương tự gửi đầu ra đến luồng đầu ra tiêu chuẩn (trở lại máy chủ web gửi nó đến trình duyệt … hoặc tới dòng lệnh). Các ứng dụng hiện đại tập hợp tất cả đầu ra vào một đối tượng Phản hồi được gửi đến trình duyệt cùng một lúc khi kết thúc quá trình thực thi chương trình (một trong những bước cuối cùng của khuôn khổ).
PHP là không trạng thái theo mặc định. Tất cả các biến, đối tượng và kết nối được tạo khi chương trình thực thi một yêu cầu, sẽ không được giữ lại cho yêu cầu tiếp theo. PHP xóa bộ nhớ được sử dụng trong yêu cầu đó và không biết bất cứ điều gì giữa yêu cầu này với yêu cầu tiếp theo. Nhiều yêu cầu đến một máy chủ có thể được thực hiện đồng thời.
Có những cơ chế mà các nhà phát triển PHP sử dụng để duy trì một số bộ nhớ hoặc trạng thái giữa các yêu cầu. Phương pháp phổ biến nhất là Phiên. PHP gửi cho trình duyệt một giá trị ID phiên thường được lưu trữ trong cookie. Trình duyệt sẽ gửi lại ID này với tất cả các yêu cầu trong tương lai. PHP sử dụng ID đó để tìm kiếm các giá trị được lưu trữ trên hệ thống tệp hoặc trong cơ sở dữ liệu (hoặc kho dữ liệu như Redis hoặc Memcached) được liên kết với ID đó. Bằng cách này, PHP có thể ‘ghi nhớ’ khách truy cập giữa các yêu cầu. Tuy nhiên, các giá trị này trong bộ nhớ Phiên phải được đọc từ bộ lưu trữ dữ liệu theo mọi yêu cầu. Chúng được lưu trong một siêu toàn cầu có tên là $ _SESSION có thể được truy cập từ bên trong ứng dụng. Nhiều khung công tác đặt siêu toàn cầu này vào đối tượng Session của riêng chúng.
Đây là một bài viết hay ( https://carlalexander.ca/php-application/ ) về cách hoạt động của PHP bao gồm các chủ đề về đồng thời và đa nhiệm trong PHP.
Các loại trong PHP
PHP là một ngôn ngữ động, được đánh máy yếu. Các biến không được xác định với một kiểu (và không thể là), thay vào đó kiểu được suy ra bởi những gì được gán cho nó và có thể thay đổi nếu một cái gì đó mới được chỉ định.
$something = 1; // Weakly typed as an integer.
$something = "Hello"; // Now it's a string.
Điều này có nghĩa là bạn sẽ tìm thấy rất nhiều kiểu kiểm tra và truyền trong các chương trình PHP:
$age = intval($age); // Make sure $age is an integer.
if( is_int($age) ){
// Do something.
}
Các kiểu buộc và kiểm tra kiểu trên rất phổ biến trong các ứng dụng PHP. Vì tất cả các giá trị được chuyển đến PHP trong yêu cầu từ trình duyệt là các chuỗi, các chương trình PHP thường sẽ chuyển các giá trị này thành các kiểu mong đợi.
Trong những năm gần đây, PHP đã bổ sung các tính năng đánh máy nghiêm ngặt. Điều này có nghĩa là các tham số hàm và phương thức có thể thiết lập rõ ràng một kiểu cho các tham số đến và kiểu trả về. Một ngoại lệ thời gian chạy sẽ được ném ra nếu giá trị đến không phải là kiểu mong đợi. Nếu bạn thấy chỉ thị này:
declare(strict_types=1);
Ở đầu tệp, thì các loại trong tệp đó sẽ được coi là nghiêm ngặt. Điều này có nghĩa là mức độ nghiêm ngặt của loại trong tệp có thể khác nhau. Điều này cho phép các ứng dụng lớn di chuyển sang các loại tệp nghiêm ngặt tại một thời điểm.
Ví dụ:
declare(strict_types=1);
function doSomething(int $id): string {
$id = '' . $id;
// This is allowed in PHP: $id is a string now.
}
doSomething('1'); // This would trigger a TypeError.
doSomething(1); // This would be fine.
A ?
đứng trước một kiểu có nghĩa là giá trị đó là nullable (nó cũng có thể là null).
Hệ thống kiểu của PHP có thể là một nguồn gây nhầm lẫn hoặc lỗi. Code nên biết rõ loại biến là gì tại bất kỳ thời điểm nào và nó có thể thay đổi. Nhiều người khuyên bạn nên sử dụng các loại nghiêm ngặt nếu có thể.
Thông tin thêm về các loại trong PHP:
- https://www.php.net/manual/en/language.types.decl Tuyên bố.php
- https://www.brainbell.com/php/strict-type.html
Mảng PHP – Học cách yêu thích chúng
Một trong những kiểu cấu trúc dữ liệu phổ biến nhất trong PHP là mảng. Các nhà phát triển PHP sử dụng mảng cho mọi thứ – thường thay cho các đối tượng dữ liệu, điều này có thể không phải là ý tưởng tốt nhất! Mảng trong PHP rất linh hoạt vì chúng thực sự là các bản đồ băm. Điều này có nghĩa là khóa mảng không nhất thiết phải tuần tự hoặc thậm chí là số. Việc điền vào một mảng với các chỉ mục số nguyên bị ngắt kết nối không có nghĩa là tất cả các ô của mảng ở giữa sẽ được dành riêng:
$houses[0] = 'Blue';
$houses[55] = 'Red';
printf( array_key_exists(8, $houses) ); // 0 (false)
Các khóa mảng có thể là chuỗi:
$config['username'] = 'tonystark';
$config['password'] = 'ironman123';
// This can also be defined like so:
$config = ['username' => 'tonystark', 'password' => 'ironman123'];
Bạn cũng có thể khai báo một giá trị dưới dạng một mảng trống trước hoặc bạn có thể gán nhiều giá trị sẽ được cung cấp các khóa số, tuần tự bắt đầu từ 0:
$superheros = array(); // empty array.
$superheros = array('Superman', 'Batman', 'Black Widow', 'Ironman');
print_r($superheros); // [0] => Superman, [1] => Batman ...etc
Tất cả các khóa trong một mảng PHP thậm chí không cần phải cùng một kiểu! PHP.net có rất nhiều tài liệu về mảng và PHP cung cấp nhiều hàm tích hợp sẵn để sắp xếp và thao tác với mảng.
Cú pháp PHP
Cú pháp của PHP hơi liên quan đến C. Một số điểm nổi bật:
- Tất cả các biến đều bắt đầu bằng a
$
. Tên lớp, tên phương thức và hàm thì không. - Tất cả các câu lệnh đều kết thúc bằng a
;
. - Các cấu trúc điều khiển được bao bọc trong dấu ngoặc nhọn
{}
. - Khoảng trắng và thụt lề không thành vấn đề.
- Mã PHP bắt đầu bằng
<?php
(đôi khi chỉ là<?
viết tắt) và kết thúc bằng a?>
. Mã này có thể được xen kẽ trong HTML thông thường … nhưng các ứng dụng hiện đại không làm điều đó nữa. Nếu tệp kết thúc bằng mã PHP, thẻ đóng sẽ bị tắt. - Chuỗi có thể được gói trong dấu ngoặc kép hoặc đơn. Các ký tự đặc biệt (như
\n
dòng mới) sẽ chỉ được nhận dạng trong dấu ngoặc kép. - Nhiều dự án có hướng dẫn tiêu chuẩn mã hóa hoặc chính sách lỏng lẻo để giữ mọi thứ nhất quán. Ví dụ, tên lớp bắt đầu bằng viết hoa.
Bài viết này cung cấp một cái nhìn tổng quan nhanh về cú pháp PHP:
Phân tích mã
Cộng đồng PHP đã tạo ra nhiều công cụ tuyệt vời cho phép bạn thực hiện phân tích về kiểu dáng, chất lượng và thậm chí là tính đúng đắn của mã PHP của bạn. Các công cụ phân tích tĩnh này có thể có giá trị để giúp duy trì các dự án của bạn theo một phong cách mã hóa đã định hoặc để tìm mùi mã trong ứng dụng của bạn. Mặc dù có nhiều công cụ phân tích PHP để lựa chọn, nhưng một số công cụ phổ biến là:
- PHP Code Sniffer
- PHP Stan
- Thánh vịnh
- Phan
- PHP CPD (Trình phát hiện Sao chép-Dán)
Tự động tải và soạn nhạc
Nếu điểm nhập ứng dụng PHP của bạn là tệp index.php … thì sẽ không có tệp nào khác của mã nguồn được chạy hoặc tham chiếu trừ khi chúng được đưa vào tệp được yêu cầu. Vì vậy, nếu bạn chạy một tệp “test.php”, chỉ có mã trong tệp đó sẽ khả dụng. Các dự án trước đây sẽ sử dụng một số câu lệnh bao gồm hoặc yêu cầu để đưa mã khác vào:
<?php
// File index.php
require('config.php'); // Execution will stop if this file is not found.
include('functions.php'); // If the file isn't found, execution continues anyway.
require_once('user.php'); // Ensure this isn't included multiple times.
$foo = 'bar';
Bạn có thể thấy nhiều bao gồm như trên ở đầu tệp index.php, tệp này sẽ mang lại các định nghĩa lớp, hàm, v.v. mà ứng dụng cần.
Các ứng dụng PHP hiện đại không sử dụng bao gồm như thế này nữa. Composer là trình quản lý gói cho PHP . Nó cũng cung cấp một trình tải tự động sẽ tự động bao gồm các tệp lớp (định nghĩa đối tượng), chỉ khi ứng dụng cần chúng. Điều này ngăn chặn việc bao gồm mã không bao giờ được sử dụng. Composer khi được cấu hình trong một dự án sẽ tạo ra một vendor/
thư mục nơi nó sẽ đặt autoloader và bất kỳ gói nào đã cài đặt. Nếu bạn thấy thư mục của nhà cung cấp hoặc tệp composer.json ở thư mục gốc của một dự án, đó là cách bạn có thể biết rằng Composer đang được sử dụng. Đừng ngạc nhiên nếu nhiều ứng dụng cũ không sử dụng nó. PEAR là một hệ thống cũ hơn được sử dụng để cài đặt các gói vào các dự án PHP.
Trong trường hợp sử dụng tính năng tự động tải của Trình soạn nhạc, bạn sẽ thấy thông báo này ở đầu mỗi tệp trong ứng dụng:
require_once 'vendor/autoload.php';
Composer cho phép chúng tôi lấy các phần phụ thuộc (như các dự án mã nguồn mở được tìm thấy trên Packagist ) và chúng sẽ được cài đặt trong thư mục của nhà cung cấp và có sẵn ngay lập tức cho các dự án của chúng tôi. Chúng tôi có thể ghim chúng vào số phiên bản nhất định, cập nhật các phụ thuộc của chúng tôi và khai báo một số gói chỉ dành cho môi trường nhà phát triển (như các công cụ kiểm tra và phân tích tĩnh).
Hiểu và học Composer rất phù hợp cho sự phát triển PHP hiện đại. Phần giới thiệu về Composer được tìm thấy tại đây: https://getcomposer.org/doc/00-intro.md .
Tài nguyên PHP & Nhìn về phía trước
PHP là một ngôn ngữ rất cũ và các hướng dẫn, câu trả lời của StackOverflow và các bài đăng trên blog về PHP mà bạn có thể tìm thấy trên mạng có thể rất lỗi thời và bao gồm nhiều lỗi bảo mật. Tôi khuyên bạn không nên sử dụng tài nguyên hoặc mã từ hơn 3 năm trước.
Các phiên bản của PHP có một vòng đời xác định . Đảm bảo rằng bạn đang sử dụng phiên bản được hỗ trợ.
PHP có một số tài liệu chính thức tốt nhất xung quanh, bao gồm các ví dụ và nhận xét do người dùng đóng góp. Các tài liệu chính thức được tìm thấy tại https://www.php.net/ .
Ấn phẩm chính thức (tạp chí) cho PHP là php [architecture] . Tôi đã đăng ký trong vài năm và đôi khi viết cho tạp chí. Rất nhiều thông tin được nhắm mục tiêu chất lượng cao ở đây.
Một trong những nguồn hàng đầu để học PHP hiện đại là trang web https://phptherightway.com/ .
Sau đây là danh sách lớn các tài nguyên hữu ích:
https://odan.github.io/learn-php/ .
Trang web https://laracasts.com/ có đầy đủ các hướng dẫn phát triển web và PHP chất lượng cao. Nhiều phần dành riêng cho khung công tác Laravel, nhưng cũng có nhiều phần bao gồm PHP nói chung và các phương pháp hay nhất hiện đại. Tôi rất thích tài nguyên này, đến nỗi mặc dù không sử dụng Laravel, tôi vẫn có đăng ký LaraCasts trọn đời. Loạt đề xuất:
- Giới thiệu về PHP – MIỄN PHÍ
- Mã Visual Studio dành cho nhà phát triển PHP – MIỄN PHÍ
- PHP hướng đối tượng
- Nguyên tắc thiết kế vững chắc trong PHP
- Các mẫu thiết kế trong PHP
Có một trang web phát sóng màn hình tương tự cho khuôn khổ PHP hàng đầu khác, Symfony (cái mà tôi sử dụng) được tìm thấy tại https://symfonycasts.com/ .
Các trình soạn thảo phổ biến nhất cho PHP là VSCode (những gì tôi sử dụng) & SublimeText. Nếu bạn thích một IDE đầy đủ, tốt nhất là PHPStorm, nhưng nó là một sản phẩm thương mại.
Thưởng thức cuộc hành trình của bạn
Ngày nay, PHP là một ngôn ngữ lập trình hiện đại, linh hoạt, phổ biến. Cộng đồng này rất lớn và được chào đón, và nguồn tài nguyên phong phú về PHP là rất lớn và đa dạng. Tôi thích sử dụng PHP và ngôn ngữ này tiếp tục nhận được các bản cập nhật cốt lõi và các phiên bản mới mà tiếp tục tốt hơn. PHP 8 đã được phát hành gần đây . Chào mừng bạn đến với PHP và cảm ơn đã đọc!