.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.