Lặp lại một lần trong foreach php

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ặp

Mả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 ứng

Mã & 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ợp

PHP 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
1

Bâ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ơn

Bớ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

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
8

Vấ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
8

Khô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
    foreach [iterable as $value]
        statement
    
    67 [là tham chiếu đến
    
    
    19], do đó, giờ đây
    
    
    19 bằng 1. Vì vậy,
    foreach [iterable as $key => $value]
        statement
    
    42 hiện chứa [1, 2, 1]
  • vượt qua 2. Bản sao
    
    
    62 [tôi. e. , “2”] thành
    foreach [iterable as $value]
        statement
    
    67 [tham chiếu đến
    
    
    19], do đó, giờ đây
    
    
    19 bằng 2. Vì vậy,
    foreach [iterable as $key => $value]
        statement
    
    42 hiện chứa [1, 2, 2]
  • vượt qua 3. Sao chép
    
    
    19 [hiện là “2”] thành
    foreach [iterable as $value]
        statement
    
    67 [tham chiếu đến
    
    
    19], do đó,
    
    
    19 vẫn bằng 2. Vì vậy,
    foreach [iterable as $key => $value]
        statement
    
    42 hiện chứa [1, 2, 2]

Để 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


9

Sai 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ị

78

Hà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
6

Tá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

77

Khô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ót

Và 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


1

Tuy 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ều

Ví dụ: chúng ta có thể viết lại ví dụ đầu tiên trong hai ví dụ trên như sau


6

Ngoà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


7

Sai 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


6

Nếu bạn chạy đoạn mã trên, bạn sẽ nhận được như sau

foreach [iterable as $key => $value]
    statement
70

Chuyệ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ảng

Vì 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ên

foreach [iterable as $key => $value]
    statement
71

Mộ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 đó; . g

foreach [iterable as $key => $value]
    statement
72

Mã đó 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; . e

foreach [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 đợi

Như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
74

Nế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. g

foreach [iterable as $key => $value]
    statement
75

Cá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
76

Mặ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
77

Do đó, 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
78

Như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
79

Do đó, đ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
736

Chú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
80

OK, 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
82

Má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
83

Chuyệ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 PHP

Do đó, 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ôi

foreach [iterable as $key => $value]
    statement
84

Và 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
85

Khi 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
    foreach [iterable as $key => $value]
        statement
    
    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]
  • Đả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
    foreach [iterable as $key => $value]
        statement
    
    749 theo mặc định]
  • Hãy nhớ rằng
    foreach [iterable as $key => $value]
        statement
    
    750 chuyển đổi các ký hiệu không phải ASCII [e. g. , “Schrödinger” trở thành “Schr\u00f6dinger”] nhưng
    foreach [iterable as $key => $value]
        statement
    
    751 thì không
  • Đả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

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ư sau

foreach [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
752

foreach [iterable as $key => $value]
    statement
87

Thật ngạc nhiên, kết quả sẽ là

foreach [iterable as $key => $value]
    statement
88

Tạ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 POST

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ầu

Vì 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ư sau

foreach [iterable as $key => $value]
    statement
89

Sau đó, 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


90

Sai 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ì


91

Nế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


92

Tuy 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


94

Trong trường hợp đó, đây là một cách để lặp đúng các giá trị từ 'a' đến 'z' trong PHP


95

Hay cách khác


96

Sai 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

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


97

Và để làm cho vấn đề trở nên tồi tệ hơn, kết quả sẽ khác trước PHP 5. 0


98

Thậ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


99

Và 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 đắn

Mộ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ả hai

Trướ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ường

foreach [iterable as $value]
    statement
60

Sau đó, 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
61

OK, 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ày

foreach [iterable as $value]
    statement
62

Tố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ày

foreach [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
808

Thậ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

78

Ngượ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ư sau

foreach [iterable as $value]
    statement
64

Vì 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ận

Gó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ẻ

PHP

Ngườ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 "

Chủ Đề