Mặc dù Jose Vega đề xuất một giải pháp tốt cho vấn đề của bạn, nhưng có một vấn đề nhỏ về hiệu năng nhỏ với cách tiếp cận này. Tôi đã đánh một bài kiểm tra cho việc này. Trong khi mỗi giải pháp thực hiện đủ tốt cho các mục đích thực tế thì có sự khác biệt.
EDIT: Vì vậy, dù sao, vì đây không phải là Ruby, cũng không phải Java, cũng như Smalltalk, bạn nên sử dụng các công cụ được cung cấp hơn là cố gắng uốn cong ngôn ngữ để đáp ứng mong đợi của bạn. Chủ yếu vì lý do hiệu suất (vì các công cụ gốc thường được viết bằng C hoặc đủ thấp để có tác động rất ít hiệu suất, mặc dù nó không phải lúc nào cũng đúng), và để dễ đọc: cộng đồng được sử dụng để xem mb_strlen() hoặc strlen() và các hàm liên quan đến chuỗi khác.
Dưới đây là đoạn code tôi sử dụng cho điểm chuẩn:
http://pastebin.com/Q4BfzQtj
Kết quả:
====> Test run 0
And here are the results:
Test with {} = 0.00097203254699707
Test with strlen() = 0.0030488967895508
Test with mb_strlen() = 0.0031669139862061
Test with String1 object = 0.012485027313232
Test with String object = 0.036020040512085
====> Test run 1
Test with {} = 0.00095200538635254
Test with strlen() = 0.0029759407043457
Test with mb_strlen() = 0.0031669139862061
Test with String1 object = 0.
Test with String object = 0.036028146743774
====> Test run 2
Test with {} = 0.0009617805480957
Test with strlen() = 0.0029959678649902
Test with mb_strlen() = 0.0031518936157227
Test with String1 object = 0.012416124343872
Test with String object = 0.037784099578857
====> Test run 3
Test with {} = 0.00081610679626465
Test with strlen() = 0.0025439262390137
Test with mb_strlen() = 0.0027410984039307
Test with String1 object = 0.010634183883667
Test with String object = 0.030903100967407
====> Test run 4
Test with {} = 0.00081205368041992
Test with strlen() = 0.0025379657745361
Test with mb_strlen() = 0.0027129650115967
Test with String1 object = 0.010583162307739
Test with String object = 0.031081914901733
====> Test run 5
Test with {} = 0.000823974609375
Test with strlen() = 0.0025639533996582
Test with mb_strlen() = 0.0026860237121582
Test with String1 object = 0.010586023330688
Test with String object = 0.030833959579468
tôi nghi ngờ rằng có thể vì cách PHP hoạt động. Đúng? –
... và sau đó bạn sẽ viết 'mb_strlen ($ str)' anyway bởi vì '-> length' không trả lại độ dài UTF-8 thực tế của chuỗi. ;-) –
Câu trả lời ngắn: Điều đó là không thể với PHP thuần túy, nhưng có thể với một số lớp đặc biệt bao bọc một biến chuỗi. –