[php] 연결하지 않고 문자열에 상수 포함

PHP에서 연결하지 않고 문자열에 상수를 포함시키는 방법이 있습니까?

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";



답변

아니.

Strings를 사용하면 PHP가 상수 식별자와 별도로 문자열 데이터를 말할 수있는 방법이 없습니다. 이것은 heredoc을 포함하여 PHP의 모든 문자열 형식에 적용됩니다.

constant() 상수를 얻는 또 다른 방법이지만, 함수 호출은 연결없이 문자열에 넣을 수 없습니다.

PHP 상수에 대한 매뉴얼


답변

예, (어떻게 든;)입니다.

define('FOO', 'bar');

$test_string = sprintf('This is a %s test string', FOO);

이것은 아마도 당신이 목표로하는 것이 아니지만 기술적으로 이것은 연결이 아니라 대체이며,이 가정에서 연결하지 않고 문자열의 상수를 포함 한다고 생각 합니다.


답변

문자열 내에서 상수를 사용하려면 다음 방법을 사용할 수 있습니다.

define( 'ANIMAL', 'turtles' );
$constant = 'constant';

echo "I like {$constant('ANIMAL')}";


어떻게 작동합니까?

모든 문자열 함수 이름과 임의의 매개 변수를 사용할 수 있습니다

함수 이름을 변수에 넣고 큰 따옴표로 묶은 문자열 안에 매개 변수를 사용하여 호출 할 수 있습니다. 여러 매개 변수와 함께 작동합니다.

$fn = 'substr';

echo "I like {$fn('turtles!', 0, -1)}";

생산

나는 거북이를 좋아한다

익명의 기능들

PHP 5.3 이상을 실행중인 경우 익명 함수를 사용할 수도 있습니다.

$escape   = function ( $string ) {
    return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );

예상대로 올바르게 이스케이프 된 HTML을 생성합니다.

콜백 배열은 허용되지 않습니다!

지금까지 함수 이름이 호출 가능할 수 있다는 인상을 받고 있다면 is_callable문자열 내부에서 사용될 때 치명적인 오류가 발생할 때 true를 반환하는 배열은 아닙니다 .

class Arr
{

    public static function get( $array, $key, $default = null )
    {
        return is_array( $array ) && array_key_exists( $key, $array )
            ? $array[$key]
            : $default;
    }
}

$fn = array( 'Arr', 'get' );
var_dump( is_callable( $fn ) ); // outputs TRUE

// following line throws Fatal error "Function name must be a string"
echo( "asd {$fn( array( 1 ), 0 )}" ); 

명심하십시오

이 방법은 잘못 권장되지만 때로는 훨씬 더 읽기 쉬운 코드가 생성되므로 사용자에게 달려 있습니다. 가능성이 있습니다.


답변

define( 'FOO', 'bar');
$FOO = FOO;
$string = "I am too lazy to concatenate $FOO in my string";


답변

define('FOO', 'bar');
$constants = create_function('$a', 'return $a;');
echo "Hello, my name is {$constants(FOO)}";


답변

당신이 정말로 경우 연결없이 에코 일정에 원하는 여기에 솔루션입니다 :

define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';

참고 :이 예제에서 echo는 많은 매개 변수를 사용합니다 ( 쉼표를보십시오) ) 실제로 연결되지 않습니다

Echo는 함수로 작동하고 더 많은 매개 변수를 사용하며 연결보다 더 효율적입니다. 연결하고 에코 할 필요가 없기 때문에 새로운 String 연결 객체를 만들 필요없이 모든 것을 에코합니다. :))

편집하다

당신이 고려하는 경우도 합치 같은 문자열 지내는 문자열 매개 변수를 나 쓰기 와 전체 문자열을 “, (쉼표 버전)는 항상 가장 빠른, 다음에 간다 . (와 연결 작은 따옴표) 및 방법을 구축하는 가장 느린 문자열은 큰 따옴표를 사용하고 있습니다 , 이런 식으로 작성된 표현식은 선언 된 변수 및 함수에 대해 평가되어야하기 때문에 ..


답변

당신은 할 수 있습니다 :

define( 'FOO', 'bar' );

$constants = get_defined_constants(true); // the true argument categorizes the constants
$constants = $constants[ 'user' ]; // this gets only user-defined constants

echo "Hello, my name is {$constants['FOO']}";