Setara dengan PHP .NET / Java's toString ()


556

Bagaimana cara mengubah nilai variabel PHP ke string?

Saya mencari sesuatu yang lebih baik daripada menggabungkan dengan string kosong:

$myText = $myVar . '';

Seperti ToString()metode di Java atau .NET.


6
Ini sepertinya jawaban yang benar: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234

Saya akan menggunakan json_encode($myText). Saya telah menemukan bahwa solusi yang disarankan print_rdan (string)varbekerja dengan baik untuk nilai skalar dan objek sederhana. Untuk variabel kompleks, kelas atau objek jika lengkap __toString()tidak didefinisikan, saya lebih suka yang tersebut di atas json_encode.
Eric Kigathi

Jawaban:


791

Anda dapat menggunakan operator casting :

$myText = (string)$myVar;

Ada lebih banyak detail untuk casting string dan konversi di bagian Strings manual PHP, termasuk penanganan khusus untuk boolean dan null.


11
Object of class Foo could not be converted to string. Apakah ada solusi umum yang dapat mengubah apa pun (array + objek + apa pun) menjadi string?
ripper234


2
Catatan: ini akan memberikan pemberitahuan PHP saat digunakan pada array.
dave1010

29
@MarkAmery Dia memberikan jawaban yang secara implisit menyebut __toString()"Metode Sihir", tetapi tidak menyebutkannya sama sekali. Pengguna meminta jawaban yang seperti toString()metode Java , dan dalam PHP, itulah __toString()fungsinya.
Supuhstar

2
@Supuhstar Ah benar, saya akhirnya mengerti dari mana Anda berasal. Maaf jika saya tumpul sebelumnya. Saya setuju bahwa ini adalah detail yang relevan dan akan sangat berharga untuk menambahkannya, mungkin memisahkan jawaban menjadi bagian 'Konversi Primitif' dan 'Konversi Objek' dengan header.
Mark Amery

309

Ini dilakukan dengan 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

Di kelas Anda dapat menentukan apa yang dihasilkan dengan menggunakan metode magis __toString. Contohnya di bawah ini:

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"

Beberapa contoh lain jenis casting:

$i = 1;

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

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

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

126

Gunakan print_r :

$myText = print_r($myVar,true);

Anda juga dapat menggunakannya seperti:

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

Ini akan diatur $myTextke string, seperti:

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

Gunakan var_export untuk mendapatkan sedikit lebih banyak info (dengan jenis variabel, ...):

$myText = var_export($myVar,true);

1
"ketika parameter kembali BENAR, [print_r] akan mengembalikan sebuah string." Karena print_r adalah cara yang bagus untuk mencetak objek, array (dan juga angka / string), ini adalah cara yang baik untuk mengubah objek menjadi string yang dapat dibaca manusia.
Cedric

1
Pendatang baru FYI, truebagian itu penting! Saya mencoba beberapa metode konversi string termasuk print_rdan kecewa dari semuanya, dan kemudian saya menemukan trueparameter (baca dokumentasi mengapa itu bekerja).
ripper234

57

Anda bisa menggunakan typecasting:

$var = (string)$varname;

atau StringValue:

$var = strval($varname);

atau SetType:

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

Mereka semua bekerja untuk hal yang sama dalam hal Jenis-Juggling.


strval ($ varname) melakukan trik untuk saya, terutama ketika nilai dikembalikan sebagai tipe "varian" dan perlu dikonversi menjadi string atau int.
Milan

strval()adalah apa yang saya cari karena saya ingin menggunakannya dengan array_walk. Misalnya$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus

33

Bagaimana cara mengubah nilai variabel PHP ke string?

Nilai dapat dikonversi ke string menggunakan fungsi (string) atau fungsi strval () . (Sunting: Seperti Thomas juga nyatakan).

Itu juga harus secara otomatis dicor untuk Anda ketika Anda menggunakannya sebagai string.


28

Anda mencari strval :

string strval ( mixed $var )

Dapatkan nilai string suatu variabel. Lihat dokumentasi pada string untuk informasi lebih lanjut tentang konversi ke string.

Fungsi ini tidak melakukan pemformatan pada nilai yang dikembalikan. Jika Anda mencari cara untuk memformat nilai numerik sebagai string, silakan lihat sprintf () atau number_format ().


3
Ini sebenarnya sangat membantu karena saya ingin mengubah semua angka menjadi string tanpa menggunakan panggilan balik khusus. $strings = array_map('strval', $my_numbers);
peterchaula

Ini adalah satu-satunya jawaban yang bekerja dengan array_mapdan string callable pada umumnya.
Danon

18

Untuk primitif cukup gunakan (string)$varatau cetak variabel ini segera. PHP adalah bahasa yang diketik secara dinamis dan variabel akan dimasukkan ke string dengan cepat.

Jika Anda ingin mengonversi objek menjadi string, Anda harus menentukan __toString()metode yang mengembalikan string. Metode ini dilarang untuk melempar pengecualian.


15

Menempatkannya dalam tanda kutip ganda harus bekerja:

$myText = "$myVar";

Itu bekerja, tapi saya tidak tahu apakah itu cara standar melakukannya dalam PHP.
Antoine Aubry

Ini adalah cara yang sangat standar untuk melakukannya di bash
Yauhen Yakimovich

Metode ini akan berfungsi jika $ myVar adalah objek kelas dengan tipe __toString atau skalar. Dalam kasus lain, menghasilkan kesalahan.
zennin

11

Saya pikir perlu disebutkan bahwa Anda dapat menangkap output (seperti print_r, var_dump) dalam variabel dengan menggunakan buffering output:

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

Terima kasih kepada: Bagaimana saya bisa menangkap hasil var_dump ke sebuah string?


1
perlu disebutkan bahwa Anda tidak memerlukannya dengan print_r . Cukup gunakan override untuk kembali sebagai string.
ars265

1
Cara yang lebih baik adalah menggunakan $result = var_export($someVar, true)tanpa ob.
Danon

8

Opsi lain adalah menggunakan bawaan fungsi settype bawaan :

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

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

Ini sebenarnya melakukan konversi pada variabel tidak seperti typecasting dan memungkinkan Anda memiliki cara umum untuk mengkonversi ke beberapa jenis.


8

Selain jawaban yang diberikan oleh Thomas G. Mayfield:

Jika Anda mengikuti tautan ke manual casting string, ada kasus khusus yang cukup penting untuk dipahami:

(string) cast lebih disukai terutama jika variabel Anda $ a adalah objek, karena PHP akan mengikuti protokol casting sesuai dengan model objeknya dengan memanggil __toString () metode ajaib (jika seperti itu didefinisikan dalam kelas di mana $ a dipakai dari ).

PHP melakukan sesuatu yang mirip

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

Operasi (string) casting adalah teknik yang direkomendasikan untuk pemrograman PHP5 + membuat kode lebih Berorientasi Objek. IMO ini adalah contoh bagus dari kesamaan desain (perbedaan) dengan bahasa OOP lainnya seperti Java / C # / etc., Yaitu dengan cara PHP khusus (kapan saja untuk kebaikan atau untuk nilai).


8

Seperti yang telah disebutkan orang lain, objek membutuhkan __toStringmetode untuk dilemparkan ke string. Objek yang tidak mendefinisikan metode itu masih dapat menghasilkan representasi string menggunakan fungsi spl_object_hash .

Fungsi ini mengembalikan pengidentifikasi unik untuk objek. Id ini dapat digunakan sebagai kunci hash untuk menyimpan objek, atau untuk mengidentifikasi objek, selama objek tidak dihancurkan. Setelah objek dihancurkan, hashnya dapat digunakan kembali untuk objek lain.

Saya memiliki kelas Object dasar dengan __toStringmetode yang secara default memanggil md5(spl_object_hash($this))untuk membuat output jelas unik, karena output dari spl_object_hash dapat terlihat sangat mirip antara objek.

Ini sangat membantu untuk kode debugging di mana variabel menginisialisasi sebagai Objek dan kemudian dalam kode itu diduga telah berubah menjadi Obyek yang berbeda. Cukup dengan menggemakan variabel ke log dapat mengungkapkan perubahan dari hash objek (atau tidak).


6

Beberapa, jika tidak semua, metode dalam jawaban sebelumnya gagal ketika variabel string yang dimaksud memiliki nol di depan , misalnya, 077543 .

Upaya untuk mengkonversi variabel seperti itu gagal mendapatkan string yang dimaksudkan, karena variabel tersebut dikonversi ke basis 8 (oktal) .

Semua ini akan $strmemiliki nilai 32611 :

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

1
Ini PICNIC (masalah di kursi, bukan di komputer) karena tidak ada yang gagal di sini ! print 077543;output 32611, jadi ini adalah nilai string yang benar dari $no. Tidak ada yang mengharapkan yang (string)+1mengembalikan string +1(itu kembali dengan benar 1) atau yang $no = 1+1; print (string)$no;keluar 1+1. Catatan: (1) Sama untuk hex ( $no=0xff;) juga. (2) Anda bisa mendapatkan kembali nilai oktal dengan '0'.decoct($no);(3) $no="077543";tetap memimpin 0, "077543" memberi +1 77544sementara 077543+1(benar) memberi 32612. (PS: tidak diturunkan, karena kesalahan ini biasa terjadi)
Tino

4

Saya pikir pertanyaan ini agak menyesatkan karena, toString () di Jawa bukan hanya cara untuk melemparkan sesuatu ke String. Itulah yang melakukan casting via (string) atau String.valueOf (), dan berfungsi juga di PHP.

// Java
String myText = (string) myVar;

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

Perhatikan bahwa ini bisa bermasalah karena Java adalah tipe-aman ( lihat di sini untuk detail lebih lanjut ).

Tapi seperti yang saya katakan, ini casting dan karena itu tidak setara dengan toString Java ().

toString di Jawa tidak hanya melemparkan objek ke sebuah String. Ini justru akan memberi Anda representasi String . Dan itulah yang dilakukan __toString () di PHP.

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

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

Dan dari sisi lain:

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

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

Apa yang saya maksud dengan "memberikan representasi String"? Bayangkan kelas untuk perpustakaan dengan jutaan buku.

  • Membuat kelas itu menjadi String akan (secara default) mengubah data, di sini semua buku, menjadi string sehingga String akan sangat panjang dan sebagian besar waktu juga tidak terlalu berguna.
  • To String sebagai gantinya akan memberi Anda representasi String, yaitu, hanya nama perpustakaan. Ini lebih pendek dan karena itu memberi Anda lebih sedikit, tetapi informasi yang lebih penting.

Keduanya merupakan pendekatan yang valid tetapi dengan tujuan yang sangat berbeda, tidak ada solusi yang sempurna untuk setiap kasus dan Anda harus memilih dengan bijak yang cocok dengan kebutuhan Anda.

Tentu, ada lebih banyak opsi:

$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

Semua metode ini akan mengembalikan sebuah String, beberapa dari mereka menggunakan __toString secara internal dan beberapa yang lain akan gagal pada Objects. Lihatlah dokumentasi PHP untuk lebih jelasnya.


3

Dokumentasi mengatakan bahwa Anda juga dapat melakukan:

$str = "$foo";

Itu sama dengan pemain, tapi saya pikir itu terlihat lebih cantik.

Sumber:


1

Kutipan ganda juga bisa digunakan ... ia harus membuat string, lalu harus LAMPIRAN / Sisipkan nilai STRING yang dicor $ myVar di antara 2 string kosong.


1

Anda selalu dapat membuat metode bernama .ToString ($ in) yang mengembalikan

$in . '';  

1

Jika Anda mengonversi apa pun selain jenis sederhana seperti bilangan bulat atau boolean, Anda harus menulis fungsi / metode Anda sendiri untuk jenis yang Anda coba konversi, jika tidak, PHP hanya akan mencetak jenisnya (seperti array, GoogleSniffer , atau Bidet).


1

PHP diketik secara dinamis, jadi seperti kata Chris Fournier, "Jika Anda menggunakannya seperti string, ia menjadi string". Jika Anda mencari kontrol lebih besar atas format string maka printf adalah jawaban Anda.



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

Tunduk, karena saya benar-benar tidak tahu apa yang ingin Anda sampaikan kepada kami. Menggunakan strval()string hanya membuang-buang waktu saja.
Tino

dude masalahnya adalah anggap Anda menerima nilai string = ketika itu bertolak itu akan menjadi "string". Tetapi, ketika Anda ingin menampilkannya dalam javascript, Anda harus membuatnya 'stringx' '
Daniel Adenew

Ini sangat berbahaya (tidak untuk mengatakan: salah jelas). Silakan lihat stackoverflow.com/q/168214 atau stackoverflow.com/q/23740548 untuk memahami cara meneruskan sesuatu dengan aman dari PHP ke JS! (Maaf karena sedikit offtopic: Melewati var PHP ke JS bukan bagian dari pertanyaan.)
Tino

0

Untuk objek, Anda mungkin tidak dapat menggunakan operator transmisi. Sebaliknya, saya menggunakan json_encode()metode ini.

Misalnya, berikut ini akan menampilkan konten ke log kesalahan:

error_log(json_encode($args));

0

Coba ini sedikit aneh, tetapi bekerja, pendekatan untuk mengubah bagian tekstual stdClass ke tipe string:

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

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

-1

Saya menggunakan variableToString . Ini menangani setiap jenis PHP dan fleksibel (Anda dapat memperluasnya jika Anda mau).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.