sourcecode

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

copyscript 2022. 10. 7. 22:14
반응형

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

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

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";

아니요.

Strings를 사용하면 PHP가 문자열 데이터와 상수 식별자를 구분할 수 없습니다.이는 세레독을 포함한 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을 생성합니다.

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

이 시점에서 함수명이 호출 가능한 것으로 생각되고 있는 경우, 이것은 사실이 아닙니다.이러한 이름이 전달되었을 때 true를 반환하는 어레이로서is_callable문자열 내에서 사용하면 치명적인 오류가 발생합니다.

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 연결 객체를 작성할 필요 없이 모든 것을 에코합니다. : )

편집

또한 문자열을 연결하거나 매개 변수로서 전달하거나 문자열 전체를 " , (콤마 버전)"로 쓰는 것을 고려하는 경우, ('single quotes'와 연결), 가장 느린 문자열 작성 방식은 선언된 변수 a에 대해 평가해야 하기 때문에 ""를 사용합니다.nd 함수..

다음과 같은 작업을 할 수 있습니다.

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']}";

가장 쉬운 방법은

define('MY_CONSTANT', 42);

$my_constant = MY_CONSTANT;
echo "This is my constant: $my_constant";

다른 방법으로는(s)printf

define('MY_CONSTANT', 42);

// Note that %d is for numeric values. Use %s when constant is a string    
printf('This is my constant: %d', MY_CONSTANT);

// Or if you want to use the string.

$my_string = sprintf('This is my constant: %d', MY_CONSTANT);
echo $my_string;

에는 PHP 기능.constant()스트링으로 직접 부를 수는 없지만 이 문제를 쉽게 해결할 수 있습니다.

$constant = function($cons){
   return constant($cons);
};

및 그 사용방법에 관한 기본적인 예:

define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}"; 

다음은 주로 "{$}" 트릭에 초점을 맞춘 다른 답변에 대한 몇 가지 대안입니다.비록 그들의 속도에 대한 보장은 없지만, 이것은 모두 순수한 통사설탕이다.이러한 예에서는 아래 상수 집합이 정의되었다고 가정합니다.

define( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' );

extract()
이것은 변수와 결과가 같기 때문에 좋습니다.먼저 재사용 가능한 함수를 만듭니다.

function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); }

다음으로 임의의 범위에서 호출합니다.

extract( constants() );
$s = "I need to buy $bread, $eggs, and $milk from the store.";

여기서는 손가락을 쉽게 하기 위해 상수를 소문자로 표시하지만 array_change_key_case()를 삭제하여 그대로 유지할 수 있습니다.충돌하는 로컬 변수 이름이 이미 있는 경우 상수는 해당 이름을 재정의하지 않습니다.

string replacement (스트링 치환 )
이것은 sprintf()와 비슷하지만 단일 치환 토큰을 사용하여 인수를 무제한으로 사용할 수 있습니다.더 좋은 방법이 있을 거라고 확신하지만, 저의 투박함을 용서하고 그 뒤에 있는 아이디어에 집중하도록 하세요.

이전과 마찬가지로 재사용 가능한 함수를 만듭니다.

function fill(){
    $arr = func_get_args(); $s = $arr[ 0 ]; array_shift( $arr );
    while( strpos( $s, '/' ) !== false ){
        $s = implode( current( $arr ), explode( '/', $s, 2 ) ); next( $arr );
    } return $s;
}

다음으로 임의의 범위에서 호출합니다.

$s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK );

원하는 대체 토큰(% 또는 # 등)을 사용할 수 있습니다.여기 슬래시를 쓴 이유는 타이핑하기 쉬우니까.

파티에는 늦었지만, 인쇄가 마음에 들지 않을 경우를 대비해서 다음과 같은 해결책을 제시하겠습니다.

// Can of course be replaced with the const syntax
define("FOO", "bar");
$replace_pairs = ["%myConstant" => FOO];
// Output : "My constant : bar"
echo strtr("My constant : %myConstant", $replace_pairs);

키워드 'const'를 기능의 이름으로 사용하여 네임스페이스의 낭비를 방지할 수 있는 것도 재미있습니다.

define("FOO","foo");
${'const'} = function($a){return $a;};
echo "{$const(FOO)}"; // Prints "foo"
echo const(FOO); // Parse error: syntax error, unexpected T_CONST

$GLOBALS를 사용하여 코드 전체에 'const' 함수를 전파할 수도 있습니다.

$GLOBALS['const'] = function($a){return $a;};

나중에 사용해도 안전한지 확실하지 않습니다.그리고 더 나쁜 것은 - 그것은 여전히 못생겼다.

새 행 문자를 인쇄하기 위해 주로 스크립트를 작성할 때 자주 필요합니다.은 newline이어야 .<br>는 """로 해야 .PHP_EOL

그래서 저는 다음과 같이 합니다.

$isCLI = ( php_sapi_name() == 'cli' );
$eol = $isCLI ? PHP_EOL : '<br>'; 
echo "${eol} This is going to be printed in a new line";

나는 이것이 OP의 원래 질문에 대한 해답이라고 믿는다.유일한 것은 글로벌 인덱스 키가 소문자로만 작동한다는 것입니다.

define('DB_USER','root');
echo "DB_USER=$GLOBALS[db_user]";

출력:

DB_USER=root

언급URL : https://stackoverflow.com/questions/2203943/include-constant-in-string-without-concatenating

반응형