PHP เทียบเท่ากับ. toString () ของ. NET / Java


556

ฉันจะแปลงค่าของตัวแปร PHP เป็นสตริงได้อย่างไร

ฉันกำลังมองหาสิ่งที่ดีกว่าการต่อกับสตริงว่างเปล่า:

$myText = $myVar . '';

ชอบToString()วิธีการใน Java หรือ. NET


6
นี่น่าจะเป็นคำตอบที่ถูกต้อง: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234

json_encode($myText)ฉันต้องการใช้ ฉันพบว่าโซลูชันที่แนะนำprint_rและ(string)varทำงานได้ดีสำหรับค่าสเกลาร์และวัตถุอย่างง่าย สำหรับตัวแปรที่ซับซ้อนคลาสหรือวัตถุหาก__toString()ไม่ได้กำหนดความสมบูรณ์ฉันต้องการที่กล่าวjson_encodeไว้ข้างต้น
Eric Kigathi

คำตอบ:


791

คุณสามารถใช้ตัวดำเนินการแคสต์ :

$myText = (string)$myVar;

มีรายละเอียดเพิ่มเติมสำหรับการสตริและการแปลงสตริงในส่วนสตริงของคู่มือ PHP รวมถึงการจัดการพิเศษสำหรับบูลีนและโมฆะ


11
Object of class Foo could not be converted to string. มีวิธีแก้ไขปัญหาทั่วไปที่สามารถแปลงอะไรก็ได้ (อาร์เรย์ + วัตถุ + อะไรก็ตาม) เป็นสตริงหรือไม่?
ripper234


2
หมายเหตุ: สิ่งนี้จะแจ้งเตือน PHP เมื่อใช้กับอาร์เรย์
dave1010

29
@ MarkAmery เขาให้คำตอบที่เรียกว่า__toString()"Magic Method" โดยปริยายแต่ไม่ได้พูดถึงเรื่องนี้เลย ผู้ใช้ขอคำตอบที่เหมือนtoString()วิธีJava และใน PHP นั่นคือ__toString()ฟังก์ชั่น
Supuhstar

2
@Supuhstar ใช่มั้ยในที่สุดฉันก็เข้าใจว่าคุณมาจากไหน ขออภัยถ้าฉันถูกป้านก่อน ฉันยอมรับว่านี่เป็นรายละเอียดที่เกี่ยวข้องและมันจะมีประโยชน์ในการเพิ่มบางทีแยกคำตอบลงในส่วน 'แปลงดั้งเดิม' และ 'ส่วนแปลงวัตถุ' กับส่วนหัว
Mark Amery

309

สิ่งนี้ทำด้วย 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

__toStringในชั้นเรียนที่คุณสามารถกำหนดว่าอะไรคือการส่งออกโดยใช้วิธีการที่มีมนต์ขลัง ตัวอย่างด้านล่าง:

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"

ตัวอย่างการหล่อแบบอื่น ๆ :

$i = 1;

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

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

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

126

ใช้print_r :

$myText = print_r($myVar,true);

คุณยังสามารถใช้งานได้เช่น:

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

สิ่งนี้จะตั้งค่า$myTextเป็นสตริงเช่น:

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

ใช้var_exportเพื่อรับข้อมูลเพิ่มเติมเล็กน้อย (พร้อมประเภทของตัวแปร ... ):

$myText = var_export($myVar,true);

1
"เมื่อพารามิเตอร์ส่งคืนเป็น TRUE [print_r] จะส่งคืนสตริง" เนื่องจาก print_r เป็นวิธีที่ดีในการพิมพ์วัตถุอาเรย์ (และตัวเลข / สตริง) จึงเป็นวิธีที่ดีในการแปลงวัตถุให้เป็นสตริงที่มนุษย์สามารถอ่านได้
เซดริก

1
ผู้มาใหม่ FYI trueส่วนหนึ่งเป็นสิ่งสำคัญ! ฉันลองใช้วิธีการแปลงสตริงหลายวิธีซึ่งรวมถึงprint_rและผิดหวังจากพวกเขาทั้งหมดและจากนั้นฉันค้นพบtrueพารามิเตอร์ (อ่านเอกสารประกอบว่าทำไมมันจึงใช้งานได้)
ripper234

57

คุณสามารถใช้ typecasting:

$var = (string)$varname;

หรือ StringValue:

$var = strval($varname);

หรือ SetType:

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

พวกเขาทั้งหมดทำงานเพื่อสิ่งเดียวกันในแง่ของการเล่นกลประเภท


strval ($ varname) ทำเคล็ดลับสำหรับฉันโดยเฉพาะอย่างยิ่งเมื่อส่งคืนค่าเป็นประเภท "variant" และต้องแปลงเป็นสตริงหรือ int
มิลาน

strval()เป็นสิ่งที่ผม lookigng array_walkเพราะผมอยากที่จะใช้กับ ตัวอย่าง$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus

33

ฉันจะแปลงค่าของตัวแปร PHP เป็นสตริงได้อย่างไร

ค่าสามารถแปลงเป็นสตริงที่ใช้(สตริง) หล่อหรือstrval ()ฟังก์ชั่น (แก้ไข: ตามที่โทมัสระบุด้วย)

มันควรจะถูกร่ายโดยอัตโนมัติเมื่อคุณใช้เป็นสตริง


28

คุณกำลังมองหาstrval :

string strval ( mixed $var )

รับค่าสตริงของตัวแปร ดูเอกสารประกอบเกี่ยวกับสตริงสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแปลงเป็นสตริง

ฟังก์ชั่นนี้ไม่ทำการฟอร์แมตค่าที่ส่งคืน หากคุณกำลังมองหาวิธีการจัดรูปแบบค่าตัวเลขเป็นสตริงโปรดดู sprintf () หรือ number_format ()


3
สิ่งนี้มีประโยชน์มากเพราะฉันต้องการแปลงตัวเลขทั้งหมดเป็นสตริงโดยไม่ต้องใช้การโทรกลับที่กำหนดเอง $strings = array_map('strval', $my_numbers);
peterchaula

นี่เป็นคำตอบเดียวที่ใช้ได้กับarray_mapและ callables ทั่วไป
Danon

18

สำหรับ primitives เพียงแค่ใช้(string)$varหรือพิมพ์ตัวแปรนี้ทันที PHP เป็นภาษาที่พิมพ์แบบไดนามิกและตัวแปรจะถูกส่งไปยังสตริงทันที

หากคุณต้องการแปลงวัตถุเป็นสตริงคุณจะต้องกำหนด__toString()วิธีการที่ส่งกลับสตริง วิธีนี้เป็นสิ่งต้องห้ามที่จะโยนข้อยกเว้น


15

วางไว้ในเครื่องหมายคำพูดคู่ควรทำงาน:

$myText = "$myVar";

ใช้งานได้ แต่ฉันไม่รู้ว่ามันเป็นวิธีมาตรฐานใน PHP หรือเปล่า
แอนทอน Aubry

มันเป็นวิธีการที่ได้มาตรฐานในการทุบตี
Yauhen Yakimovich

วิธีนี้จะใช้ได้ถ้า$ myVarเป็นวัตถุของคลาสที่มี __toString หรือประเภทสเกลาร์ ในกรณีอื่น ๆ สร้างข้อผิดพลาด
zennin

11

ฉันคิดว่าเป็นมูลค่าการกล่าวขวัญว่าคุณสามารถจับเอาท์พุทใด ๆ (เช่นprint_r, var_dump) ในตัวแปรโดยใช้บัฟเฟอร์ออก:

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

ขอบคุณ: ฉันจะจับผลลัพธ์ของ var_dump กับสตริงได้อย่างไร?


1
มันเป็นมูลค่าการกล่าวขวัญว่าคุณไม่จำเป็นต้องมีที่print_r เพียงใช้การแทนที่เพื่อกลับเป็นสตริง
ars265

1
วิธีที่ดีกว่าคือการใช้$result = var_export($someVar, true)โดยไม่ต้องใช้ออบ
Danon

8

ตัวเลือกอื่นคือการใช้ฟังก์ชั่นsettypeในตัว:

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

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

วิธีนี้จะทำการแปลงกับตัวแปรซึ่งแตกต่างจาก typecasting และช่วยให้คุณมีวิธีทั่วไปในการแปลงเป็นหลายประเภท


8

นอกจากคำตอบที่ได้รับจาก Thomas G. Mayfield:

หากคุณไปที่ลิงก์ไปยังคู่มือการส่งสตริงมีกรณีพิเศษที่ค่อนข้างสำคัญที่จะเข้าใจ:

(สตริง) การส่งจะดีกว่าโดยเฉพาะถ้าตัวแปร$ aเป็นวัตถุเนื่องจาก PHP จะติดตามโพรโทคอลการหล่อตามโมเดลวัตถุโดยการเรียก__toString ()วิธีการเวทย์มนตร์ (ถ้าถูกกำหนดในคลาสที่ $ a ถูกสร้างอินสแตนซ์จาก )

PHP ทำสิ่งที่คล้ายกับ

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

การดำเนินการแคสติ้ง(สตริง)เป็นเทคนิคที่แนะนำสำหรับการเขียนโปรแกรม PHP5 + การสร้างรหัสเพิ่มเติม Object-Oriented IMO นี่เป็นตัวอย่างที่ดีของการออกแบบความคล้ายคลึงกัน (ความแตกต่าง) กับภาษา OOP อื่น ๆ เช่น Java / C # / ฯลฯ . เช่นในวิธี PHP พิเศษของตัวเอง (เมื่อใดก็ตามที่มันมีประโยชน์หรือคุ้มค่า)


8

ดังที่คนอื่น ๆ ได้กล่าวถึงวัตถุต้องการ__toStringวิธีการที่จะส่งไปยังสตริง วัตถุที่ไม่ได้กำหนดวิธีการนั้นยังสามารถสร้างการแทนค่าสตริงโดยใช้ฟังก์ชันspl_object_hash

ฟังก์ชันนี้คืนค่าตัวบ่งชี้เฉพาะสำหรับวัตถุ รหัสนี้สามารถใช้เป็นคีย์แฮชสำหรับจัดเก็บวัตถุหรือเพื่อระบุวัตถุตราบใดที่วัตถุไม่ถูกทำลาย เมื่อวัตถุถูกทำลายแฮชของมันอาจถูกนำมาใช้ซ้ำสำหรับวัตถุอื่น

ฉันมีคลาส Object พื้นฐานด้วย__toStringวิธีการเริ่มต้นที่จะโทรออกmd5(spl_object_hash($this))เพื่อให้ผลลัพธ์ที่ไม่ซ้ำกันอย่างชัดเจนตั้งแต่เอาท์พุทจาก spl_object_hash สามารถดูคล้ายกันมากระหว่างวัตถุ

สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการดีบักโค้ดที่ตัวแปรเริ่มต้นเป็นวัตถุและในภายหลังในรหัสที่สงสัยว่ามีการเปลี่ยนเป็นวัตถุอื่น การสะท้อนตัวแปรไปยังบันทึกสามารถเปิดเผยการเปลี่ยนแปลงจากการแฮชของวัตถุ (หรือไม่)


6

บางอย่างถ้าไม่ได้ทั้งหมดของวิธีการในการตอบก่อนหน้านี้ล้มเหลวเมื่อตัวแปรสตริงตั้งใจมีศูนย์นำตัวอย่างเช่น077543

ความพยายามที่จะแปลงตัวแปรดังกล่าวไม่ได้รับสตริงตั้งใจเพราะตัวแปรจะถูกแปลงเป็นฐาน 8 (ฐานแปด)

ทั้งหมดนี้จะทำให้$strมีค่าเป็น32611 :

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

1
นี่คือ PICNIC (ปัญหาบนเก้าอี้ไม่ใช่ในคอมพิวเตอร์) เนื่องจากไม่มีสิ่งใดล้มเหลวที่นี่ ! print 077543;เอาท์พุทดังนั้นนี้เป็นค่าสตริงที่ถูกต้องของ32611 $noไม่มีใครคาดหวังว่า(string)+1จะส่งคืนสตริง+1(ส่งคืนได้อย่างถูกต้อง1) หรือ$no = 1+1; print (string)$no;เอาต์พุต1+1นั้น หมายเหตุ: (1) เหมือนกันสำหรับ hex ( $no=0xff;) เช่นกัน (2) คุณจะได้รับกลับค่าฐานแปดด้วย'0'.decoct($no);(3) $no="077543";ช่วยให้การชั้นนำ0"077543" + 1` ให้77544ในขณะที่077543+1(ถูกต้อง) 32612จะช่วยให้ (PS: ไม่ลงคะแนนเนื่องจากข้อผิดพลาดนี้เป็นเรื่องธรรมดา)
Tino

4

ฉันคิดว่าคำถามนี้ทำให้เข้าใจผิดเล็กน้อยเนื่องจาก toString () ใน Java ไม่ได้เป็นเพียงวิธีที่จะส่งบางสิ่งไปยัง String นั่นคือสิ่งที่ส่งผ่านทาง (สตริง) หรือ String.valueOf () และมันทำงานได้ดีใน PHP

// Java
String myText = (string) myVar;

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

โปรดทราบว่านี่อาจเป็นปัญหาได้เนื่องจาก Java ปลอดภัยสำหรับประเภท ( ดูรายละเอียดเพิ่มเติมที่นี่ )

แต่อย่างที่บอกว่านี่เป็นการคัดเลือกนักแสดงดังนั้นจึงไม่เท่ากับ toString () ของ Java

toString ใน Java ไม่เพียง แต่โยนวัตถุไปยัง String มันแทนจะทำให้คุณเป็นตัวแทนสตริง และนั่นคือสิ่งที่__toString ()ใน PHP ทำ

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

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

และจากอีกด้านหนึ่ง:

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

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

ฉันหมายถึงอะไรโดย "ให้การเป็นตัวแทนสตริง"? ลองนึกภาพชั้นเรียนสำหรับห้องสมุดที่มีหนังสือหลายล้านเล่ม

  • การคัดเลือกคลาสนั้นให้เป็นสตริง (โดยค่าเริ่มต้น) จะแปลงข้อมูลที่นี่หนังสือทั้งหมดให้เป็นสตริงดังนั้นสตริงจะยาวมากและส่วนใหญ่ไม่มีประโยชน์มากเช่นกัน
  • ถึง String แทนจะให้การแทนค่าสตริงให้คุณเช่นเฉพาะชื่อของไลบรารี สิ่งนี้สั้นกว่าและให้ข้อมูลน้อยลง แต่สำคัญกว่า

เหล่านี้เป็นวิธีการที่ถูกต้อง แต่มีเป้าหมายที่แตกต่างกันมากไม่เป็นโซลูชั่นที่สมบูรณ์แบบสำหรับทุกกรณีและคุณต้องเลือกอย่างชาญฉลาดซึ่งเหมาะกับความต้องการของคุณ

แน่นอนว่ามีตัวเลือกมากขึ้น:

$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

เมธอดเหล่านี้ทั้งหมดจะคืนค่าสตริงบางตัวใช้ __toString เป็นการภายในและบางอันจะล้มเหลวบนออบเจ็กต์ ดูรายละเอียดเพิ่มเติมในเอกสาร PHP



1

เครื่องหมายคำพูดคู่ควรทำงานด้วยเช่นกัน ... มันควรสร้างสตริงจากนั้นควรผนวก / INSERT ด้วยค่า STRING casted ของ $ myVar ในระหว่าง 2 สตริงว่าง



1

หากคุณกำลังแปลงอะไรอื่นนอกจากแบบธรรมดาเช่นจำนวนเต็มหรือบูลีนคุณต้องเขียนฟังก์ชัน / วิธีการของตัวเองสำหรับประเภทที่คุณพยายามแปลงมิฉะนั้น PHP จะพิมพ์ประเภท (เช่นอาร์เรย์ GoogleSniffer หรือ Bidet)


1

PHP ถูกพิมพ์แบบไดนามิกเช่นเดียวกับ Chris Fournier กล่าวว่า "ถ้าคุณใช้มันเหมือนสตริงมันจะกลายเป็นสตริง" หากคุณต้องการควบคุมรูปแบบของสตริงให้มากขึ้นprintfคือคำตอบของคุณ



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) . "'";

ลงเพราะฉันไม่รู้จริงๆว่าคุณต้องการบอกอะไรกับเรา การใช้strval()สตริงเป็นเพียงการเสียเวลาอย่างสมบูรณ์
Tino

เพื่อน ๆ สิ่งที่จะถือว่าคุณได้รับค่าสตริง = เมื่อ repersented มันจะเป็น "สตริง" แต่เมื่อคุณต้องการที่จะแสดงว่าในจาวาสคริปต์คุณต้องทำให้ 'stringx' '
Daniel Adenew

สิ่งนี้เป็นอันตรายอย่างยิ่ง (อย่าพูดว่า: ผิดธรรมดา) โปรดดูที่stackoverflow.com/q/168214หรือstackoverflow.com/q/23740548เพื่อทำความเข้าใจวิธีการส่งต่อบางอย่างจาก PHP ไปยัง JS อย่างปลอดภัย! (ขออภัยที่เป็นความผิดพลาดเล็กน้อย: การส่ง PHP var ไปยัง JS ไม่ใช่ส่วนหนึ่งของคำถาม)
Tino

0

สำหรับวัตถุคุณอาจไม่สามารถใช้ตัวดำเนินการส่ง ฉันใช้json_encode()วิธีนี้แทน

ตัวอย่างเช่นสิ่งต่อไปนี้จะส่งออกเนื้อหาไปยังบันทึกข้อผิดพลาด:

error_log(json_encode($args));

0

ลองใช้วิธีการแปลก ๆ แต่ใช้งานได้เพื่อแปลงส่วนที่เป็นข้อความของ stdClass เป็นประเภทสตริง:

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.