PHP tương đương với .NET / Java's toString ()


556

Làm cách nào để chuyển đổi giá trị của biến PHP thành chuỗi?

Tôi đang tìm kiếm một cái gì đó tốt hơn là nối với một chuỗi trống:

$myText = $myVar . '';

Giống như ToString()phương thức trong Java hoặc .NET.


6
Đây dường như là câu trả lời đúng: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234

Tôi sẽ sử dụng json_encode($myText). Tôi đã thấy rằng các giải pháp được đề xuất print_r(string)varhoạt động tốt cho các giá trị vô hướng và các đối tượng đơn giản. Đối với các biến, lớp hoặc đối tượng phức tạp nếu __toString()không xác định đầy đủ, tôi thích nói ở trên json_encode.
Eric Kigathi

Câu trả lời:


791

Bạn có thể dùng toán tử đúc :

$myText = (string)$myVar;

Có nhiều chi tiết hơn cho việc truyền và chuyển đổi chuỗi trong phần Chuỗi của sổ tay PHP, bao gồm xử lý đặc biệt cho booleans và null.


11
Object of class Foo could not be converted to string. Có một giải pháp chung nào có thể chuyển đổi bất cứ thứ gì (mảng + đối tượng + bất cứ thứ gì) thành một chuỗi không?
ripper234


2
Lưu ý: điều này sẽ đưa ra một thông báo PHP khi được sử dụng trên các mảng.
dave1010

29
@MarkAmery Ông đã đưa ra một câu trả lời ngầm gọi là __toString()"Phương pháp kỳ diệu", nhưng không hề đề cập đến điều đó. Người dùng đã yêu cầu một câu trả lời giống như toString()phương thức Java và trong PHP, đó là __toString()hàm.
Supuhstar

2
@Supuhstar À đúng rồi, cuối cùng tôi cũng hiểu bạn đến từ đâu. Xin lỗi nếu tôi đã bị làm phiền trước đây. Tôi đồng ý rằng đây là một chi tiết có liên quan và sẽ rất có giá trị khi thêm nó, có lẽ tách câu trả lời thành các phần 'Chuyển đổi nguyên thủy' và 'Chuyển đổi đối tượng' bằng các tiêu đề.
Đánh dấu Amery

309

Điều này được thực hiện với typecasting:

$strvar = (string) $var; // Casts to string
echo $var; // Will cast to string implicitly
var_dump($var); // Will show the true type of the variable

Trong một lớp bạn có thể định nghĩa đầu ra là gì bằng cách sử dụng phương thức ma thuật __toString. Một ví dụ dưới đây:

class Bottles {
    public function __toString()
    {
        return 'Ninety nine green bottles';
    }
}

$ex = new Bottles;
var_dump($ex, (string) $ex);
// Returns: instance of Bottles and "Ninety nine green bottles"

Một số ví dụ đúc kiểu hơn:

$i = 1;

// int 1
var_dump((int) $i);

// bool true
var_dump((bool) $i);

// string "1"
var_dump((string) 1);

126

Sử dụng print_r :

$myText = print_r($myVar,true);

Bạn cũng có thể sử dụng nó như:

$myText = print_r($myVar,true)."foo bar";

Điều này sẽ được đặt $myTextthành một chuỗi, như:

array (
  0 => '11',
)foo bar

Sử dụng var_export để có thêm một chút thông tin (với các loại biến, ...):

$myText = var_export($myVar,true);

1
"khi tham số trả về là TRUE, [print_r] sẽ trả về một chuỗi." Vì print_r là một cách hay để in các đối tượng, mảng (và cả số / chuỗi), đây là một cách tốt để chuyển đổi một đối tượng thành một chuỗi có thể đọc được.
Cedric

1
Người mới tham gia FYI, truemột phần là cần thiết! Tôi đã thử một số phương pháp chuyển đổi chuỗi bao gồm print_rvà thất vọng từ tất cả chúng, và sau đó tôi phát hiện ra truetham số (đọc tài liệu về lý do tại sao nó hoạt động).
ripper234

57

Bạn có thể sử dụng typecasting:

$var = (string)$varname;

hoặc StringValue:

$var = strval($varname);

hoặc SetType:

$success = settype($varname, 'string');
// $varname itself becomes a string

Tất cả đều hoạt động cho cùng một thứ về Kiểu tung hứng.


strval ($ varname) thực hiện thủ thuật cho tôi, đặc biệt là khi giá trị được trả về dưới dạng kiểu "biến thể" và cần được chuyển đổi thành chuỗi hoặc int.
Milan

strval()là những gì tôi đã tìm kiếm vì tôi muốn sử dụng nó với array_walk. Ví dụ:$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus

33

Làm cách nào để chuyển đổi giá trị của biến PHP thành chuỗi?

Một giá trị có thể được chuyển đổi thành một chuỗi bằng cách sử dụng hàm (chuỗi) hoặc hàm strval () . (Chỉnh sửa: Như Thomas cũng đã nêu).

Nó cũng sẽ được tự động truyền cho bạn khi bạn sử dụng nó như một chuỗi.


28

Bạn đang tìm kiếm strval :

string strval ( mixed $var )

Lấy giá trị chuỗi của một biến. Xem tài liệu về chuỗi để biết thêm thông tin về chuyển đổi thành chuỗi.

Hàm này thực hiện không định dạng trên giá trị trả về. Nếu bạn đang tìm cách định dạng một giá trị số dưới dạng chuỗi, vui lòng xem sprintf () hoặc number_format ().


3
Điều này thực sự rất hữu ích vì tôi muốn chuyển đổi tất cả các số thành chuỗi mà không cần sử dụng một cuộc gọi lại tùy chỉnh. $strings = array_map('strval', $my_numbers);
peterchaula

Đây là câu trả lời duy nhất hoạt động với array_mapvà các chuỗi gọi được nói chung.
Danon

18

Đối với người nguyên thủy chỉ cần sử dụng (string)$var hoặc in biến này ngay lập tức. PHP là ngôn ngữ được gõ động và biến sẽ được chuyển thành chuỗi khi đang di chuyển.

Nếu bạn muốn chuyển đổi các đối tượng thành chuỗi, bạn sẽ cần xác định __toString()phương thức trả về chuỗi. Phương pháp này bị cấm ném ngoại lệ.


15

Đặt nó trong dấu ngoặc kép sẽ hoạt động:

$myText = "$myVar";

Điều đó hoạt động, nhưng tôi không biết nếu đó là cách làm tiêu chuẩn trong PHP.
Antoine Aubry

Đó là một cách rất chuẩn để làm điều đó trong bash
Yauhen Yakimovich

Phương thức này sẽ hoạt động nếu $ myVar là một đối tượng của lớp có kiểu __toString hoặc vô hướng. Trong các trường hợp khác tạo ra một lỗi.
zennin

11

Tôi nghĩ điều đáng nói là bạn có thể bắt bất kỳ đầu ra (như print_r, var_dump) nào trong một biến bằng cách sử dụng bộ đệm đầu ra:

<?php
    ob_start();
    var_dump($someVar);
    $result = ob_get_clean();
?>

Nhờ: Làm thế nào tôi có thể nắm bắt kết quả của var_dump thành một chuỗi?


1
điều đáng nói là bạn không cần điều đó với print_r . Chỉ cần sử dụng ghi đè để trở lại như một chuỗi.
ars265

1
Một cách tốt hơn sẽ là sử dụng $result = var_export($someVar, true)mà không có ob.
Danon

8

Một tùy chọn khác là sử dụng chức năng settype tích hợp:

<?php
$foo = "5bar"; // string
$bar = true;   // boolean

settype($foo, "integer"); // $foo is now 5   (integer)
settype($bar, "string");  // $bar is now "1" (string)
?>

Điều này thực sự thực hiện chuyển đổi trên biến không giống như typecasting và cho phép bạn có một cách chung để chuyển đổi thành nhiều loại.


8

Ngoài câu trả lời được đưa ra bởi Thomas G. Mayfield:

Nếu bạn theo liên kết đến hướng dẫn đúc chuỗi, có một trường hợp đặc biệt khá quan trọng để hiểu:

Truyền (chuỗi) được ưu tiên đặc biệt nếu biến $ a của bạn là một đối tượng, bởi vì PHP sẽ theo giao thức truyền theo mô hình đối tượng của nó bằng cách gọi phương thức ma thuật __toString () (nếu được định nghĩa trong lớp mà $ a được khởi tạo từ ).

PHP làm một cái gì đó tương tự như

function castToString($instance) 
{ 
    if (is_object($instance) && method_exists($instance, '__toString')) {
        return call_user_func_array(array($instance, '__toString'));
    }
}

Các (string) hoạt động đúc là một kỹ thuật được đề nghị cho PHP5 + lập trình làm cho nhiều mã Object-Oriented. IMO đây là một ví dụ hay về sự tương đồng về thiết kế (sự khác biệt) với các ngôn ngữ OOP khác như Java / C # / v.v., tức là theo cách PHP đặc biệt của riêng nó (bất cứ khi nào nó tốt hoặc có giá trị).


8

Như những người khác đã đề cập, các đối tượng cần một __toStringphương thức để được truyền thành một chuỗi. Một đối tượng không xác định phương thức đó vẫn có thể tạo ra một biểu diễn chuỗi bằng cách sử dụng hàm spl_object_hash .

Hàm này trả về một định danh duy nhất cho đối tượng. Id này có thể được sử dụng làm khóa băm để lưu trữ các đối tượng hoặc để xác định một đối tượng, miễn là đối tượng không bị phá hủy. Khi đối tượng bị hủy, hàm băm của nó có thể được sử dụng lại cho các đối tượng khác.

Tôi có một lớp Object cơ sở với một __toStringphương thức mặc định để gọimd5(spl_object_hash($this)) để làm cho đầu ra rõ ràng là duy nhất, vì đầu ra từ spl_object_hash có thể trông rất giống nhau giữa các đối tượng.

Điều này đặc biệt hữu ích cho việc gỡ lỗi mã trong đó một biến khởi tạo là một Đối tượng và sau đó trong mã, nó bị nghi ngờ đã thay đổi thành một Đối tượng khác. Chỉ cần lặp lại các biến cho nhật ký có thể tiết lộ sự thay đổi từ hàm băm đối tượng (hoặc không).


6

Một số, nếu không phải tất cả, các phương thức trong các câu trả lời trước đều thất bại khi biến chuỗi dự định có số 0 đứng đầu , ví dụ: 077543 .

Một nỗ lực để chuyển đổi một biến như vậy không có được chuỗi dự định, bởi vì biến được chuyển đổi thành cơ sở 8 (bát phân) .

Tất cả những thứ này sẽ $strcó giá trị là 32611 :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");

1
Đây là PICNIC (vấn đề trên ghế, không phải ở máy tính) vì không có gì thất bại ở đây ! print 077543;đầu ra 32611, vì vậy đây là giá trị chuỗi chính xác của $no. Không ai mong đợi rằng (string)+1trả về chuỗi +1(nó trả về chính xác 1) cũng như $no = 1+1; print (string)$no;đầu ra 1+1. Ghi chú: (1) Tương tự cho hex ( $no=0xff;). (2) Bạn có thể lấy lại giá trị bát phân với '0'.decoct($no);(3) $no="077543";giữ vị trí dẫn đầu 0, "077543" + 1` cho 77544trong khi 077543+1(chính xác) đưa ra 32612. (PS: không được đánh giá thấp, vì lỗi này là phổ biến)
Tino

4

Tôi nghĩ rằng câu hỏi này hơi sai lệch vì, toString () trong Java không chỉ là một cách để truyền một cái gì đó vào Chuỗi. Đó là những gì truyền qua (chuỗi) hoặc String.valueOf (), và nó hoạt động tốt trong PHP.

// Java
String myText = (string) myVar;

// PHP
$myText = (string) $myVar;

Lưu ý rằng điều này có thể có vấn đề vì Java là loại an toàn ( xem tại đây để biết thêm chi tiết ).

Nhưng như tôi đã nói, điều này đang truyền và do đó không tương đương với toString () của Java.

toString trong Java không chỉ truyền một đối tượng thành Chuỗi. Nó thay vào đó sẽ cung cấp cho bạn đại diện String . Và đó là những gì __toString () trong PHP làm.

// Java
class SomeClass{
    public String toString(){
        return "some string representation";
    }
}

// PHP
class SomeClass{
    public function __toString()
    {
        return "some string representation";
    }
}

Và từ phía bên kia:

// Java
new SomeClass().toString(); // "Some string representation"

// PHP
strval(new SomeClass); // "Some string representation"

Ý tôi là gì khi "đưa ra biểu diễn String"? Hãy tưởng tượng một lớp học cho một thư viện với hàng triệu cuốn sách.

  • Việc truyền lớp đó thành Chuỗi sẽ (theo mặc định) chuyển đổi dữ liệu, ở đây tất cả các sách, thành một chuỗi để Chuỗi sẽ rất dài và hầu hết thời gian cũng không hữu ích lắm.
  • Thay vào đó, Chuỗi sẽ cung cấp cho bạn biểu diễn Chuỗi, tức là chỉ tên của thư viện. Điều này ngắn hơn và do đó cung cấp cho bạn ít hơn, nhưng thông tin quan trọng hơn.

Đây là cả hai cách tiếp cận hợp lệ nhưng với các mục tiêu rất khác nhau, không phải là một giải pháp hoàn hảo cho mọi trường hợp và bạn phải chọn một cách khôn ngoan phù hợp hơn với nhu cầu của bạn.

Chắc chắn, có nhiều lựa chọn hơn:

$no = 421337  // A number in PHP
$str = "$no"; // In PHP, stuff inside "" is calculated and variables are replaced
$str = print_r($no, true); // Same as String.format();
$str = settype($no, 'string'); // Sets $no to the String Type
$str = strval($no); // Get the string value of $no
$str = $no . ''; // As you said concatenate an empty string works too

Tất cả các phương thức này sẽ trả về một Chuỗi, một số trong số chúng sử dụng __toString bên trong và một số phương thức khác sẽ thất bại trên Đối tượng. Hãy xem tài liệu PHP để biết thêm chi tiết.



1

Dấu ngoặc kép cũng hoạt động ... nó sẽ tạo ra một chuỗi, sau đó nó sẽ PHỤ LỤC / XÁC NHẬN giá trị STRING được đúc của $ myVar ở giữa 2 chuỗi trống.


1

Bạn luôn có thể tạo một phương thức có tên .ToString ($ in) trả về

$in . '';  

1

Nếu bạn đang chuyển đổi bất cứ thứ gì ngoài các loại đơn giản như số nguyên hoặc booleans, bạn cần phải viết hàm / phương thức của riêng mình cho loại mà bạn đang cố gắng chuyển đổi, nếu không PHP sẽ chỉ in loại (như mảng, GoogleSniffer hoặc Giá thầu).


1

PHP được gõ một cách linh hoạt, như Chris Fournier đã nói, "Nếu bạn sử dụng nó như một chuỗi, nó sẽ trở thành một chuỗi". Nếu bạn đang tìm kiếm thêm quyền kiểm soát định dạng của chuỗi thì printf là câu trả lời của bạn.



1
$parent_category_name = "new clothes & shoes";

// To make it to string option one
$parent_category = strval($parent_category_name);

// Or make it a string by concatenating it with 'new clothes & shoes'
// It is useful for database queries
$parent_category = "'" . strval($parent_category_name) . "'";

Bị từ chối, vì tôi thực sự không biết bạn muốn nói gì với chúng tôi. Sử dụng strval()trên chuỗi chỉ là một sự lãng phí hoàn toàn thời gian.
Tino

anh chàng cho rằng bạn đã nhận được một giá trị chuỗi = khi nó được lặp lại, nó sẽ là "chuỗi". Nhưng, khi bạn muốn hiển thị điều đó trong javascript, bạn cần làm cho nó thành 'chuỗix' '
Daniel Adenew

Điều này là cực kỳ nguy hiểm (không phải nói: sai rõ ràng). Vui lòng xem stackoverflow.com/q/168214 hoặc stackoverflow.com/q/23740548 để hiểu cách chuyển một cái gì đó một cách an toàn từ PHP sang JS! (Xin lỗi vì có một chút không chính đáng: Việc chuyển một var PHP sang JS không phải là một phần của câu hỏi.)
Tino

0

Đối với các đối tượng, bạn không thể sử dụng toán tử cast. Thay vào đó, tôi sử dụngjson_encode() phương pháp.

Ví dụ: phần sau đây sẽ xuất nội dung vào nhật ký lỗi:

error_log(json_encode($args));

0

Hãy thử cách tiếp cận nhỏ, nhưng hiệu quả này để chuyển đổi phần văn bản của stdClass thành kiểu chuỗi:

$my_std_obj_result = $SomeResponse->return->data; // Specific to object/implementation

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion

-1

Tôi sử dụng biếnToString . Nó xử lý mọi loại PHP và linh hoạt (bạn có thể mở rộng nó nếu muốn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.