development

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

big-blog 2020. 6. 9. 07:45
반응형

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


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';

note: in this example echo takes a number of parameters (look at the commas), so it isn't real concatenation

Echo behaves as a function, it takes more parameters, it is more efficient than concatenation, because it doesn't have to concatenate and then echo, it just echoes everything without the need of creating new String concatenated object :))

EDIT

Also if you consider concatenating strings, passings strings as parameters or writing whole strings with " , The , (comma version) is always fastest, next goes . (concatenation with ' single quotes) and the slowest string building method is using double quotes ", because expressions written this way have to be evaluated against declared variables and functions..


You could do:

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

As others have pointed out you can not do that. PHP has a function constant() which cant be called directly in a string but we can easily work around this.

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

and a basic example on its usage:

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

The easiest way is

define('MY_CONSTANT', 42);

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

Another way using (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;

Here are some alternatives to the other answers, which seem to be focused mostly on the "{$}" trick. Though no guarantees are made on their speed; this is all pure syntactic sugar. For these examples, we'll assume the set of constants below were defined.

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

Using extract()
This one is nice because the result is identical to variables. First you create a reusable function:

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

Then call it from any scope:

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

Here, it lowercases the constants to be easier on your fingers, but you can remove the array_change_key_case() to keep them as-is. If you already have conflicting local variable names, the constants won't override them.

Using string replacement
This one is similar to sprintf(), but uses a single replacement token and accepts an unlimited number of arguments. I'm sure there are better ways to do this, but forgive my clunkiness and try to focus on the idea behind it.

Like before, you create a reusable function:

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;
}

Then call it from any scope:

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

You can use any replacement token you want, like a % or #. I used the slash here since it's a bit easier to type.


It is fun that you can use keyword 'const' as a name for your function to prevent namespace littering:

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

You can also use $GLOBALS to propagate 'const' function all over the code:

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

Unsure is it safe for future using. And what is worse - it's still looks ugly.


I believe this answers the OP's original question. The only thing is the globals index key seems to only work as lower case.

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

Output:

DB_USER=root

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

반응형