2010-12-12 25 views
5

Tôi đã xem xét Ruby và nó có một cấu trúc OO rất đẹp không giống như PHP với các hàm chuỗi giống như C. Tôi đã tự hỏi nếu có một phần mở rộng mà làm cho chuỗi thành các đối tượng, do đó bạn có thể sử dụng chúng như thế này:Chuỗi/số định hướng đối tượng trong PHP?

$str = "sometext"; 
echo "len:" . $str->length; //would print 'len: 8' 
+0

tôi nghi ngờ rằng có thể vì cách PHP hoạt động. Đúng? –

+1

... 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. ;-) –

+0

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. –

Trả lời

7

Hãy xem này ...

http://code.google.com/p/php-string/downloads/detail?name=string.php&can=2&q=

Lớp hỗ trợ các phần mở rộng mbstring và iconv, và gói PHP-UTF8. Nó chọn hàm sẵn có tốt nhất cho mỗi phương thức Ngoài ra, nó cung cấp nhiều phương thức mới. Một số trong số đó là: substringBetween, splice, startWith, endsWith và squeeze. Cũng có thể sử dụng các hàm nội bộ PHP, hoặc các hàm tùy chỉnh, để thao tác chuỗi.

Sample Code:

<?php 

include('string.php'); 

$str = new String('sometext'); 
echo $str->length; //prints 8 
echo $str->getLength(); //prints 8 

?> 

Tôi chưa bao giờ sử dụng lớp này trước nhưng bằng cách nhìn vào tài liệu của nó có một số phương pháp khá thú vị. viết hoa, charAt, compareTo, chứa, v.v.

+0

Nhưng làm thế nào để làm cho nó để "abc" sẽ tạo ra một lớp học mới? –

+0

$ str = new String ('abc') khi bạn đưa vào lớp đó trong mã của mình. –

+2

Nhưng tôi muốn sử dụng nó như tôi sử dụng một chuỗi bình thường. Đó là toàn bộ vấn đề, tôi muốn tất cả các chuỗi là đối tượng. –

2

Nếu bạn muốn bạn có thể tạo riêng lớp String wrapper của bạn mà có phương pháp tất cả các chuỗi dựa và các thuộc tính tính mà bạn có thể muốn. Chỉnh sửa: Trong cùng một cách mà Java có các lớp bao bọc cho một số kiểu dữ liệu.

+2

Trên thực tế, không có kiểu chuỗi nguyên thủy trong Java - tất cả các chuỗi là các đối tượng của lớp 'java.lang.String'. – casablanca

+0

@casablanca Vâng, đây là một câu hỏi PHP và không phải là một câu hỏi Java. Phần PHP của câu trả lời của tôi vẫn có giá trị hay câu trả lời xứng đáng được bỏ phiếu dựa trên ví dụ xấu của tôi? Tôi có thể đã nghĩ đến char trong đầu và bối rối. – Alexio

+0

Tôi xin lỗi nhưng đó không phải là tôi đã downvoted bạn. Trong thực tế, tôi đã cho bạn một +1 bây giờ để phủ nhận downvote và cũng bởi vì bạn thực sự đã trả lời câu hỏi của OP. – casablanca

0

SplString. Nhưng nó chưa có sẵn trong PHP 5.3. Và tôi nghi ngờ đó là việc sử dụng nhiều nếu nó xảy ra xung quanh, vì nó không chứa bất kỳ phương pháp hữu ích nào. Có lẽ người ta có thể xây dựng dựa trên nó. Nhưng sau đó đó là chỉ cho chuỗi. PHP được xây dựng dựa trên vô hướng và việc sử dụng nó hoàn toàn hướng đối tượng là không thể vào lúc này.

1

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 
+0

Bạn tạo một đối tượng String mới bên trong vòng lặp trong mỗi chu kỳ, nhưng khi bạn sử dụng kiểu chuỗi gốc, bạn xác định nó chỉ một lần ở đầu bài kiểm tra. Điều này, tất nhiên có tác động đến hiệu suất. – MrAn3

0

Đó là năm 2014 và SplString vẫn không mặc định trong PHP. Tôi muốn có một cái nhìn tại địa chỉ:

https://github.com/nikic/scalar_objects

Đó là một phần mở rộng, vì vậy bạn phải cài đặt nó.

2

Tôi hơi muộn trò chơi, nhưng tôi đang tìm kiếm một thư viện giống như thế này và bắt gặp câu hỏi này. Sau khi điều tra thêm, tôi đã tìm thấy số danielstjules/Stringy rực rỡ tại GitHub.

Tôi đã xem qua tài liệu và nguồn và có vẻ khá chắc chắn. Tôi khuyên bạn nên xem xét nếu bạn muốn một lớp PHP String Wrapper để làm cho thao tác chuỗi dễ dàng hơn. Lưu ý rằng mã này không phải là một phần mở rộng PHP, có nghĩa là không có thao tác gốc, nó chỉ đơn giản là một trình bao bọc.

Stringy

A PHP string manipulation library with multibyte support. Compatible with PHP 5.3+, PHP 7, and HHVM.

Một vài ví dụ:

s('Upper Camel-Case')->upperCamelize(); // 'UpperCamelCase' 
s('What are your plans today?')->truncate(19, '...'); // 'What are your pl...' 
s('foo & bar')->containsAll(['foo', 'bar']); // true 
s('Ο συγγραφέας είπε')->countSubstr('α'); // 2 
Các vấn đề liên quan