PHP에서 문자열의 중괄호


답변:


281

이것은 문자열 보간을위한 복잡한 (곱슬 한) 구문 입니다. 매뉴얼에서 :

복잡한 (곱슬 한) 구문

구문이 복잡하기 때문에 복잡한 식을 사용할 수 없기 때문에 복잡하지 않습니다.

문자열 표현이있는 스칼라 변수, 배열 요소 또는 객체 속성은이 구문을 통해 포함될 수 있습니다. 이 문자열 바깥에 표시하는 것처럼 간단하게 표현 같은 방법을 쓰고, 그 다음에 그것을 포장 {하고 }. 이후 {때 탈출 할 수없는,이 구문 만 인식됩니다 $즉시이 다음 {. {\$리터럴을 얻는 데 사용 합니다 {$. 명확하게하는 몇 가지 예 :

<?php
// Show all errors
error_reporting(E_ALL);

$great = 'fantastic';

// Won't work, outputs: This is { fantastic}
echo "This is { $great}";

// Works, outputs: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// Works
echo "This square is {$square->width}00 centimeters broad."; 


// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";


// Works
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong  outside a string.
// In other words, it will still work, but only because PHP first looks for a
// constant named foo; an error of level E_NOTICE (undefined constant) will be
// thrown.
echo "This is wrong: {$arr[foo][3]}"; 

// Works. When using multi-dimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][3]}";

// Works.
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName(): {${getName()}}";

echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";

// Won't work, outputs: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

종종이 구문은 불필요합니다. 예를 들면 다음과 같습니다.

$a = 'abcd';
$out = "$a $a"; // "abcd abcd";

다음과 정확히 동일하게 작동합니다.

$out = "{$a} {$a}"; // same

따라서 중괄호는 필요하지 않습니다. 그러나 이것은 :

$out = "$aefgh";

이름 $aefgh에 변수가 없으므로 오류 수준에 따라 작동하지 않거나 오류가 발생하므로 다음 을 수행해야합니다.

$out = "${a}efgh"; // or
$out = "{$a}efgh";

40
복사 / 붙여 넣기에 대한 너무 많은 항문 nitpicking. 이해하기 쉽고 찾기 좋으면 좋은 결정이었습니다. 나에게서 +1, 그것은 내가 찾던 것이었고, PHP 매뉴얼에서 그것을 찾지 못했습니다. 아마도 적절한 이름으로 호출하기 때문입니다. 그러나 나는 그것을 여기에서 찾았다.
Gabriel Magana 2019

9
리터럴 컬리의 경우 두 배로 늘립니다 (예 :) $vars='x:3,y:9'; $json="{{$vars}}";. QiGuang의 기사 덕분에 .
Bob Stein

... 또는 $out = '$aefgh'; (말 그대로 $ aefgh가 필요한 경우)
Roko C. Buljan

흥미로운 유스 케이스 예제는 SimpleXMLElement다음과 같습니다 . {}노드 자체에 액세스하는 데 사용됩니다 (예 :) $element[0]->{0}. "0"속성이 존재하지 않기 때문에 __get/ __set메소드 가 트리거됩니다 . 본질적으로이를 통해 ArrayAccess인덱스 액세스를 대체 할 수 있습니다 ( 예 : 3v4l.org/1F254) .
Gajus

2
리터럴 중괄호 안의 내용에도 변수가 들어 있으면 모든 변수에 중괄호를 추가 하십시오 : $min=1;$max=5; echo ".{{$min},{$max}}"yields .{1,5}(@BobStein의 의견에서 언급 한 "중괄호]를 두 배로 늘릴 수있는 방법을 알지 못했습니다"
Xenos

47

저에게 중괄호는 연결을 대체하는 역할을하며 입력하기 가 더 빠르며 코드가 더 깨끗해 보입니다. 작은 따옴표 ( '') 로 변수 의 리터럴 이름 을 얻을 수 있으므로 PHP에서 내용을 구문 분석 할 때 큰 따옴표 ( "")를 사용해야합니다 .

<?php

 $a = '12345';

// This works:
 echo "qwe{$a}rty"; // qwe12345rty, using braces
 echo "qwe" . $a . "rty"; // qwe12345rty, concatenation used

// Does not work:
 echo 'qwe{$a}rty'; // qwe{$a}rty, single quotes are not parsed
 echo "qwe$arty"; // qwe, because $a became $arty, which is undefined

?>

1
"그들의 내용은 PHP에 의해 분석된다" -이것은 오해의 소지가있다. 중괄호 구문 안에 임의의 PHP 표현식을 넣을 수 는 없습니다 .
Mark Amery

1
전반적으로 IMO는 대괄호로 입력하는 것이 더 빠르지 않습니다. 당신은에있는 SHIFT따옴표에 대한 키를 눌러 및 중괄호에 대한. 큰 따옴표를 엄격하게 사용하면 더 빠릅니다.
deflime

2
큰 따옴표 v 작은 따옴표, +1을 강조해 주셔서 감사합니다
cameronjonesweb

evaluate대신 사용 합니다parse
Cholthi Paul Ttiopic

17

예:

$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";

중괄호가 없으면 PHP는 $numberth존재하지 않는 변수를 찾으려고 시도 합니다!


3

또한 속성 이름이 일부 반복자에 따라 다른 객체 속성에 액세스하는 것이 유용하다는 것을 알았습니다. 예를 들어, 시간, 일, 월의 기간에 대해 아래 패턴을 사용했습니다.

$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
    $this->{'value_'.$period}=1;
}

이 동일한 패턴을 사용하여 클래스 메소드에 액세스 할 수도 있습니다. 문자열과 문자열 변수를 사용하여 동일한 방식으로 메소드 이름을 빌드하십시오.

기간별로 가치 저장을 위해 배열을 사용한다고 쉽게 주장 할 수 있습니다. 이 응용 프로그램이 PHP 전용이라면 동의합니다. 클래스 속성이 데이터베이스 테이블의 필드에 매핑 될 때이 패턴을 사용합니다. 직렬화를 사용하여 데이터베이스에 배열을 저장할 수는 있지만 개별 필드를 색인화해야하는 경우 비효율적이며 의미가 없습니다. 필자는 종종 반복자에 의해 키가 지정된 필드 이름 배열을 두 세계 모두를 위해 추가합니다.

class timevalues
{
                             // Database table values:
    public $value_hour;      // maps to values.value_hour
    public $value_day;       // maps to values.value_day
    public $value_month;     // maps to values.value_month
    public $values=array();

    public function __construct()
    {
        $this->value_hour=0;
        $this->value_day=0;
        $this->value_month=0;
        $this->values=array(
            'hour'=>$this->value_hour,
            'day'=>$this->value_day,
            'month'=>$this->value_month,
        );
    }
}

-5

여기 하나의 워드 프레스 플러그인에서 얻은 코드가 있습니다.

$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");

이것은 복잡한 문자열을 형식화하는 데 정말 편리한 기술입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.