.NET / Java'nın toString () PHP eşdeğeri


556

Bir PHP değişkeninin değerini dizeye nasıl dönüştürebilirim?

Boş bir dize ile birleştirmekten daha iyi bir şey arıyordum:

$myText = $myVar . '';

ToString()Java veya .NET'teki yöntem gibi .


6
Bu doğru cevap gibi görünüyor: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234

Kullanırdım json_encode($myText). Önerilen çözümlerin print_rve (string)varskaler değerler ve basit nesneler için iyi çalıştığını buldum . Kompleks değişkenler, sınıflar veya nesneler için bir tam __toString()tanımlanmamışsa yukarıda belirtilenleri tercih ederim json_encode.
Eric Kigathi

Yanıtlar:


791

Döküm operatörlerini kullanabilirsiniz :

$myText = (string)$myVar;

Dizeler bölümünde dizgi yayınlama ve dönüştürme ile ilgili daha fazla ayrıntı varPHP el kitabının booleans ve null'lar için özel işlem de dahil olmak üzere .


11
Object of class Foo could not be converted to string. Herhangi bir şeyi (diziler + nesneler + ne olursa olsun) bir dizeye dönüştürebilecek genel çözümler var mı?
ripper234


2
Not: Bu, dizilerde kullanıldığında bir PHP bildirimi verecektir.
dave1010

29
@MarkAmery Örtük olarak __toString()"Sihirli Yöntem" diye adlandırılan ama hiç bahsetmediği bir cevap verdi . Kullanıcı Java toString()yöntemi gibi bir cevap istedi ve PHP'de bu __toString()fonksiyon.
Supuhstar

2
@Supuhstar Ah, nihayet nereden geldiğini anlıyorum. Daha önce geniş çaplı olsaydım üzgünüm. Bunun ilgili bir ayrıntı olduğunu ve cevabı 'belki de İlkelleri Dönüştürme' ve 'Nesneleri Dönüştürme' bölümlerine başlıklarla ayırarak değerli olacağını kabul ediyorum.
Mark Amery

309

Bu daktilo ile yapılır:

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

Bir sınıfta, büyülü yöntemi kullanarak nelerin çıktı verileceğini tanımlayabilirsiniz __toString . Aşağıda bir örnek verilmiştir:

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"

Daha fazla tür döküm örneği:

$i = 1;

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

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

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

126

Print_r kullanın :

$myText = print_r($myVar,true);

Ayrıca şu şekilde kullanabilirsiniz:

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

Bu $myText, aşağıdaki gibi bir dizeye ayarlanır :

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

Biraz daha fazla bilgi almak için var_export komutunu kullanın (değişken türleriyle ...):

$myText = var_export($myVar,true);

1
"return parametresi TRUE olduğunda, [print_r] bir dize döndürür." Print_r, nesneleri, dizileri (ve ayrıca sayıları / dizeleri) yazdırmanın iyi bir yolu olduğundan, bir nesneyi okunabilir bir dizeye dönüştürmenin iyi bir yoludur.
Cedric

1
FYI yeni gelenler, önemli bir trueparçası! Ben de dahil olmak üzere dize dönüşüm çeşitli yöntemler denedim print_rve hepsini hayal kırıklığına uğradım, ve sonra trueparametre keşfetti (neden işe yaradığını için belgeleri okuyun).
ripper234

57

Typecasting'i kullanabilirsiniz:

$var = (string)$varname;

veya StringValue:

$var = strval($varname);

veya SetType:

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

Hepsi Tip-hokkabazlık açısından aynı şey için çalışırlar.


strval ($ varname) benim için hile yapar, özellikle de değer "varyant" olarak döndürüldüğünde ve dizeye veya int'e dönüştürülmesi gerektiğinde.
Milano

strval()onunla kullanmak istediğim için lookigng olduğum şeydi array_walk. Ör.$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus

33

Bir PHP değişkeninin değerini dizeye nasıl dönüştürebilirim?

Bir değer, (string) cast veya strval () işlevi kullanılarak bir dizeye dönüştürülebilir . (Düzenle: Thomas olarak da belirttiği gibi).

Bir dize olarak kullandığınızda da sizin için otomatik olarak dökülmelidir.


28

Strval arıyorsunuz :

string strval ( mixed $var )

Bir değişkenin dize değerini alın. Dizeye dönüştürme hakkında daha fazla bilgi için dize ile ilgili belgelere bakın.

Bu işlev döndürülen değerde biçimlendirme yapmaz. Sayısal bir değeri dize olarak biçimlendirmenin bir yolunu arıyorsanız, lütfen sprintf () veya number_format () işlevine bakın.


3
Özel bir geri arama kullanmadan tüm sayıları dizelere dönüştürmek istediğim için bu gerçekten çok yararlı. $strings = array_map('strval', $my_numbers);
peterchaula

array_mapGenel olarak callables ve string ile çalışan tek cevap budur .
Danon

18

İlkel için sadece (string)$var bu değişkeni veya yazdırın. PHP dinamik olarak yazılan bir dildir ve değişken anında dizgiye dökülür.

Nesneleri dizelere dönüştürmek istiyorsanız, __toString()dizeyi döndüren yöntemi tanımlamanız gerekir . Bu yöntemin istisnalar atması yasaktır.


15

Çift tırnak içine almak işe yarayacak:

$myText = "$myVar";

Bu işe yarıyor, ama PHP bunu yapmanın standart yolu olup olmadığını bilmiyorum.
Antoine Aubry


$ MyVar __toString veya skalar tipinde bir sınıf nesnesiyse bu yöntem çalışacaktır . Diğer durumlarda bir hata oluşturur.
zennin

11

Ben çıktı tamponlama kullanarak bir değişken herhangi bir çıktı (gibi print_r, var_dump) yakalamak bahsetmeye değer olduğunu düşünüyorum :

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

Teşekkürler: Bir dizeye var_dump sonucunu nasıl yakalayabilirim?


1
print_r ile buna ihtiyacınız olmadığını belirtmek gerekir . Bir dize olarak dönmek için geçersiz kılmayı kullanın.
ars265

1
Daha iyi bir yol $result = var_export($someVar, true)ob olmadan kullanmak olacaktır .
Danon

8

Başka bir seçenek de yerleşik settype işlevini kullanmaktır:

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

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

Bu aslında daktilodan farklı olarak değişken üzerinde bir dönüşüm gerçekleştirir ve birden çok türe dönüştürmenin genel bir yoluna sahip olmanızı sağlar.


8

Thomas G. Mayfield tarafından verilen cevaba ek olarak:

Dize döküm kılavuzunun bağlantısını takip ederseniz, anlaşılması oldukça önemli olan özel bir durum vardır:

(string) cast özellikle $ a değişkeniniz bir nesne ise tercih edilir , çünkü PHP __toString () sihirli yöntemini çağırarak (örneğin, $ a örneğinin oluşturulduğu sınıfta tanımlanmışsa ) döküm protokolünü nesne modeline göre izleyecektir . ).

PHP benzer bir şey yapar

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

(String) döküm işlemi PHP5 + kod daha Nesne Tabanlı yapma programlama için önerilen bir tekniktir. IMO, Java / C # / etc gibi diğer OOP dillerine, yani kendi özel PHP yoluna (iyi ya da değer için olduğunda) tasarım benzerliğinin (farkının) güzel bir örneğidir.


8

Diğerlerinin de belirttiği gibi, nesnelerin __toStringbir dizeye dökülmesi için bir yönteme ihtiyacı vardır . Bu yöntemi tanımlamayan bir nesne yine de spl_object_hash işlevini kullanarak bir dize temsili üretebilir .

Bu işlev, nesne için benzersiz bir tanımlayıcı döndürür. Bu kimlik, nesneleri yok etmek veya nesne yok edilmediği sürece bir nesneyi tanımlamak için bir karma anahtarı olarak kullanılabilir. Nesne yok edildiğinde, hash diğer nesneler için tekrar kullanılabilir.

Spl_object_hash çıktı nesneleri arasında çok benzer görünebilir, çünkü çıktı açıkça benzersiz yapmak için __toStringvarsayılan bir yöntem ile temel bir Object sınıfı var md5(spl_object_hash($this)).

Bu özellikle, bir değişkenin bir Nesne olarak başladığı ve daha sonra kodda farklı bir Nesne olarak değiştirildiğinden şüphelenildiği kod hata ayıklaması için yararlıdır. Değişkenlerin günlüğe yansıtılması, nesne karmasındaki (veya değil) değişikliği ortaya çıkarabilir.


6

Önceki yanıtlardaki yöntemlerin tümü olmasa da, amaçlanan dize değişkeninin önünde sıfır varsa , örneğin 077543 başarısız olur .

Böyle bir değişkeni dönüştürme denemesi, istenen dizeyi alamaz; çünkü değişken, taban 8'e (sekizli) dönüştürülür .

Bütün bunlar 32611$str değerine sahip olacak :

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

1
Burada PICNIC (bilgisayardaki değil sandalyedeki sorun) burada hiçbir şey başarısız değil ! print 077543;çıktıları 32611, yani bu doğru dize değeridir $no. Kimse (string)+1dizeyi döndürür +1(doğru döndürür 1) ya da $no = 1+1; print (string)$no;çıktı vermez 1+1. Notlar: (1) Hex ( $no=0xff;) için de aynıdır . (2) Sekizlik değeri geri alabilirsiniz '0'.decoct($no);(3) $no="077543";ile önde 0, "077543" + 1` 77544verirken 077543+1(doğru) verir 32612. (PS: Bu hata yaygın olduğu için indirilmedi)
Tino

4

Bu soru biraz yanıltıcı olduğunu düşünüyorum, çünkü Java toString () sadece bir String bir şey dökmek için bir yol değildir. (String) veya String.valueOf () üzerinden döküm budur ve PHP'de de çalışır.

// Java
String myText = (string) myVar;

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

Java türünün güvenli olması nedeniyle bunun sorunlu olabileceğini unutmayın ( daha fazla ayrıntı için buraya bakın ).

Ama dediğim gibi, bu döküm ve bu nedenle Java'nın toString () eşdeğeri değil.

Java'da toString yalnızca bir nesneyi bir String'e dökmekle kalmaz. Bunun yerine Dize temsilini verecektir . Ve PHP'de __toString () bunu yapar.

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

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

Ve diğer taraftan:

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

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

"Dize temsili vererek" ne demek? Milyonlarca kitabı olan bir kütüphane için bir sınıf düşünün.

  • Bu sınıfı bir String'e atamak (varsayılan olarak) verileri, burada tüm kitapları bir string'e dönüştürür, böylece String çok uzun olur ve çoğu zaman da çok yararlı olmaz.
  • Bunun yerine Dize size Dize temsilini, yani yalnızca kitaplığın adını verecektir. Bu daha kısadır ve bu nedenle size daha az ama daha önemli bilgiler verir.

Her ikisi de geçerli yaklaşımlardır, ancak çok farklı hedeflerle, her durum için mükemmel bir çözüm değildir ve ihtiyaçlarınız için daha uygun olanı akıllıca seçmelisiniz.

Elbette, daha da fazla seçenek var:

$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

Bu yöntemlerin tümü bir dize döndürür, bazıları dahili olarak __toString kullanır ve bazıları Nesnelerde başarısız olur. Bir göz atın PHP belgelerine fazla ayrıntı için.


3

Belgeler şunları da yapabileceğinizi söylüyor:

$str = "$foo";

Oyuncularla aynı, ama bence daha güzel görünüyor.

Kaynak:


1

Çift tırnak işaretleri de çalışmalıdır ... bir dize oluşturmalı, daha sonra 2 boş dizge arasında $ myVar'ın döküm STRING değerini EKLEMELİ / EKLEMELİDİR.


1

Her zaman döndüren .ToString ($ in) adında bir yöntem oluşturabilirsiniz

$in . '';  

1

Tamsayılar veya booleans gibi basit türler dışında bir şey dönüştürüyorsanız, dönüştürmeye çalıştığınız tür için kendi işlevinizi / yönteminizi yazmanız gerekir, aksi takdirde PHP yalnızca türü yazdırır (dizi, GoogleSniffer gibi) veya Bide).


1

PHP dinamik olarak yazılmıştır, bu yüzden Chris Fournier'in dize gibi kullanması bir dize haline gelir. Dizenin biçimi üzerinde daha fazla kontrol arıyorsanız printf sizin cevabınızdır.



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

Bize ne söylemek istediğine dair hiçbir fikrim olmadığı için indirildi. strval()Tellerde kullanmak sadece tam bir zaman kaybıdır.
Tino

ahbap şey bir dize değeri = varsayalım onun "dize" olacak. Ancak, javascript'te görüntülemek istediğinizde, onu 'stringx' yapmanız gerekir
Daniel Adenew

Bu son derece tehlikelidir (söylememek: düz yanlış). Lütfen stackoverflow.com/q/168214 veya stackoverflow.com/q/23740548 adresine bakın.PHP'den JS'ye bir şeyi nasıl güvenli bir şekilde geçireceğinizi anlamak için adresine ! (Biraz offtopik olduğum için üzgünüm: JS'ye bir PHP değişkeni geçmek sorunun bir parçası değildi.)
Tino

0

Nesneler için, döküm operatörünü kullanamayabilirsiniz. Bunun yerine json_encode()yöntemi kullanıyorum.

Örneğin, aşağıdakiler hata günlüğüne içerik gönderir:

error_log(json_encode($args));

0

StdClass'ın metinsel kısmını dize türüne dönüştürmek için bu biraz garip ama çalışan yaklaşımı deneyin:

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.