Mã nguồn PHP là gì?

Khám phá hàng nghìn tập lệnh PHP tốt nhất từng được tạo trên CodeCanyon. Với khoản thanh toán một lần, chi phí thấp, bạn có thể mua một trong những tập lệnh PHP chất lượng cao này và cải thiện trải nghiệm trang web cho bạn và khách truy cập của bạn.  

Là một nhà phát triển PHP, tôi thấy mình ngày càng tham khảo mã nguồn của PHP nhiều hơn trong công việc bình thường hàng ngày của mình. Nó rất hữu ích trong mọi việc, từ việc hiểu điều gì đang xảy ra đằng sau hậu trường cho đến việc tìm ra các trường hợp cạnh kỳ lạ để xem tại sao một thứ lẽ ra nên hoạt động lại không hoạt động. Và nó cũng rất hữu ích trong trường hợp tài liệu bị thiếu, không đầy đủ hoặc sai. Vì vậy, tôi đã quyết định chia sẻ những gì tôi đã học được trong một loạt bài đăng được thiết kế để cung cấp cho các nhà phát triển PHP đủ kiến ​​thức để thực sự đọc mã nguồn C đằng sau PHP. Không cần kiến ​​thức trước về C (chúng tôi sẽ đề cập đến một số điều cơ bản), nhưng nó sẽ giúp

Đây là bài viết đầu tiên của loạt bài. Trong bài đăng này, chúng ta sẽ tìm hiểu những kiến ​​thức cơ bản về ứng dụng PHP. tìm nó ở đâu, cấu trúc chung của cơ sở mã và một vài khái niệm thực sự cơ bản về ngôn ngữ C. Nói rõ hơn, mục tiêu của loạt bài này là để đọc hiểu mã nguồn. Vì vậy, điều đó có nghĩa là tại một số điểm trong loạt bài này, một số đơn giản hóa sẽ được thực hiện đối với các khái niệm để hiểu rõ vấn đề mà không làm phức tạp hóa mọi thứ. Nó sẽ không tạo ra sự khác biệt đáng kể cho việc đọc, nhưng nếu bạn đang cố gắng viết cho mục đích cốt lõi, thì sẽ cần nhiều thứ hơn nữa. Tôi sẽ cố gắng chỉ ra những điểm đơn giản hóa này khi tôi thực hiện chúng…

Ngoài ra, sê-ri này sẽ dựa trên 5. 4 cơ sở mã. Các khái niệm phải gần như giống nhau từ phiên bản này sang phiên bản khác, nhưng theo cách này, chúng tôi đang làm việc dựa trên một phiên bản xác định (để dễ dàng theo dõi sau này, khi các phiên bản mới ra mắt)

Vì vậy, chúng ta hãy khởi động nó, phải không?

Tìm mã nguồn PHP ở đâu

Cách dễ nhất để tải xuống mã nguồn là từ kho lưu trữ SVN của PHP. Đối với mục đích của chúng tôi, chúng tôi sẽ kiểm tra 5. 4 chi nhánh. Điều này thật tuyệt nếu bạn muốn tạo một bản dựng PHP mới nhất hoặc muốn thực sự phát triển cho nó (sửa lỗi, triển khai các tính năng, v.v.). Điều đáng chú ý là cộng đồng PHP hiện tại (tại thời điểm viết bài này) đang trong quá trình hướng tới kho lưu trữ GIT. Sau khi hoàn thành, tôi sẽ cập nhật bài đăng này để tham khảo thực tế đó

Thực tế là việc tải xuống mã nguồn không thực sự hữu ích cho mục đích của chúng tôi. Chúng tôi không muốn chỉnh sửa nó, chúng tôi chỉ muốn sử dụng nó và theo dõi cách các cuộc gọi được thực hiện. Chúng tôi có thể tải xuống và tải nó vào một IDE tốt, điều này sẽ cho phép chúng tôi nhấp vào các định nghĩa hàm và những thứ tương tự, nhưng tôi thấy điều đó hơi khó hơn mức cần thiết. Phải có một giải pháp tốt hơn

Hóa ra, cộng đồng PHP duy trì một công cụ THỰC SỰ tốt cho mục đích của chúng ta. Nó được gọi là lxr. php. mạng lưới. Về cơ bản, đây là danh sách mã nguồn có thể tìm kiếm được tạo tự động, đó cũng là cú pháp được đánh dấu và liên kết đầy đủ. Đây là thứ mà tôi hầu như chỉ sử dụng để duyệt mã nguồn C, nó rất tốt (ngay cả khi tôi đang tạo các bản vá lỗi, tôi vẫn tham khảo lxr thay vì cơ sở mã mà tôi đang làm việc). Chúng ta sẽ chưa tìm hiểu cách sử dụng tìm kiếm hiệu quả, nhưng chúng ta sẽ nói về điều đó trong một bài đăng sau khi chúng ta nói về các chức năng cốt lõi của PHP

Từ đây, chúng ta sẽ nói về PHP 5. 4 phiên bản. Vì những mục đích đó, chúng tôi sẽ sử dụng liên kết lxr này làm cơ sở cho phần còn lại của bài đăng. Bất cứ khi nào tôi tham khảo “5.4's root“, điều đó có nghĩa là trang này

Vì vậy, bây giờ chúng ta có thể xem cây nguồn, hãy bắt đầu nói về những gì ở đó

Cấu trúc của PHP

Vì vậy, khi bạn xem danh sách tệp và thư mục trong 5.4's root, có rất nhiều thứ đang diễn ra ở đó. Tôi muốn bạn bỏ qua mọi thứ ngoại trừ hai thư mục. máy lẻ và Zend. Phần còn lại của các tệp và thư mục rất quan trọng đối với việc thực thi và phát triển PHP, nhưng vì mục đích của chúng tôi, chúng tôi hoàn toàn có thể bỏ qua chúng. Vậy tại sao hai thư mục này lại quan trọng như vậy?

Chà, bạn đoán xem, ứng dụng PHP được chia thành hai phần chính. Phần đầu tiên là Zend Engine, cung cấp năng lượng cho môi trường thời gian chạy mà mã PHP của chúng tôi chạy trong đó. Nó xử lý tất cả các tính năng “cấp độ ngôn ngữ” mà PHP cung cấp, bao gồm. biến, câu lệnh, phân tích cú pháp, thực thi mã và xử lý lỗi. Không có động cơ, sẽ không có PHP. Mã nguồn của engine nằm trong thư mục Zend

Phần thứ hai của lõi PHP, là các tiện ích mở rộng được bao gồm trong PHP. Các tiện ích mở rộng này bao gồm mọi chức năng cốt lõi mà chúng ta có thể gọi từ PHP (chẳng hạn như strpos, substr, array_diff, mysql_connect, v.v.). Chúng cũng bao gồm các lớp cốt lõi (MySQLi,

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
0,
#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
1, v.v.)

Một cách dễ dàng để xác định chức năng bạn muốn xem nằm ở đâu trong lõi, là xem tài liệu chính về PHP. Nó cũng được chia thành hai phần chính (cho mục đích của chúng tôi), Tham chiếu ngôn ngữ và Tham chiếu chức năng. Là một sự khái quát hóa quá mức, nếu những gì bạn đang tìm kiếm được xác định trong Tham chiếu ngôn ngữ, thì nó có thể được tìm thấy trong thư mục Zend. Nếu nó nằm trong tham chiếu Chức năng, nó có thể được tìm thấy trong thư mục ext

Một vài khái niệm C cơ bản

Phần này không phải là phần mở đầu cho C, mà là “hướng dẫn đồng hành của độc giả”. Vì vậy, với điều đó đã nói

Biến

Trong C, các biến được nhập tĩnh và nghiêm ngặt. Điều này có nghĩa là trước khi một biến có thể được sử dụng, trước tiên nó phải được định nghĩa bằng một kiểu. Và một khi nó được xác định, bạn không thể thay đổi loại của nó (bạn có thể chuyển nó sang loại khác sau, nhưng bạn sẽ phải sử dụng một biến khác cho điều đó). Lý do cho điều này là trong C, các biến không thực sự tồn tại. Chúng chỉ là nhãn cho các địa chỉ bộ nhớ mà chúng tôi sử dụng để thuận tiện. Do đó, C không có tham chiếu theo cách mà PHP có. Thay vào đó, nó có con trỏ. Đối với mục đích của chúng tôi, hãy nghĩ về một con trỏ không gì khác hơn là một biến trỏ đến một biến khác. Hãy nghĩ về nó giống như một biến biến trong PHP

Vì vậy, như đã nói, hãy nói về cú pháp biến. C không đặt tiền tố cho các biến của nó bằng bất cứ thứ gì. Vì vậy, một cách để phân biệt sự khác biệt (cho mục đích của chúng tôi) là xem định nghĩa. Nếu bạn thấy một dòng ở đầu hàm (hoặc trong chữ ký của hàm) có một loại theo sau là khoảng trắng, thì phần tiếp theo là một biến. Một điểm quan trọng cần lưu ý là tên biến có thể có một hoặc nhiều ký hiệu trước nó. Biểu tượng ngôi sao (

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
2) cho biết biến là một con trỏ tới loại đó (một tham chiếu). Hai ký hiệu ngôi sao cho biết biến là một tham chiếu đến một tham chiếu. Và ba chỉ ra biến là một tham chiếu đến một tham chiếu đến một tham chiếu

Hướng dẫn này rất quan trọng, vì nội bộ PHP sử dụng con trỏ cấp đôi khá nhiều. Đó là bởi vì công cụ cần có khả năng truyền các khối dữ liệu (biến PHP) xung quanh và xử lý tất cả những thứ thú vị như tham chiếu PHP, sao chép khi ghi và tham chiếu đối tượng, v.v. Vì vậy, chỉ cần nhận ra rằng

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
3 chỉ có nghĩa là chúng tôi đang sử dụng hai cấp độ tham chiếu (không tham chiếu đến giá trị, nhưng tham chiếu đến một tham chiếu cụ thể đến giá trị). Nó có thể trở nên hơi khó hiểu, nhưng nếu các tài liệu tham khảo hoàn toàn mới đối với bạn, tôi khuyên bạn nên đọc một chút về chủ đề này (mặc dù không cần thiết phải đọc C, đó là mục tiêu của chúng tôi). Nhưng nó có thể giúp

Bây giờ, một điều quan trọng khác cần hiểu về con trỏ là cách chúng áp dụng cho mảng trong C (không phải mảng PHP, mà là mảng trong biến C). Vì một con trỏ là một địa chỉ bộ nhớ, nên chúng ta có thể khai báo một mảng bằng cách cấp phát một khối bộ nhớ và duyệt qua nó bằng cách tăng con trỏ. Nói một cách đơn giản, chúng ta có thể sử dụng kiểu dữ liệu C

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
4, viết tắt của một ký tự đơn (8 bit) để lưu trữ một ký tự đơn của chuỗi. Nhưng chúng ta cũng có thể sử dụng nó như một mảng để truy cập các byte sau trong chuỗi. Vì vậy, thay vì phải lưu trữ toàn bộ chuỗi trong một biến, chúng ta chỉ cần lưu trữ một con trỏ tới byte đầu tiên. Sau đó, chúng ta có thể tăng con trỏ (tăng địa chỉ bộ nhớ của nó) để di chuyển chuỗi

char *foo = "test";
// foo is now a pointer to "t" in a memory segment that stores "test"
// To access "e", we could do any of the following:
char e = foo[1];
char e = *(foo + 1);
char e = *(++foo);

Để đọc thêm về các biến và con trỏ trong C, hãy xem cuốn sách miễn phí tuyệt vời này

Hướng dẫn tiền xử lý

C sử dụng một bước gọi là

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
5 trước khi được biên dịch. Điều này cho phép tối ưu hóa được thực hiện và mã được viết động tùy thuộc vào các tùy chọn mà bạn đã thông qua trình biên dịch. Chúng ta sẽ nói về hai hướng dẫn tiền xử lý chính. Điều kiện và Macro

Điều kiện cho phép mã được bao gồm trong đầu ra được biên dịch hoặc không dựa trên định nghĩa. Chúng thường trông giống như ví dụ sau. Điều này cho phép viết mã khác nhau cho các hệ điều hành khác nhau (để một chức năng có thể hoạt động hiệu quả trên cả Windows và Linux, mặc dù chúng có các API khác nhau). Ngoài ra, nó có thể cho phép các phần mã được bao gồm hoặc không dựa trên chỉ thị cấu hình. Trên thực tế, đây là cách thức hoạt động của

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
6bước biên dịch PHP

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif

Hướng dẫn khác tôi sẽ gọi Macros. Về cơ bản, đây là những chức năng nhỏ cho phép đơn giản hóa mã. Chúng không thực sự hoạt động, mà chỉ là sự thay thế văn bản đơn giản mà bộ xử lý trước thực hiện trước khi biên dịch. Vì lý do này, macro không thực sự cần thực hiện bất kỳ lời gọi hàm nào. Bạn có thể viết một macro cho một định nghĩa hàm (PHP thực sự làm điều này, nhưng chúng ta sẽ nói về điều đó trong một bài đăng sau). Vấn đề là các macro cho phép mã đơn giản hơn được giải quyết trước khi biên dịch

#define FOO(a) ((a) + 1)
int b = FOO(1); // Converted to int b = 1 + 1

Tệp nguồn

Phần cuối cùng mà chúng ta sẽ xem qua là các loại tệp khác nhau mà mã nguồn C sử dụng. Có hai tập tin chính. . c và. h. Các. tệp c chứa mã nguồn mà tệp được cho là đang xây dựng. Nói chung, các. tệp c chứa các chức năng triển khai riêng tư không được chia sẻ giữa các tệp. Các. h (hoặc tệp tiêu đề) xác định chức năng nào được xác định trong. tệp c sẽ được nhìn thấy bởi các tệp khác, cũng như bất kỳ macro tiền xử lý nào. Cách tệp tiêu đề xác định API công khai, bằng cách nêu lại chữ ký hàm mà không có phần thân (tương tự như cách PHP xử lý giao diện và phương thức trừu tượng). Điều này cho phép mã nguồn được

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
7 với nhau không gì khác ngoài các tệp tiêu đề

Trong Phần Tiếp Theo

Trong phần tiếp theo của loạt bài này, chúng ta sẽ tìm hiểu cách các hàm bên trong được định nghĩa trong C. Vì vậy, bạn sẽ có thể lấy bất kỳ chức năng bên trong nào (chẳng hạn như

#define FOO 1
#if FOO
    Foo is defined and not 0
#else
    Foo is not defined or is 0
#endif
#ifdef FOO
    Foo is defined
#else
    Foo is not defined
#endif
8) và tra cứu định nghĩa của nó và xem nó đang làm gì. Giữ nguyên

Câu hỏi?

Làm thế nào để sử dụng mã nguồn PHP?

Bạn chỉ cần làm theo các bước để chạy chương trình PHP bằng dòng lệnh. .
Mở terminal hoặc cửa sổ dòng lệnh
Chuyển đến thư mục hoặc thư mục được chỉ định chứa các tệp php
Sau đó, chúng ta có thể chạy mã php bằng lệnh sau. tên_tệp php. php

Làm thế nào để xem mã nguồn PHP?

Cách BÌNH THƯỜNG duy nhất để xem mã nguồn PHP nằm trong một số tệp là sử dụng tiện ích mở rộng phps , thay vì tiện ích mở rộng php thông thường. Nếu bạn tạo phần mở rộng tệp. phps, máy chủ được cấu hình phù hợp sẽ xuất ra nguồn được định dạng màu thay vì html được tạo mà người ta mong đợi.

Làm cách nào để chạy mã nguồn PHP MySQL?

Tạo nên cơ sở dữ liệu
Tạo thư mục trong htdocs
Tạo tệp kết nối cơ sở dữ liệu trong PHP
Tạo tệp php mới để kiểm tra kết nối cơ sở dữ liệu của bạn
chạy nó

Sự khác biệt giữa HTML và PHP là gì?

PHP được sử dụng để lập trình phía máy chủ sẽ tương tác với cơ sở dữ liệu để lấy thông tin, lưu trữ, gửi email và cung cấp nội dung cho các trang HTML để hiển thị trên màn hình. HTML được sử dụng để chỉ định màu sắc, định dạng văn bản, căn chỉnh, v.v. PHP dễ học nhưng không bằng HTML