.NET / Java의 toString ()에 해당하는 PHP


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"라고 하는 대답을 했지만 전혀 언급하지 않았습니다. 사용자는 Java toString()메소드 와 같은 답변을 요청 했으며 PHP에서는 그 __toString()기능입니다.
Supuhstar

2
@Supuhstar 아 맞아, 나는 당신이 어디에서 왔는지 마침내 이해합니다. 내가 전에 둔해했다면 죄송합니다. 나는 이것이 관련 세부 사항이며 동의를 'Converting Primitives'및 'Converting Objects'섹션으로 헤더를 구분하여 추가하는 것이 가치가 있음에 동의합니다.
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

클래스에서는 magical 메소드를 사용하여 출력되는 것을 정의 할 수 있습니다 __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은 객체, 배열 (및 숫자 / 문자열)을 인쇄하는 좋은 방법이므로 객체를 사람이 읽을 수있는 문자열로 변환하는 좋은 방법입니다.
Cedric

1
참고로 이민자, 그 true부분은 필수적입니다! 나는 여러 가지 문자열 변환 방법을 시도했지만 print_r모두 실망했으며 true매개 변수를 발견 했습니다 (작동 이유에 대한 설명서를 읽으십시오).
ripper234

57

타입 캐스팅을 사용할 수 있습니다 :

$var = (string)$varname;

또는 StringValue :

$var = strval($varname);

또는 SetType :

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

그들은 모두 Type-Juggling과 관련하여 동일한 작업을 수행합니다.


strval ($ varname)은 특히 값이 "variant"유형으로 반환되고 string 또는 int로 변환해야 할 때 나를 위해 트릭을 수행합니다.
밀라노

strval()와 함께 사용하고 싶었 기 때문에 내가 찾고 있던 것입니다 array_walk. 예$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
버틀 Butkus

33

PHP 변수의 값을 문자열로 어떻게 변환합니까?

(문자열) 캐스트 또는 strval () 함수를 사용하여 값을 문자열로 변환 할 수 있습니다 . (편집 : 토마스 도 언급했듯이).

또한 문자열로 사용할 때 자동으로 전송됩니다.


28

당신은 strval을 찾고 있습니다 :

string strval ( mixed $var )

변수의 문자열 값을 가져옵니다. 문자열로 변환하는 방법에 대한 자세한 내용은 문자열 설명서를 참조하십시오.

이 함수는 반환 된 값에 대해 서식을 지정하지 않습니다. 숫자 값을 문자열로 포맷하는 방법을 찾고 있다면 sprintf () 또는 number_format ()을 참조하십시오.


3
이것은 사용자 정의 콜백을 사용하지 않고 모든 숫자를 문자열로 변환하려고했기 때문에 실제로 매우 유용합니다. $strings = array_map('strval', $my_numbers);
peterchaula

이것은 array_map일반적으로 문자열 콜 러블과 작동하는 유일한 대답입니다 .
Danon

18

프리미티브의 (string)$var경우이 변수를 바로 사용 하거나 인쇄하십시오. PHP는 동적으로 입력되는 언어이며 변수는 즉시 문자열로 변환됩니다.

객체를 문자열로 변환하려면 문자열 __toString()을 반환 하는 메서드 를 정의해야 합니다. 이 방법은 예외를 던지는 것이 금지되어 있습니다.


15

큰 따옴표로 묶으면 작동합니다.

$myText = "$myVar";

그것은 효과가 있지만 PHP에서 표준 방법인지 모르겠습니다.
Antoine Aubry

그것은 bash
Yauhen Yakimovich

이 메소드는 $ myVar 가 __toString 또는 스칼라 유형의 클래스 오브젝트 인 경우 작동합니다 . 다른 경우에는 오류가 발생합니다.
젠닌

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)ob없이 사용하는 것 입니다.
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)
?>

이것은 실제로 유형 변환과 달리 변수에 대한 변환을 수행하며 여러 유형으로 변환하는 일반적인 방법을 가질 수 있습니다.


8

Thomas G. Mayfield의 답변 외에도 :

스트링 캐스팅 매뉴얼에 대한 링크를 따르면 특별한 경우가 있습니다.

(문자열) 캐스트는 변수 $ a 가 객체 인 경우 특히 바람직 합니다. PHP는 __toString () magic 메소드 를 호출하여 객체 모델에 따라 캐스팅 프로토콜 을 따르기 때문에 ($ a가 인스턴스화되는 클래스에 정의 된 경우 ) ).

PHP는

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

(문자열) 주조 작업은 PHP5 + 코드의 더 많은 객체 지향 제작 프로그램에 대한 권장되는 기술이다. IMO 이것은 Java / C # / etc와 같은 다른 OOP 언어와의 디자인 유사성 (차이)의 좋은 예입니다.


8

다른 사람들이 언급했듯이 객체 __toString에는 문자열로 캐스팅 하는 메소드가 필요 합니다. 해당 메소드를 정의하지 않은 객체는 spl_object_hash 함수를 사용하여 문자열 표현을 생성 할 수 있습니다 .

이 함수는 객체의 고유 식별자를 반환합니다. 이 ID는 객체가 파괴되지 않는 한 객체를 저장하거나 객체를 식별하기위한 해시 키로 사용될 수 있습니다. 객체가 파괴되면 해시가 다른 객체에 재사용 될 수 있습니다.

spl_object_hash의 출력이 객체간에 매우 유사하게 보일 수 있기 때문에 출력을 명확하게 독특하게 만들기 __toString위해 호출하는 기본 메소드 가있는 기본 Object 클래스가 md5(spl_object_hash($this))있습니다.

변수가 객체로 초기화되고 나중에 코드에서 다른 객체로 변경된 것으로 의심되는 코드를 디버깅하는 데 특히 유용합니다. 변수를 로그에 에코하는 것만으로 객체 해시의 변화를 알 수 있습니다.


6

의도 한 문자열 변수에 선행 0이 있으면 ( 예 : 077543) 이전 답변의 일부 메소드가 실패하는 경우가 있습니다.

변수가 기수 8 (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) 16 진 ( $no=0xff;)도 동일 합니다. (2) 당신은 '0'.decoct($no);(3) $no="077543";선행 0을 "077543"+ 1`가주는 77544동안 077543+1(정확하게)주는 8 진 값을 되 찾을 수 있습니다 32612. (PS :이 오류는 일반적인 것으로 다운 다운되지 않음)
Tino

4

Java의 toString ()이 문자열로 무언가를 캐스팅하는 방법이 아니기 때문에이 질문은 약간 오해의 소지가 있다고 생각합니다. 이것이 (string) 또는 String.valueOf ()를 통한 캐스팅 이며 PHP에서도 잘 작동합니다.

// Java
String myText = (string) myVar;

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

Java는 형식이 안전하므로 문제가 될 수 있습니다 ( 자세한 내용은 여기 참조 ).

그러나 내가 말했듯이, 이것은 캐스팅이므로 Java의 toString ()과 동일하지 않습니다.

Java의 toString 은 객체를 String으로 캐스팅하지 않습니다. 대신 String 표현을 제공합니다 . 그리고 이것이 PHP의 __toString ()이하 는 일입니다.

// 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"

"문자열 표현 제공"은 무엇을 의미합니까? 수백만 권의 책이있는 도서관의 수업을 상상해보십시오.

  • 해당 클래스를 문자열로 캐스트하면 기본적으로 모든 책의 데이터가 문자열로 변환되므로 문자열이 매우 길고 대부분 유용하지 않습니다.
  • 대신 문자열을 사용하면 문자열 표현, 즉 라이브러리 이름 만 제공됩니다. 이 정보는 더 짧아서 덜 중요한 정보를 제공합니다.

이것들은 모두 유효한 접근법이지만 매우 다른 목표를 가지고 있으며, 모든 경우에 완벽한 솔루션이 아니며 귀하의 요구에 더 잘 맞는 현명한 선택을해야합니다.

물론 더 많은 옵션이 있습니다.

$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 설명서 를 참조하십시오.


3

설명서에는 다음 작업도 할 수 있다고 나와 있습니다.

$str = "$foo";

캐스트와 동일하지만 더 예쁘다고 생각합니다.

출처:


1

큰 따옴표도 작동해야합니다 ... 문자열을 만든 다음 두 개의 빈 문자열 사이에 $ myVar의 캐스트 된 STRING 값을 APPEND / INSERT해야합니다.



1

정수 또는 부울과 같은 단순한 유형 이외의 다른 것을 변환하는 경우 변환하려는 유형에 대해 고유 한 함수 / 메소드를 작성해야합니다. 그렇지 않으면 PHP는 유형 (예 : 배열, GoogleSniffer)을 인쇄합니다 또는 비데).


1

Chris Fournier가 말한 것처럼 PHP는 동적으로 입력됩니다. "문자열처럼 사용하면 문자열이됩니다." 문자열 형식을 더 세밀하게 제어하려면 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()문자열을하는 것은 단지 시간 낭비입니다.
티노

친구는 당신이 문자열 값을 받았다고 가정합니다. 당신이 자바 스크립트에 그것을 표시하고 싶어 할 때, 당신은 할 필요가 그것 stringx ''
다니엘 Adenew

이것은 매우 위험합니다 (말하지 않는 것 : 명백한 잘못). 한 번 봐 제발 stackoverflow.com/q/168214 또는 stackoverflow.com/q/23740548 안전하게 JS에 PHP에서 뭔가를 전달하는 방법을 이해하기를! (조금 비논리적 인 것에 대해 죄송합니다 : 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.