在字符串中包含常量而不连接

时间:2010-02-04 23:13:05

标签: php string constants concatenation

在PHP中是否有办法在不连接的情况下在字符串中包含常量?

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";

13 个答案:

答案 0 :(得分:129)

没有。

使用Strings,除了常量标识符之外,PHP无法告诉字符串数据。这适用于PHP中的任何字符串格式,包括heredoc。

constant() 是另一种获取常量的方法,但函数调用不能在没有连接的情况下放入字符串中。

Manual on constants in PHP

答案 1 :(得分:97)

是的(以某种方式;)):

define('FOO', 'bar');

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

这可能不是你的目标,但我认为,从技术上讲,这不是连接而是替换,并且根据这个假设,在字符串中包含一个常量而不连接

答案 2 :(得分:54)

要在字符串中使用常量,可以使用以下方法:

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

请记住

这种做法不明智,但有时会产生更易读的代码,所以它取决于你 - 可能性存在。

答案 3 :(得分:19)

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

答案 4 :(得分:14)

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

答案 5 :(得分:12)

如果你真的希望在没有连接的情况下回显常量,这里是解决方案:

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

注意:在这个示例中,echo需要一些参数(查看逗号),因此它不是真正的连接

Echo表现为一个函数,它需要更多的参数,它比串联更有效,因为它不需要连接然后回显,它只需回应所有内容而无需创建新的String连接对象:))< / p>

修改

此外,如果您考虑连接字符串,将字符串传递为参数或将整个字符串写为“(逗号版本)总是最快,接着是(与'单引号连接)和最慢的字符串构建方法是使用双引号,因为必须根据声明的变量和函数来评估以这种方式编写的表达式。

答案 6 :(得分:11)

你可以这样做:

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

答案 7 :(得分:5)

正如其他人指出你不能那样做。 PHP有一个函数constant(),它不能直接在字符串中调用,但我们可以轻松解决这个问题。

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

及其使用的基本示例:

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

答案 8 :(得分:3)

最简单的方法是

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;

答案 9 :(得分:2)

以下是其他答案的一些替代方案,这些答案似乎主要集中在“{$}”技巧上。虽然没有保证他们的速度;这都是纯粹的语法糖。对于这些示例,我们假设定义了下面的常量集。

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()以使它们保持原样。如果已经存在冲突的局部变量名,则常量不会覆盖它们。

使用字符串替换
这个类似于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 );

您可以使用所需的任何替换标记,例如%或#。我在这里使用斜杠,因为它更容易输入。

答案 10 :(得分:0)

很有趣的是,您可以使用关键字“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;};

不确定以后使用是否安全。更糟糕的是 - 它仍然看起来很难看。

答案 11 :(得分:0)

我经常需要它,主要是在编写脚本时,才能打印换行符。 从浏览器运行脚本时,换行应为<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";

答案 12 :(得分:-2)

我相信这回答了OP的原始问题。唯一的事情是全局索引键似乎只能作为小写。

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

输出:

DB_USER=root