Trong hướng dẫn này, chúng ta xem xét vòng lặp PHP foreach[]. Chúng tôi cũng xem xét cách sử dụng nó trong khi làm việc với một mảng được lập chỉ mục hoặc kết hợp
Mục lục - PHP foreach
- foreach[] là gì?
- Mã và giải thích
- mảng được lập chỉ mục
- mảng kết hợp
- Bớt tư tưởng
foreach trong PHP là gì?
Phương thức
foreach [iterable as $key => $value]
statement
8 được sử dụng để lặp qua các phần tử trong một mảng được lập chỉ mục hoặc mảng kết hợp. Nó cũng có thể được sử dụng để lặp lại các đối tượng. Điều này cho phép bạn chạy các khối mã cho từng phần tửCú pháp của PHP foreach[]
Phương thức foreach[] có hai cú pháp, một cú pháp cho mỗi loại mảng
Cú pháp cho các mảng được lập chỉ mục như được đưa ra trong khối mã sau
foreach [iterable as $value]
statement
Cú pháp cho mảng kết hợp
foreach [iterable as $key => $value]
statement
Ở đây,
foreach [iterable as $key => $value]
statement
9 là tham số bắt buộc. Nó là mảng hoặc biến chứa mảng.
0 là một biến lưu trữ phần tử hiện tại trong mỗi lần lặpMảng được liên kết, sử dụng các khóa và giá trị, do đó,
1 &
2 trong cú pháp thứ hai biểu thị giống nhau tương ứngMã & Giải thích
Trong phần này, trước tiên chúng ta xem cách hàm
foreach [iterable as $key => $value]
statement
8 hoạt động trên một mảng được lập chỉ mục, sau đó chúng ta xem nó hoạt động trên một mảng kết hợpPHP Foreach[] trên các mảng được lập chỉ mục
Đầu ra của đoạn mã trên sẽ là
Hire
Top
Freelance
developers
PHP Foreach[] trên một mảng Associated
foreach [iterable as $value]
statement
0Đầu ra của đoạn mã trên sẽ là
foreach [iterable as $value]
statement
1Bây giờ hãy xem trường hợp chúng ta truyền đối số thứ hai
Như bạn có thể thấy khóa và giá trị của mảng kết hợp đã được in. Ngoài ra, chúng tôi đã thay thế
4 bằng
5 để dễ đọc hơnBớt tư tưởng
Phương thức
foreach [iterable as $key => $value]
statement
8 sẽ trả về lỗi trong trường hợp bạn sử dụng nó trên các biến có kiểu dữ liệu khác. Ngoài ra, phương pháp foreach [iterable as $key => $value]
statement
8 không sửa đổi các giá trị của con trỏ bên trong PHP làm cho việc xây dựng một hệ thống dựa trên web trở nên tương đối dễ dàng, đó là lý do khiến nó trở nên phổ biến. Nhưng mặc dù dễ sử dụng, PHP đã phát triển thành một ngôn ngữ khá phức tạp, với nhiều sắc thái và sự tinh tế có thể khiến các nhà phát triển khó chịu, dẫn đến hàng giờ gỡ lỗi khó hiểu. Bài viết này nhấn mạnh 10 lỗi phổ biến hơn mà các nhà phát triển PHP cần lưu ý
Qua
Ilya Sanosian
Ilya là nhà tư vấn CNTT, kiến trúc web và quản lý với hơn 12 năm kinh nghiệm xây dựng và lãnh đạo các nhóm
CHIA SẺ
CHIA SẺ
PHP làm cho việc xây dựng một hệ thống dựa trên web trở nên tương đối dễ dàng, đó là lý do khiến nó trở nên phổ biến. Nhưng mặc dù dễ sử dụng, PHP đã phát triển thành một ngôn ngữ khá phức tạp với nhiều khuôn khổ, sắc thái và sự tinh tế có thể khiến các nhà phát triển khó chịu, dẫn đến hàng giờ gỡ lỗi khó hiểu. Bài viết này nhấn mạnh 10 lỗi phổ biến hơn mà các nhà phát triển PHP cần lưu ý
Sai lầm thường gặp #1. Để lại các tham chiếu mảng lơ lửng sau các vòng lặp foreach [iterable as $value]
statement
65
foreach [iterable as $value]
statement
Bạn không chắc cách sử dụng vòng lặp foreach trong PHP? . Ví dụ
foreach [iterable as $value]
statement
8Vấn đề là, nếu bạn không cẩn thận, điều này cũng có thể gây ra một số tác dụng phụ và hậu quả không mong muốn. Cụ thể, trong ví dụ trên, sau khi mã được thực thi,
foreach [iterable as $value]
statement
67 sẽ vẫn nằm trong phạm vi và sẽ giữ tham chiếu đến phần tử cuối cùng trong mảng. Do đó, các hoạt động tiếp theo liên quan đến foreach [iterable as $value]
statement
67 có thể vô tình sửa đổi phần tử cuối cùng trong mảngĐiều chính cần nhớ là
foreach [iterable as $value]
statement
65 không tạo phạm vi. Do đó, foreach [iterable as $value]
statement
67 trong ví dụ trên là một tham chiếu trong phạm vi trên cùng của tập lệnh. Trên mỗi lần lặp lại, foreach [iterable as $value]
statement
65 đặt tham chiếu để trỏ đến phần tử tiếp theo của foreach [iterable as $key => $value]
statement
42. Do đó, sau khi vòng lặp hoàn thành, foreach [iterable as $value]
statement
67 vẫn trỏ đến phần tử cuối cùng của foreach [iterable as $key => $value]
statement
42 và vẫn nằm trong phạm viĐây là một ví dụ về loại lỗi lảng tránh và khó hiểu mà điều này có thể dẫn đến
foreach [iterable as $key => $value]
statement
7Đoạn mã trên sẽ xuất ra như sau
foreach [iterable as $key => $value]
statement
8Không, đó không phải là một lỗi đánh máy. Giá trị cuối cùng trên dòng cuối cùng thực sự là 2, không phải 3
Tại sao?
Sau khi đi qua vòng lặp
foreach [iterable as $value]
statement
65 đầu tiên, foreach [iterable as $key => $value]
statement
42 vẫn không thay đổi, nhưng như đã giải thích ở trên, foreach [iterable as $value]
statement
67 được để lại như một tham chiếu lơ lửng đến phần tử cuối cùng trong foreach [iterable as $key => $value]
statement
42 [vì vòng lặp foreach [iterable as $value]
statement
65 đó được truy cập foreach [iterable as $value]
statement
67 bằng tham chiếu]Kết quả là, khi chúng tôi đi qua vòng lặp
foreach [iterable as $value]
statement
65 thứ hai, "điều kỳ lạ" dường như xảy ra. Cụ thể, vì foreach [iterable as $value]
statement
67 hiện đang được truy cập theo giá trị [i. e. , bằng bản sao], foreach [iterable as $value]
statement
65 sao chép từng phần tử foreach [iterable as $key => $value]
statement
42 liên tiếp vào foreach [iterable as $value]
statement
67 trong mỗi bước của vòng lặp. Kết quả là, đây là những gì xảy ra trong mỗi bước của vòng lặp foreach [iterable as $value]
statement
65 thứ hai- vượt qua 1. Bản sao
17 [tôi. e. , “1”] thành
67 [là tham chiếu đếnforeach [iterable as $value] statement
19], do đó, giờ đây
19 bằng 1. Vì vậy,
42 hiện chứa [1, 2, 1]foreach [iterable as $key => $value] statement
- vượt qua 2. Bản sao
62 [tôi. e. , “2”] thành
67 [tham chiếu đếnforeach [iterable as $value] statement
19], do đó, giờ đây
19 bằng 2. Vì vậy,
42 hiện chứa [1, 2, 2]foreach [iterable as $key => $value] statement
- vượt qua 3. Sao chép
19 [hiện là “2”] thành
67 [tham chiếu đếnforeach [iterable as $value] statement
19], do đó,
19 vẫn bằng 2. Vì vậy,
42 hiện chứa [1, 2, 2]foreach [iterable as $key => $value] statement
Để vẫn nhận được lợi ích của việc sử dụng các tham chiếu trong các vòng lặp
foreach [iterable as $value]
statement
65 mà không gặp rủi ro về các loại sự cố này, hãy gọi _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ trên _ _ _ _ _ _ _ _ _ _ _ trên biến _ _ _ _ _ _ _ _ _ _ _ _ _ trên biến _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ trên biến _ _ _ _ _ _, ngay sau vòng lặp _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _, ngay sau vòng lặp _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ . g
9Sai lầm thường gặp #2. Hiểu lầm hành vi
75
Mặc dù tên của nó, nhưng
75 không chỉ trả về false nếu một mục không tồn tại mà còn trả về
77 cho các giá trị
78Hành vi này có nhiều vấn đề hơn so với lúc đầu và là nguyên nhân phổ biến của các vấn đề
Hãy xem xét những điều sau đây
foreach [iterable as $value]
statement
6Tác giả của mã này có lẽ muốn kiểm tra xem
79 có được đặt trong
60 không. Tuy nhiên, như đã thảo luận,
61 cũng sẽ trả về false nếu
62 được đặt, nhưng được đặt thành
78. Vì vậy, logic trên là thiếu sótĐây là một ví dụ khác
foreach [iterable as $key => $value]
statement
4Đoạn mã trên giả định rằng nếu
64 trả về
65, thì
66 nhất thiết phải được đặt và do đó,
67 sẽ trả về
65. Vì vậy, ngược lại, đoạn mã trên giả định rằng cách duy nhất mà
67 sẽ trả về
77 là nếu
64 cũng trả lại
77Không
Như đã giải thích,
67 cũng sẽ trả về
77 nếu foreach [iterable as $key => $value]
statement
705 được đặt thành
78. Do đó, có thể cho
67 trả lại
77 ngay cả khi
64 trả lại
65. Vì vậy, một lần nữa, logic trên là thiếu sótVà nhân tiện, như một điểm phụ, nếu mục đích trong đoạn mã trên thực sự là kiểm tra lại xem
64 có trả về đúng hay không, thì dựa vào
75 vì đây là một quyết định viết mã kém trong mọi trường hợp. Thay vào đó, sẽ tốt hơn nếu chỉ kiểm tra lại
64; . e
1Tuy nhiên, đối với các trường hợp, điều quan trọng là phải kiểm tra xem một biến có thực sự được đặt hay không [i. e. , để phân biệt giữa một biến không được đặt và một biến được đặt thành
78], phương thức foreach [iterable as $key => $value]
statement
715 là một giải pháp hiệu quả hơn nhiềuVí dụ: chúng ta có thể viết lại ví dụ đầu tiên trong hai ví dụ trên như sau
6Ngoài ra, bằng cách kết hợp
foreach [iterable as $key => $value]
statement
715 với foreach [iterable as $key => $value]
statement
717, chúng tôi có thể kiểm tra một cách chắc chắn liệu một biến trong phạm vi hiện tại đã được đặt hay chưa
7Sai lầm thường gặp #3. Nhầm lẫn về việc trả lại theo tham chiếu so với. theo giá trị
Hãy xem xét đoạn mã này
6Nếu bạn chạy đoạn mã trên, bạn sẽ nhận được như sau
foreach [iterable as $key => $value]
statement
70Chuyện gì vậy?
Vấn đề là đoạn mã trên nhầm lẫn việc trả về mảng theo tham chiếu với việc trả về mảng theo giá trị. Trừ khi bạn yêu cầu PHP trả về một mảng theo tham chiếu [i. e. , bằng cách sử dụng
foreach [iterable as $key => $value]
statement
718], theo mặc định, PHP sẽ trả về mảng “theo giá trị”. Điều này có nghĩa là một bản sao của mảng sẽ được trả về và do đó, hàm được gọi và người gọi sẽ không truy cập cùng một thể hiện của mảngVì vậy, lệnh gọi
foreach [iterable as $key => $value]
statement
719 ở trên trả về một bản sao của mảng foreach [iterable as $key => $value]
statement
720 chứ không phải là một tham chiếu đến nó. Với ý nghĩ đó, chúng ta hãy xem lại hai dòng chính từ ví dụ trênforeach [iterable as $key => $value]
statement
71Một cách khắc phục có thể là lưu bản sao đầu tiên của mảng
foreach [iterable as $key => $value]
statement
720 được trả về bởi foreach [iterable as $key => $value]
statement
719 và sau đó thao tác trên bản sao đó; . gforeach [iterable as $key => $value]
statement
72Mã đó sẽ hoạt động tốt [tôi. e. , nó sẽ xuất ra
foreach [iterable as $key => $value]
statement
723 mà không tạo bất kỳ thông báo "chỉ mục không xác định" nào], nhưng tùy thuộc vào những gì bạn đang cố gắng thực hiện, phương pháp này có thể phù hợp hoặc không. Cụ thể, đoạn mã trên sẽ không sửa đổi mảng foreach [iterable as $key => $value]
statement
720 ban đầu. Vì vậy, nếu bạn muốn các sửa đổi của mình [chẳng hạn như thêm phần tử 'kiểm tra'] ảnh hưởng đến mảng ban đầu, thay vào đó, bạn cần sửa đổi hàm foreach [iterable as $key => $value]
statement
719 để trả về một tham chiếu đến chính mảng foreach [iterable as $key => $value]
statement
720. Điều này được thực hiện bằng cách thêm một foreach [iterable as $key => $value]
statement
718 trước tên hàm, do đó chỉ ra rằng nó sẽ trả về một tham chiếu; . eforeach [iterable as $key => $value]
statement
73Đầu ra của điều này sẽ là
foreach [iterable as $key => $value]
statement
723, như mong đợiNhưng để làm cho mọi thứ trở nên khó hiểu hơn, thay vào đó hãy xem xét đoạn mã sau
foreach [iterable as $key => $value]
statement
74Nếu bạn đoán rằng điều này sẽ dẫn đến lỗi “chỉ mục không xác định” giống như ví dụ về
foreach [iterable as $key => $value]
statement
729 trước đó của chúng tôi, thì bạn đã nhầm. Trên thực tế, mã này sẽ hoạt động tốt. Lý do là, không giống như mảng, PHP luôn chuyển các đối tượng theo tham chiếu. [foreach [iterable as $key => $value]
statement
730 là một đối tượng SPL, bắt chước hoàn toàn cách sử dụng mảng, nhưng hoạt động như một đối tượng. ]Như những ví dụ này chứng minh, không phải lúc nào PHP cũng hoàn toàn rõ ràng cho dù bạn đang xử lý một bản sao hay một tài liệu tham khảo. Do đó, điều cần thiết là phải hiểu những hành vi mặc định này [i. e. , biến và mảng được truyền theo giá trị;
Tất cả những gì đã nói, điều quan trọng cần lưu ý là việc trả về một tham chiếu đến một mảng hoặc một
foreach [iterable as $key => $value]
statement
730 nói chung là điều nên tránh, vì nó cung cấp cho người gọi khả năng sửa đổi dữ liệu riêng tư của cá thể. Điều này “bay vào mặt” của sự đóng gói. Thay vào đó, tốt hơn là sử dụng "getters" và "setters" kiểu cũ, e. gforeach [iterable as $key => $value]
statement
75Cách tiếp cận này cung cấp cho người gọi khả năng đặt hoặc nhận bất kỳ giá trị nào trong mảng mà không cung cấp quyền truy cập công khai vào chính mảng
foreach [iterable as $key => $value]
statement
720 riêng tư.Sai lầm thường gặp #4. Thực hiện các truy vấn trong một vòng lặp
Không có gì lạ khi gặp phải trường hợp như thế này nếu PHP của bạn không hoạt động
foreach [iterable as $key => $value]
statement
76Mặc dù có thể hoàn toàn không có gì sai ở đây, nhưng nếu bạn làm theo logic trong mã, bạn có thể thấy rằng lệnh gọi có vẻ ngây thơ ở trên tới
foreach [iterable as $key => $value]
statement
733 cuối cùng dẫn đến một loại truy vấn nào đó, chẳng hạn nhưforeach [iterable as $key => $value]
statement
77Do đó, mỗi lần lặp lại của vòng lặp trên sẽ dẫn đến một truy vấn riêng tới cơ sở dữ liệu. Vì vậy, ví dụ: nếu bạn đã cung cấp một mảng gồm 1.000 giá trị cho vòng lặp, thì nó sẽ tạo ra 1.000 truy vấn riêng biệt cho tài nguyên. Nếu một tập lệnh như vậy được gọi trong nhiều luồng, thì nó có khả năng khiến hệ thống ngừng hoạt động
Do đó, điều quan trọng là phải nhận biết khi nào mã của bạn tạo truy vấn và bất cứ khi nào có thể, hãy thu thập các giá trị rồi chạy một truy vấn để tìm nạp tất cả kết quả
Một ví dụ về một nơi khá phổ biến để gặp truy vấn được thực hiện không hiệu quả [i. e. , trong một vòng lặp] là khi một biểu mẫu được đăng với một danh sách các giá trị [ví dụ: ID]. Sau đó, để truy xuất toàn bộ dữ liệu bản ghi cho từng ID, mã sẽ lặp qua mảng và thực hiện một truy vấn SQL riêng cho từng ID. Điều này thường sẽ trông giống như thế này
foreach [iterable as $key => $value]
statement
78Nhưng điều tương tự có thể được thực hiện hiệu quả hơn nhiều trong một truy vấn SQL như sau
foreach [iterable as $key => $value]
statement
79Do đó, điều quan trọng là phải nhận biết khi nào các truy vấn được thực hiện, trực tiếp hoặc gián tiếp, bằng mã của bạn. Bất cứ khi nào có thể, hãy thu thập các giá trị rồi chạy một truy vấn để tìm nạp tất cả các kết quả. Tuy nhiên, cũng cần phải thận trọng, điều này dẫn chúng ta đến lỗi PHP phổ biến tiếp theo…
Sai lầm thường gặp #5. Sử dụng bộ nhớ giả mạo và không hiệu quả
Mặc dù tìm nạp nhiều bản ghi cùng một lúc chắc chắn hiệu quả hơn chạy một truy vấn duy nhất cho mỗi hàng để tìm nạp, nhưng cách tiếp cận như vậy có khả năng dẫn đến tình trạng “hết bộ nhớ” trong
foreach [iterable as $key => $value]
statement
734 khi sử dụng tiện ích mở rộng foreach [iterable as $key => $value]
statement
735 của PHPĐể chứng minh, chúng ta hãy xem một hộp thử nghiệm với tài nguyên hạn chế [RAM 512MB], MySQL và
foreach [iterable as $key => $value]
statement
736Chúng tôi sẽ khởi động một bảng cơ sở dữ liệu như thế này
foreach [iterable as $key => $value]
statement
80OK, bây giờ hãy kiểm tra việc sử dụng tài nguyên
foreach [iterable as $key => $value]
statement
81đầu ra
foreach [iterable as $key => $value]
statement
82Mát mẻ. Có vẻ như truy vấn được quản lý nội bộ an toàn về mặt tài nguyên
Tuy nhiên, để chắc chắn, hãy tăng giới hạn một lần nữa và đặt nó thành 100.000. Uh-oh. Khi chúng tôi làm điều đó, chúng tôi nhận được
foreach [iterable as $key => $value]
statement
83Chuyện gì đã xảy ra thế?
Vấn đề ở đây là cách thức hoạt động của mô-đun
foreach [iterable as $key => $value]
statement
735 của PHP. Nó thực sự chỉ là một proxy cho foreach [iterable as $key => $value]
statement
734, làm công việc bẩn thỉu. Khi một phần dữ liệu được chọn, nó sẽ chuyển trực tiếp vào bộ nhớ. Vì bộ nhớ này không được quản lý bởi trình quản lý của PHP, nên foreach [iterable as $key => $value]
statement
739 sẽ không hiển thị bất kỳ sự gia tăng nào về mức sử dụng tài nguyên khi chúng tôi tăng giới hạn trong truy vấn của mình. Điều này dẫn đến các vấn đề giống như vấn đề đã trình bày ở trên khi chúng ta bị lừa khi nghĩ rằng việc quản lý bộ nhớ của chúng ta vẫn ổn. Nhưng trên thực tế, việc quản lý bộ nhớ của chúng ta bị thiếu sót nghiêm trọng và chúng ta có thể gặp các sự cố như sự cố được hiển thị ở trênÍt nhất bạn có thể tránh được sự giả mạo ở trên [mặc dù bản thân nó sẽ không cải thiện việc sử dụng bộ nhớ của bạn] bằng cách sử dụng mô-đun
foreach [iterable as $key => $value]
statement
740. foreach [iterable as $key => $value]
statement
740 được biên dịch dưới dạng một phần mở rộng PHP gốc và nó sử dụng trình quản lý bộ nhớ của PHPDo đó, nếu chúng tôi chạy thử nghiệm trên bằng cách sử dụng
foreach [iterable as $key => $value]
statement
740 thay vì foreach [iterable as $key => $value]
statement
735, chúng tôi sẽ có được bức tranh chân thực hơn nhiều về việc sử dụng bộ nhớ của chúng tôiforeach [iterable as $key => $value]
statement
84Và nó thậm chí còn tệ hơn thế, nhân tiện. Theo tài liệu PHP,
foreach [iterable as $key => $value]
statement
735 sử dụng gấp đôi tài nguyên so với foreach [iterable as $key => $value]
statement
740 để lưu trữ dữ liệu, do đó, tập lệnh gốc sử dụng foreach [iterable as $key => $value]
statement
735 thực sự đã sử dụng nhiều bộ nhớ hơn so với hiển thị ở đây [gần gấp đôi]Để tránh những vấn đề như vậy, hãy cân nhắc giới hạn kích thước truy vấn của bạn và sử dụng vòng lặp với số lần lặp nhỏ; . g
foreach [iterable as $key => $value]
statement
85Khi chúng tôi xem xét cả lỗi PHP này và lỗi số 4 ở trên, chúng tôi nhận ra rằng có một sự cân bằng lành mạnh mà mã của bạn cần đạt được một cách lý tưởng giữa, một mặt, truy vấn của bạn quá chi tiết và lặp đi lặp lại, so với. có từng truy vấn riêng lẻ của bạn quá lớn. Như với hầu hết mọi thứ trong cuộc sống, sự cân bằng là cần thiết;
Sai lầm thường gặp #6. Bỏ qua các vấn đề về Unicode/UTF-8
Theo một nghĩa nào đó, đây thực sự là một vấn đề trong chính PHP hơn là vấn đề bạn gặp phải khi gỡ lỗi PHP, nhưng nó chưa bao giờ được giải quyết thỏa đáng. Cốt lõi của PHP 6 là nhận biết Unicode, nhưng điều đó đã bị đình trệ khi quá trình phát triển PHP 6 bị đình chỉ vào năm 2010
Nhưng điều đó không có nghĩa là không cho phép nhà phát triển chuyển giao đúng UTF-8 và tránh giả định sai lầm rằng tất cả các chuỗi nhất thiết phải là “ASCII cũ đơn giản”. Mã không thể xử lý đúng các chuỗi không phải ASCII nổi tiếng là đã đưa các lỗi heisen vào mã của bạn. Ngay cả các cuộc gọi
foreach [iterable as $key => $value]
statement
747 đơn giản cũng có thể gây ra sự cố nếu ai đó có họ như “Schrödinger” cố gắng đăng ký vào hệ thống của bạnĐây là một danh sách kiểm tra nhỏ để tránh những vấn đề như vậy trong mã của bạn
- Nếu bạn không biết nhiều về Unicode và UTF-8, ít nhất bạn nên học những điều cơ bản. Có một mồi tuyệt vời ở đây
- Đảm bảo luôn sử dụng các hàm
748 thay vì các hàm chuỗi cũ [đảm bảo phần mở rộng “multibyte” được bao gồm trong bản dựng PHP của bạn]foreach [iterable as $key => $value] statement
- Đảm bảo rằng cơ sở dữ liệu và bảng của bạn được đặt để sử dụng Unicode [nhiều bản dựng của MySQL vẫn sử dụng
749 theo mặc định]foreach [iterable as $key => $value] statement
- Hãy nhớ rằng
750 chuyển đổi các ký hiệu không phải ASCII [e. g. , “Schrödinger” trở thành “Schr\u00f6dinger”] nhưngforeach [iterable as $key => $value] statement
751 thì khôngforeach [iterable as $key => $value] statement
- Đảm bảo các tệp mã PHP của bạn cũng được mã hóa UTF-8 để tránh xung đột khi nối các chuỗi với các hằng chuỗi được mã hóa cứng hoặc được định cấu hình
Một tài nguyên đặc biệt có giá trị về vấn đề này là Bài viết UTF-8 Primer cho PHP và MySQL của Francisco Claria trên blog này
Sai lầm thường gặp #7. Giả sử foreach [iterable as $key => $value]
statement
752 sẽ luôn chứa dữ liệu POST của bạn
foreach [iterable as $key => $value]
statement
Mặc dù có tên như vậy, nhưng mảng
foreach [iterable as $key => $value]
statement
752 không phải lúc nào cũng chứa dữ liệu POST của bạn và có thể dễ dàng thấy trống. Để hiểu điều này, chúng ta hãy xem một ví dụ. Giả sử chúng tôi thực hiện yêu cầu máy chủ với cuộc gọi foreach [iterable as $key => $value]
statement
754 như sauforeach [iterable as $key => $value]
statement
86[Nhân tiện, lưu ý
foreach [iterable as $key => $value]
statement
755 ở đây. Chúng tôi gửi dữ liệu dưới dạng JSON, khá phổ biến đối với API. Ví dụ, đó là mặc định để đăng trong dịch vụ AngularJS foreach [iterable as $key => $value]
statement
756. ]Về phía máy chủ trong ví dụ của chúng tôi, chúng tôi chỉ cần kết xuất mảng
foreach [iterable as $key => $value]
statement
752foreach [iterable as $key => $value]
statement
87Thật ngạc nhiên, kết quả sẽ là
foreach [iterable as $key => $value]
statement
88Tại sao?
Câu trả lời là PHP chỉ tự động phân tích cú pháp tải trọng POST khi nó có loại nội dung là
foreach [iterable as $key => $value]
statement
759 hoặc foreach [iterable as $key => $value]
statement
760. Lý do cho điều này là do lịch sử - hai loại nội dung này về cơ bản là những loại duy nhất được sử dụng nhiều năm trước khi foreach [iterable as $key => $value]
statement
752 của PHP được triển khai. Vì vậy, với bất kỳ loại nội dung nào khác [ngay cả những loại khá phổ biến hiện nay, như ________ 2762], PHP không tự động tải trọng tải POSTVì
foreach [iterable as $key => $value]
statement
752 là một siêu toàn cục, nên nếu chúng ta ghi đè lên nó một lần [tốt nhất là ở phần đầu trong tập lệnh của chúng ta], thì giá trị đã sửa đổi [i. e. , bao gồm tải trọng POST] sau đó sẽ được tham chiếu trong toàn bộ mã của chúng tôi. Điều này rất quan trọng vì foreach [iterable as $key => $value]
statement
752 thường được sử dụng bởi các khung công tác PHP và hầu hết tất cả các tập lệnh tùy chỉnh để trích xuất và chuyển đổi dữ liệu yêu cầuVì vậy, ví dụ: khi xử lý tải trọng POST có loại nội dung là
foreach [iterable as $key => $value]
statement
762, chúng tôi cần phân tích cú pháp nội dung yêu cầu theo cách thủ công [i. e. , giải mã dữ liệu JSON] và ghi đè biến foreach [iterable as $key => $value]
statement
752, như sauforeach [iterable as $key => $value]
statement
89Sau đó, khi chúng tôi kết xuất mảng
foreach [iterable as $key => $value]
statement
752, chúng tôi thấy rằng nó bao gồm chính xác tải trọng POST; . g
90Sai lầm thường gặp #8. Nghĩ rằng PHP hỗ trợ kiểu dữ liệu ký tự
Nhìn vào đoạn mã mẫu này và thử đoán xem nó sẽ in gì
91Nếu bạn trả lời từ 'a' đến 'z', bạn có thể ngạc nhiên khi biết rằng mình đã sai
Có, nó sẽ in từ 'a' đến 'z', nhưng sau đó nó cũng sẽ in từ 'aa' đến 'yz'. Hãy xem tại sao
Trong PHP không có kiểu dữ liệu
foreach [iterable as $key => $value]
statement
768; . Với ý nghĩ đó, việc tăng foreach [iterable as $key => $value]
statement
769 foreach [iterable as $key => $value]
statement
771 trong PHP sẽ mang lại foreach [iterable as $key => $value]
statement
772
92Tuy nhiên, để gây nhầm lẫn hơn nữa,
foreach [iterable as $key => $value]
statement
772 ít hơn về mặt từ điển so với foreach [iterable as $key => $value]
statement
771
93Đó là lý do tại sao mã mẫu được trình bày ở trên in các chữ cái từ
foreach [iterable as $key => $value]
statement
775 đến foreach [iterable as $key => $value]
statement
771, nhưng sau đó cũng in ra từ foreach [iterable as $key => $value]
statement
772 đến foreach [iterable as $key => $value]
statement
778. Nó dừng lại khi đạt đến ________ 2779, đây là giá trị đầu tiên nó gặp mà nó “lớn hơn” ________ 2771
94Trong trường hợp đó, đây là một cách để lặp đúng các giá trị từ 'a' đến 'z' trong PHP
95Hay cách khác
96Sai lầm thường gặp #9. Bỏ qua các tiêu chuẩn mã hóa
Mặc dù bỏ qua các tiêu chuẩn mã hóa không trực tiếp dẫn đến việc cần phải gỡ lỗi mã PHP, nhưng đây có lẽ vẫn là một trong những điều quan trọng nhất cần thảo luận ở đây
Bỏ qua các tiêu chuẩn mã hóa có thể gây ra hàng loạt vấn đề cho một dự án. Tốt nhất, nó dẫn đến mã không nhất quán [vì mọi nhà phát triển đều “làm việc của riêng họ”]. Nhưng tệ nhất, nó tạo ra mã PHP không hoạt động hoặc có thể khó điều hướng [đôi khi gần như không thể], khiến việc gỡ lỗi, nâng cao, bảo trì trở nên cực kỳ khó khăn. Và điều đó có nghĩa là giảm năng suất cho nhóm của bạn, bao gồm rất nhiều nỗ lực lãng phí [hoặc ít nhất là không cần thiết]
May mắn thay cho các nhà phát triển PHP, có Khuyến nghị về Tiêu chuẩn PHP [PSR], bao gồm năm tiêu chuẩn sau
- PSR-0. Tiêu chuẩn tự động tải
- PSR-1. Tiêu chuẩn mã hóa cơ bản
- PSR-2. Hướng dẫn phong cách mã hóa
- PSR-3. Giao diện nhật ký
- PSR-4. Trình tải tự động
PSR ban đầu được tạo ra dựa trên đầu vào từ những người bảo trì các nền tảng được công nhận nhất trên thị trường. Zend, Drupal, Symfony, Joomla và những người khác đã đóng góp cho các tiêu chuẩn này và hiện đang tuân theo chúng. Ngay cả PEAR, đã cố gắng trở thành một tiêu chuẩn trong nhiều năm trước đó, giờ cũng tham gia vào PST
Theo một nghĩa nào đó, tiêu chuẩn mã hóa của bạn là gì hầu như không quan trọng, miễn là bạn đồng ý với một tiêu chuẩn và tuân theo nó, nhưng tuân theo PSR nói chung là một ý tưởng hay trừ khi bạn có một số lý do thuyết phục về dự án của mình để làm khác đi. Ngày càng có nhiều nhóm và dự án tuân thủ PSR. Tại thời điểm này, Tt chắc chắn được công nhận là “tiêu chuẩn” của phần lớn các nhà phát triển PHP, vì vậy việc sử dụng nó sẽ giúp đảm bảo rằng các nhà phát triển mới quen thuộc và thoải mái với tiêu chuẩn mã hóa của bạn khi họ tham gia nhóm của bạn
Sai lầm thường gặp #10. Lạm dụng foreach [iterable as $key => $value]
statement
781
foreach [iterable as $key => $value]
statement
Một số nhà phát triển PHP thích sử dụng
foreach [iterable as $key => $value]
statement
781 để kiểm tra boolean cho mọi thứ. Tuy nhiên, có trường hợp điều này có thể dẫn đến nhầm lẫnĐầu tiên, hãy quay lại mảng và các thể hiện của
foreach [iterable as $key => $value]
statement
730 [bắt chước mảng]. Với sự giống nhau của chúng, thật dễ dàng để giả định rằng các mảng và các thực thể foreach [iterable as $key => $value]
statement
730 sẽ hoạt động giống hệt nhau. Tuy nhiên, điều này chứng tỏ là một giả định nguy hiểm. Ví dụ, trong PHP 5. 0
97Và để làm cho vấn đề trở nên tồi tệ hơn, kết quả sẽ khác trước PHP 5. 0
98Thật không may, cách tiếp cận này khá phổ biến. Ví dụ: đây là cách
foreach [iterable as $key => $value]
statement
785 của Zend Framework 2 trả về dữ liệu khi gọi foreach [iterable as $key => $value]
statement
786 trên kết quả foreach [iterable as $key => $value]
statement
787 như tài liệu gợi ý. Nhà phát triển có thể dễ dàng trở thành nạn nhân của lỗi này với dữ liệu đóĐể tránh những vấn đề này, cách tiếp cận tốt hơn để kiểm tra cấu trúc mảng trống là sử dụng
foreach [iterable as $key => $value]
statement
788
99Và ngẫu nhiên, vì PHP ép kiểu
foreach [iterable as $key => $value]
statement
789 thành
77, nên foreach [iterable as $key => $value]
statement
788 cũng có thể được sử dụng trong điều kiện foreach [iterable as $key => $value]
statement
792 để kiểm tra các mảng trống. Cũng cần lưu ý rằng, trong PHP, foreach [iterable as $key => $value]
statement
788 là độ phức tạp không đổi [hoạt động foreach [iterable as $key => $value]
statement
794] trên các mảng, điều này càng làm rõ ràng hơn rằng đó là lựa chọn đúng đắnMột ví dụ khác khi
foreach [iterable as $key => $value]
statement
781 có thể nguy hiểm là khi kết hợp nó với hàm lớp ma thuật foreach [iterable as $key => $value]
statement
796. Hãy xác định hai lớp và có thuộc tính foreach [iterable as $key => $value]
statement
723 trong cả haiTrước tiên, hãy định nghĩa một lớp
foreach [iterable as $key => $value]
statement
798 bao gồm foreach [iterable as $key => $value]
statement
723 như một thuộc tính bình thườngforeach [iterable as $value]
statement
60Sau đó, hãy định nghĩa một lớp
foreach [iterable as $key => $value]
statement
800 sử dụng toán tử foreach [iterable as $key => $value]
statement
796 ma thuật để truy cập thuộc tính foreach [iterable as $key => $value]
statement
723 của nóforeach [iterable as $value]
statement
61OK, bây giờ hãy xem điều gì sẽ xảy ra khi chúng ta cố gắng truy cập thuộc tính
foreach [iterable as $key => $value]
statement
723 của mỗi lớp nàyforeach [iterable as $value]
statement
62Tốt cho đến nay
Nhưng bây giờ hãy xem điều gì sẽ xảy ra khi chúng ta gọi
foreach [iterable as $key => $value]
statement
781 trên mỗi trong số nàyforeach [iterable as $value]
statement
63ừ. Vì vậy, nếu chúng ta dựa vào
foreach [iterable as $key => $value]
statement
781, chúng ta có thể bị nhầm lẫn khi tin rằng thuộc tính foreach [iterable as $key => $value]
statement
723 của foreach [iterable as $key => $value]
statement
807 trống, trong khi trên thực tế, nó được đặt thành foreach [iterable as $key => $value]
statement
808Thật không may, nếu một lớp sử dụng hàm
foreach [iterable as $key => $value]
statement
796 ma thuật để truy xuất giá trị của thuộc tính, thì không có cách nào dễ dàng để kiểm tra xem giá trị thuộc tính đó có trống hay không. Bên ngoài phạm vi của lớp, bạn thực sự chỉ có thể kiểm tra xem giá trị
78 có được trả về hay không và điều đó không nhất thiết có nghĩa là khóa tương ứng không được đặt, vì nó thực sự có thể được đặt thành
78Ngược lại, nếu chúng ta cố gắng tham chiếu đến một thuộc tính không tồn tại của một thể hiện lớp
foreach [iterable as $key => $value]
statement
798, chúng ta sẽ nhận được một thông báo tương tự như sauforeach [iterable as $value]
statement
64Vì vậy, điểm chính ở đây là phương pháp
foreach [iterable as $key => $value]
statement
781 nên được sử dụng cẩn thận vì nó có thể gây nhầm lẫn - hoặc thậm chí có khả năng gây hiểu lầm - kết quả, nếu một người không cẩn thậnGói [lại
Tính dễ sử dụng của PHP có thể ru ngủ các nhà phát triển vào một cảm giác thoải mái sai lầm, khiến họ dễ bị gỡ lỗi PHP trong thời gian dài do một số sắc thái và đặc điểm riêng của ngôn ngữ. Điều này có thể dẫn đến việc PHP không hoạt động và các vấn đề như được mô tả ở đây
Ngôn ngữ PHP đã phát triển đáng kể trong suốt lịch sử 20 năm của nó. Tự làm quen với sự tinh tế của nó là một nỗ lực đáng giá, vì nó sẽ giúp đảm bảo rằng phần mềm bạn sản xuất có khả năng mở rộng, mạnh mẽ và dễ bảo trì hơn
thẻ
PHPNgười làm việc tự do? Tìm công việc tiếp theo của bạn.
Việc làm Lập trình viên PHP
Xem thông tin đầy đủ
Ilya Sanosian
Kỹ sư phần mềm
Giới thiệu về tác giả
Ilya là nhà tư vấn CNTT, kiến trúc web và nhà quản lý với hơn một thập kỷ kinh nghiệm xây dựng và lãnh đạo các nhóm, đào tạo đồng nghiệp và làm cho các quy trình hoạt động lâu dài bằng cách xây dựng quy trình công việc hiệu quả và tài liệu minh bạch. Kiến thức miền của Ilya bao gồm robot, tin tức, bảo mật trực tuyến, chăm sóc sức khỏe, tiếp thị trực tuyến và du lịch
Thuê Ilya
Bình luận
Phil nghèo
Bài viết rất hay, rất nhiều thông tin
Phil nghèo
Bài viết rất hay, rất nhiều thông tin
thebeline
Trời ạ, một số trong số này phù hợp với tôi [như các truy vấn bên trong các vòng lặp, chúng tôi thậm chí có một hoặc hai bộ [trước khi tôi viết lại chúng] các truy vấn bên trong các vòng lặp đã kích hoạt các vòng lặp tiếp theo với các truy vấn. một mớ hỗn độn thối rữa]. Tuy nhiên, tôi không biết liệu tôi có gọi đây là 10 vấn đề phổ biến nhất hay không, cụ thể là bởi vì, trong khi những vấn đề này chắc chắn gây nhầm lẫn, các nhà phát triển thường gặp những vấn đề này và giải quyết chúng theo nhu cầu của họ một lần rồi tiếp tục. Bài viết không có lỗi, nhưng với một danh sách dài dằng dặc như PHP có, việc chọn ra chỉ 10 bài viết ngắn là điều không thể. Danh sách này thật điên rồ. http. //eev. ee/blog/2012/04/09/php-a-fractal-of-bad-design/
thebeline
Trời ạ, một số trong số này phù hợp với tôi [như các truy vấn bên trong các vòng lặp, chúng tôi thậm chí có một hoặc hai bộ [trước khi tôi viết lại chúng] các truy vấn bên trong các vòng lặp đã kích hoạt các vòng lặp tiếp theo với các truy vấn. một mớ hỗn độn thối rữa]. Tuy nhiên, tôi không biết liệu tôi có gọi đây là 10 vấn đề phổ biến nhất hay không, cụ thể là bởi vì, trong khi những vấn đề này chắc chắn gây nhầm lẫn, các nhà phát triển thường gặp những vấn đề này và giải quyết chúng theo nhu cầu của họ một lần rồi tiếp tục. Bài viết không có lỗi, nhưng với một danh sách dài dằng dặc như PHP có, việc chọn ra chỉ 10 bài viết ngắn là điều không thể. Danh sách này thật điên rồ. http. //eev. ee/blog/2012/04/09/php-a-fractal-of-bad-design/
Alejandro Pablo Tkachuk
Top 10 tuyệt vời
Alejandro Pablo Tkachuk
Top 10 tuyệt vời
Wilhelm Murdoch
Ôi Chúa ơi. Đây là bài viết của tôi khi mọi người hỏi tôi tại sao tôi không thích ngôn ngữ này. Rõ ràng, mọi ngôn ngữ đều có những thiếu sót của nó, nhưng sau 10 năm sử dụng PHP, nó đã để lại một mùi vị rất tệ trong miệng tôi
Wilhelm Murdoch
Ôi Chúa ơi. Đây là bài viết của tôi khi mọi người hỏi tôi tại sao tôi không thích ngôn ngữ này. Rõ ràng, mọi ngôn ngữ đều có những thiếu sót của nó, nhưng sau 10 năm sử dụng PHP, nó đã để lại một mùi vị rất tệ trong miệng tôi
thợ đánh bóng
FWIW, trong #10 bạn nói "// PHP 5. 0 trở lên. $array = [];" Ký hiệu mảng đó KHÔNG hoạt động trong PHP 5. 0-5. 3, kể từ khi nó được giới thiệu trong PHP 5. 4
thợ đánh bóng
FWIW, trong #10 bạn nói "// PHP 5. 0 trở lên. $array = [];" Ký hiệu mảng đó KHÔNG hoạt động trong PHP 5. 0-5. 3, kể từ khi nó được giới thiệu trong PHP 5. 4
Bruno Seixas
Bài báo tuyệt vời. Cảm ơn =] Mỗi ngày chúng ta có thể học được điều gì đó, cải thiện phong cách viết mã của mình. Điều này chỉ ra đúng hướng
Bruno Seixas
Bài báo tuyệt vời. Cảm ơn =] Mỗi ngày chúng ta có thể học được điều gì đó, cải thiện phong cách viết mã của mình. Điều này chỉ ra đúng hướng
Scott
Mọi chuyện diễn ra rất suôn sẻ cho đến khi bạn đề cập đến PSR2. ừ
Scott
Mọi chuyện diễn ra rất suôn sẻ cho đến khi bạn đề cập đến PSR2. ừ
Will Haven
Bây giờ ngôn ngữ của bạn là gì?
Will Haven
Bây giờ ngôn ngữ của bạn là gì?
Vojtech Kurka
Chỉ là một cảnh báo. Khi sử dụng các mảng không trống, count[$array] có thể làm chậm mã của bạn một cách đáng kể. Hơn nữa, một số nhà phát triển có xu hướng sử dụng if[count[$arr]]. vòng lặp bên trong. Tôi sẽ không khuyến nghị thực hành này cho các mảng
Vojtech Kurka
Chỉ là một cảnh báo. Khi sử dụng các mảng không trống, count[$array] có thể làm chậm mã của bạn một cách đáng kể. Hơn nữa, một số nhà phát triển có xu hướng sử dụng if[count[$arr]]. vòng lặp bên trong. Tôi sẽ không khuyến nghị thực hành này cho các mảng
sương khói
Cảm ơn vì bài viết rất nhiều thông tin và tôi thích nó nhưng "Mặc dù tên của nó, isset[] không chỉ trả về false nếu một mục không tồn tại mà còn trả về false cho các giá trị null. " là sai, nó trả về true nếu giá trị nếu sai và chỉ trả về false nếu giá trị là null
sương khói
Cảm ơn vì bài viết rất nhiều thông tin và tôi thích nó nhưng "Mặc dù tên của nó, isset[] không chỉ trả về false nếu một mục không tồn tại mà còn trả về false cho các giá trị null. " là sai, nó trả về true nếu giá trị nếu sai và chỉ trả về false nếu giá trị là null
Maxim Naguchev
> Thật không may, nếu một lớp sử dụng hàm __get[] ma thuật để truy xuất giá trị của thuộc tính, > không có cách nào dễ dàng để kiểm tra xem giá trị thuộc tính đó có trống hay không. Nó không đúng. Xây dựng empty[$var] trước tiên hãy thử gọi isset[] và, nếu biến được đặt, sau đó kiểm tra xem biến có trống hay không. Vì vậy, nếu lớp sử dụng phương thức ma thuật _get[], thì nó phải nhận ra phương thức ma thuật _isset[]. Và trống[] sẽ hoạt động bình thường
Maxim Naguchev
> Thật không may, nếu một lớp sử dụng hàm __get[] ma thuật để truy xuất giá trị của thuộc tính, > không có cách nào dễ dàng để kiểm tra xem giá trị thuộc tính đó có trống hay không. Nó không đúng. Xây dựng empty[$var] trước tiên hãy thử gọi isset[] và, nếu biến được đặt, sau đó kiểm tra xem biến có trống hay không. Vì vậy, nếu lớp sử dụng phương thức ma thuật _get[], thì nó phải nhận ra phương thức ma thuật _isset[]. Và trống[] sẽ hoạt động bình thường
Myroniar
hữu ích, cảm ơn
Myroniar
hữu ích, cảm ơn
Dusan Lukic
Cảm ơn vì bài viết rất hữu ích này. Tôi chỉ muốn sửa một chút, bạn nói rằng "PHP luôn truyền đối tượng theo tham chiếu", điều này thực tế không hoàn toàn đúng, vì PHP sử dụng cơ chế đặc biệt cho các đối tượng tương tự như truyền theo tham chiếu, đó là câu thứ hai trên . http. //php. net/manual/vi/ngôn ngữ. oop5. người giới thiệu. php Ngoài ra, bài viết tuyệt vời
Dusan Lukic
Cảm ơn vì bài viết rất hữu ích này. Tôi chỉ muốn sửa một chút, bạn nói rằng "PHP luôn truyền đối tượng theo tham chiếu", điều này thực tế không hoàn toàn đúng, vì PHP sử dụng cơ chế đặc biệt cho các đối tượng tương tự như truyền theo tham chiếu, đó là câu thứ hai trên . http. //php. net/manual/vi/ngôn ngữ. oop5. người giới thiệu. php Ngoài ra, bài viết tuyệt vời
Roy
Bài báo được viết rất tốt với nội dung gốc. Tốt lắm
Roy
Bài báo được viết rất tốt với nội dung gốc. Tốt lắm
Donato C. Laynes Gonzales
Về #2, $_POST['active'] sẽ tạo E_NOTICE nếu khóa không tồn tại [các hộp kiểm và radio không được chọn] Nếu bạn quan tâm đến hiệu suất và bảo mật của PHP, điều này rất quan trọng. array_key_exists là tùy chọn tốt hơn như đã giải thích. Trân trọng
Donato C. Laynes Gonzales
Về #2, $_POST['active'] sẽ tạo E_NOTICE nếu khóa không tồn tại [các hộp kiểm và radio không được chọn] Nếu bạn quan tâm đến hiệu suất và bảo mật của PHP, điều này rất quan trọng. array_key_exists là tùy chọn tốt hơn như đã giải thích. Trân trọng
Aschwin Wesselius
Đáng ngạc nhiên là không ai đề cập đến việc bạn sử dụng /root/test. php. Tôi biết, đó là môi trường cục bộ và tất cả, nhưng vẫn chạy các tập lệnh kiểm tra trong thư mục gốc của bạn, đặc biệt là các kiểm tra ngốn nhiều bộ nhớ. Điều đó được thực hiện trên mục đích?
Aschwin Wesselius
Đáng ngạc nhiên là không ai đề cập đến việc bạn sử dụng /root/test. php. Tôi biết, đó là môi trường cục bộ và tất cả, nhưng vẫn chạy các tập lệnh kiểm tra trong thư mục gốc của bạn, đặc biệt là các kiểm tra ngốn nhiều bộ nhớ. Điều đó được thực hiện trên mục đích?
ajaniashish
Bài viết xuất sắc Ilya, hoàn toàn đồng ý với nhận định của bạn "hàng giờ vò đầu bứt tóc". Thông thường, khi nói đến việc tối ưu hóa tốc độ trang web, chúng tôi thấy các truy vấn không cần thiết bên trong các vòng lặp. Công cụ tuyệt vời
ajaniashish
Bài viết xuất sắc Ilya, hoàn toàn đồng ý với nhận định của bạn "hàng giờ vò đầu bứt tóc". Thông thường, khi nói đến việc tối ưu hóa tốc độ trang web, chúng tôi thấy các truy vấn không cần thiết bên trong các vòng lặp. Công cụ tuyệt vời
Scott
Bởi vì PSR-2 có ý định trở thành Tiêu chuẩn mã hóa thực sự duy nhất. Có, các tiêu chuẩn mã hóa là bắt buộc, nhưng không nhất thiết phải là PSR-2. Ngay cả bài viết này cũng nói rằng bạn cần một "lý do thuyết phục" để không sử dụng nó, điều đơn giản là không đúng
Scott
Bởi vì PSR-2 có ý định trở thành Tiêu chuẩn mã hóa thực sự duy nhất. Có, các tiêu chuẩn mã hóa là bắt buộc, nhưng không nhất thiết phải là PSR-2. Ngay cả bài viết này cũng nói rằng bạn cần một "lý do thuyết phục" để không sử dụng nó, điều đơn giản là không đúng
Jason EdgeCombe
Trong mẹo số 4 và số 5, sử dụng truy vấn [] với nối chuỗi là một ví dụ trong sách giáo khoa về lỗ hổng SQL injection. Tốt hơn là sử dụng các câu lệnh đã chuẩn bị sẵn hoặc ít nhất là cảnh báo người đọc rằng các biến đầu vào phải được làm sạch trước. Vui lòng cập nhật bài viết để mọi người không mù quáng sử dụng mã ví dụ và nghĩ rằng nó an toàn. Bài viết này cũng cần có ngày khi bài viết được viết hoặc cập nhật lần cuối để người đọc có thể biết liệu thông tin có cũ không
Jason EdgeCombe
Trong mẹo số 4 và số 5, sử dụng truy vấn [] với nối chuỗi là một ví dụ trong sách giáo khoa về lỗ hổng SQL injection. Tốt hơn là sử dụng các câu lệnh đã chuẩn bị sẵn hoặc ít nhất là cảnh báo người đọc rằng các biến đầu vào phải được làm sạch trước. Vui lòng cập nhật bài viết để mọi người không mù quáng sử dụng mã ví dụ và nghĩ rằng nó an toàn. Bài viết này cũng cần có ngày khi bài viết được viết hoặc cập nhật lần cuối để người đọc có thể biết liệu thông tin có cũ không
Công viên Grant Wesley
Đó là điều tương tự. null là giá trị null duy nhất
Công viên Grant Wesley
Đó là điều tương tự. null là giá trị null duy nhất
Jeff Mattson
Trong Sai lầm phổ biến #2. Ví dụ của bạn không nên đọc nếu [. $_POST['đang hoạt động']] { echo 'bài đăng không hoạt động';
Jeff Mattson
Trong Sai lầm phổ biến #2. Ví dụ của bạn không nên đọc nếu [. $_POST['đang hoạt động']] { echo 'bài đăng không hoạt động';
M. S. vignesh
có cách nào khác không?
M. S. vignesh
có cách nào khác không?
Vojtech Kurka
sử dụng một biến làm bộ đếm
Vojtech Kurka
sử dụng một biến làm bộ đếm
Erutan409
Tôi thấy những điều sau đây là vô lý. Dấu ngoặc mở cho lớp PHẢI ở dòng tiếp theo và dấu ngoặc đóng PHẢI ở dòng tiếp theo sau phần thân. Dấu ngoặc mở cho các phương thức PHẢI đi trên dòng tiếp theo và dấu ngoặc đóng PHẢI đi trên dòng tiếp theo sau phần thân. Vì vậy, tôi cũng gặp một số vấn đề với PSR-2
Erutan409
Tôi thấy những điều sau đây là vô lý. Dấu ngoặc mở cho lớp PHẢI ở dòng tiếp theo và dấu ngoặc đóng PHẢI ở dòng tiếp theo sau phần thân. Dấu ngoặc mở cho các phương thức PHẢI đi trên dòng tiếp theo và dấu ngoặc đóng PHẢI đi trên dòng tiếp theo sau phần thân. Vì vậy, tôi cũng gặp một số vấn đề với PSR-2
phat_boi
Thật. Tuy nhiên, tiêu chuẩn nào được sử dụng không quan trọng miễn là nó rộng khắp tổ chức. Bạn không vào công ty mà chỉ bắt đầu sử dụng PSR-2 khi đã có một tiêu chuẩn được thiết lập. Bạn kết thúc với một mớ hỗn độn theo cách đó
phat_boi
Thật. Tuy nhiên, tiêu chuẩn nào được sử dụng không quan trọng miễn là nó rộng khắp tổ chức. Bạn không vào công ty mà chỉ bắt đầu sử dụng PSR-2 khi đã có một tiêu chuẩn được thiết lập. Bạn kết thúc với một mớ hỗn độn theo cách đó
Julian Chappell
+1. tất cả kẻ giết người không phụ
Julian Chappell
+1. tất cả kẻ giết người không phụ
Juukie14
👍 mẹo hay
Juukie14
👍 mẹo hay
Không Tên
> Sai lầm thường gặp #5 Đó không phải là sai lầm thực sự. Hãy xem xét, nếu truy vấn của bạn có thời lượng chạy 1 giây/truy vấn, vậy điều gì xảy ra nếu bạn cần 50-100 truy vấn như vậy? . Nhưng bạn phải xóa bộ nhớ tài nguyên sau khi nhận được kết quả truy vấn nếu bạn có ít hơn một số truy vấn đơn giản. Và về PSR-1 > Tên lớp PHẢI được khai báo trong StudlyCaps Đây là điều điên rồ nhất trong PSR
Không Tên
> Sai lầm thường gặp #5 Đó không phải là sai lầm thực sự. Hãy xem xét, nếu truy vấn của bạn có thời lượng chạy 1 giây/truy vấn, vậy điều gì xảy ra nếu bạn cần 50-100 truy vấn như vậy? . Nhưng bạn phải xóa bộ nhớ tài nguyên sau khi nhận được kết quả truy vấn nếu bạn có ít hơn một số truy vấn đơn giản. Và về PSR-1 > Tên lớp PHẢI được khai báo trong StudlyCaps Đây là điều điên rồ nhất trong PSR
Không Tên
> Sai lầm thường gặp #10. Bạn không bao giờ nên sử dụng ArrayObject thay vì mảng gốc. Nhưng bạn nên đặt kiểu định nghĩa khi bạn cần một mảng làm đối số. Bạn phải luôn biết những gì bạn mong đợi thì sẽ không bao giờ mắc lỗi trong các ví dụ trống/isset
Không Tên
> Sai lầm thường gặp #10. Bạn không bao giờ nên sử dụng ArrayObject thay vì mảng gốc. Nhưng bạn nên đặt kiểu định nghĩa khi bạn cần một mảng làm đối số. Bạn phải luôn biết những gì bạn mong đợi thì sẽ không bao giờ mắc lỗi trong các ví dụ trống/isset
Người vượt qua Idemudia
Tuyệt vời, cảm ơn bạn
Người vượt qua Idemudia
Tuyệt vời, cảm ơn bạn
Erik Bêlarut
một giải pháp tốt cho lỗi #1 thay vì nhớ gọi unset[] sẽ là sử dụng array_map[]
Erik Bêlarut
một giải pháp tốt cho lỗi #1 thay vì nhớ gọi unset[] sẽ là sử dụng array_map[]
Evgeny Chernyavskiy
cũng như mảng_walk[]
Evgeny Chernyavskiy
cũng như mảng_walk[]
timw4mail
Tuy nhiên, bài đăng đó có những điểm không chính xác vào thời điểm đó và ít liên quan hơn bao giờ hết. Tôi sẽ không nói rằng PHP là một ngôn ngữ 'thuần' hay 'sạch', nhưng nói chung nó không dễ bị lỗi như 'bài viết' đó có vẻ như vậy
timw4mail
Tuy nhiên, bài đăng đó có những điểm không chính xác vào thời điểm đó và ít liên quan hơn bao giờ hết. Tôi sẽ không nói rằng PHP là một ngôn ngữ 'thuần' hay 'sạch', nhưng nói chung nó không dễ bị lỗi như 'bài viết' đó có vẻ như vậy
Ricardo Sánchez
Tại sao không chỉ. mảng $?. ] Chúng tôi biết biến luôn được đặt, luôn luôn. Tại sao bạn cố gắng sử dụng một biến có thể không tồn tại? . Các biến phải luôn tồn tại. cộng với isset và trống dẫn đến lỗi đánh máy trong tập lệnh. $myVars = 0; . Hãy để trình biên dịch phàn nàn thay vì im lặng với @/isset/empty. PSR chỉ nhằm mục đích sử dụng nội bộ. Nó KHÔNG BAO GIỜ nhằm mục đích được sử dụng cho người khác. như họ nói trong Câu hỏi thường gặp. "Không ai trong nhóm muốn nói với bạn, với tư cách là một lập trình viên, cách xây dựng ứng dụng của bạn. " Vì vậy, đó là một lỗi phổ biến mà các lập trình viên php mắc phải, hãy làm theo khuyến nghị không dành cho họ. ]
Ricardo Sánchez
Tại sao không chỉ. mảng $?. ] Chúng tôi biết biến luôn được đặt, luôn luôn. Tại sao bạn cố gắng sử dụng một biến có thể không tồn tại? . Các biến phải luôn tồn tại. cộng với isset và trống dẫn đến lỗi đánh máy trong tập lệnh. $myVars = 0; . Hãy để trình biên dịch phàn nàn thay vì im lặng với @/isset/empty. PSR chỉ nhằm mục đích sử dụng nội bộ. Nó KHÔNG BAO GIỜ nhằm mục đích được sử dụng cho người khác. như họ nói trong Câu hỏi thường gặp. "Không ai trong nhóm muốn nói với bạn, với tư cách là một lập trình viên, cách xây dựng ứng dụng của bạn. " Vì vậy, đó là một lỗi phổ biến mà các lập trình viên php mắc phải, hãy làm theo khuyến nghị không dành cho họ. ]
Marco Cante
Dành cho 2. get_define_vars với array_key_exist rất chậm nếu bạn đặt nhiều biến, phải không?
Marco Cante
Dành cho 2. get_define_vars với array_key_exist rất chậm nếu bạn đặt nhiều biến, phải không?
khổ hạnh
đó là vấn đề về quan điểm và các tiêu chuẩn được xác định bởi thực tiễn của đa số. Tại sao lại vô lý như vậy? . Các định nghĩa lớp và định nghĩa phương thức có thể dài [đôi khi ghi nhật ký vô lý] để dấu ngoặc mở có thể ở bên phải. Để nó tự động xuống dòng tiếp theo giúp tiết kiệm khả năng đọc và đó chỉ là một quy tắc giúp giảm ô nhiễm
khổ hạnh
đó là vấn đề về quan điểm và các tiêu chuẩn được xác định bởi thực tiễn của đa số. Tại sao lại vô lý như vậy? . Các định nghĩa lớp và định nghĩa phương thức có thể dài [đôi khi ghi nhật ký vô lý] để dấu ngoặc mở có thể ở bên phải. Để nó tự động xuống dòng tiếp theo giúp tiết kiệm khả năng đọc và đó chỉ là một quy tắc giúp giảm ô nhiễm
khổ hạnh
1. Tiện ích mở rộng mysql được đề cập ở đó không được dùng nữa ngay cả tại thời điểm viết bài. Đó là một vấn đề mà thậm chí sau đó không cần giải pháp mã. 2. Nghiêm túc mà nói, tác giả đang đưa ra một giải pháp thay thế, một phương pháp được loại bỏ có chủ đích khỏi php lõi [trả lại bằng cách tham khảo] mà tất cả các hướng dẫn thực hành tốt nhất đều khuyên chống lại [trừ khi có lý do thực sự chính đáng] vì lý do duy nhất là cho phép thay đổi thành viên lớp RIÊNG TƯ . tại sao thúc đẩy trở lại bằng cách tham khảo?
khổ hạnh
1. Tiện ích mở rộng mysql được đề cập ở đó không được dùng nữa ngay cả tại thời điểm viết bài. Đó là một vấn đề mà thậm chí sau đó không cần giải pháp mã. 2. Nghiêm túc mà nói, tác giả đang đưa ra một giải pháp thay thế, một phương pháp được loại bỏ có chủ đích khỏi php lõi [trả lại bằng cách tham khảo] mà tất cả các hướng dẫn thực hành tốt nhất đều khuyên chống lại [trừ khi có lý do thực sự chính đáng] vì lý do duy nhất là cho phép thay đổi thành viên lớp RIÊNG TƯ . tại sao thúc đẩy trở lại bằng cách tham khảo?
govindrajput
Bài viết hay và thông tin rất hay có trong bài đăng này vì vậy tôi thích bài đăng này cảm ơn
govindrajput
Bài viết hay và thông tin rất hay có trong bài đăng này vì vậy tôi thích bài đăng này cảm ơn
CÔNG TY TÀI CHÍNH NĂM SAO
Bạn có cần một khoản vay để hợp nhất khoản nợ của mình ở mức 3% không? . Chúng tôi cung cấp dịch vụ tư vấn tài chính cho khách hàng, các công ty đang tìm kiếm nguồn vốn vay/nợ và tìm kiếm vốn lưu động để bắt đầu một doanh nghiệp mới hoặc để mở rộng hoạt động kinh doanh hiện có. Các bên trung gian / Tư vấn / Môi giới được chào đón mang theo khách hàng của họ và được bảo vệ 100%. Các bên quan tâm nên liên hệ với chúng tôi để biết thêm thông tin qua email. fivestarfinancecompany@gmail. com Để gọi hoặc whatsapp chúng tôi +16042659337
CÔNG TY TÀI CHÍNH NĂM SAO
Bạn có cần một khoản vay để hợp nhất khoản nợ của mình ở mức 3% không? . Chúng tôi cung cấp dịch vụ tư vấn tài chính cho khách hàng, các công ty đang tìm kiếm nguồn vốn vay/nợ và tìm kiếm vốn lưu động để bắt đầu một doanh nghiệp mới hoặc để mở rộng hoạt động kinh doanh hiện có. Các bên trung gian / Tư vấn / Môi giới được chào đón mang theo khách hàng của họ và được bảo vệ 100%. Các bên quan tâm nên liên hệ với chúng tôi để biết thêm thông tin qua email. fivestarfinancecompany@gmail. com Để gọi hoặc whatsapp chúng tôi +16042659337
điểm ngon
Heyas, I may be 4 or 5 years to late for a response, but no one seems to know the right answer to this one. If I create a php index file with html tags neatly laid out which is worse: A] Having a bunch of php code on top of the index php file and some in the middle for example "