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

Php 在字符串中包含常量而不连接,php,string,constants,concatenation,Php,String,Constants,Concatenation,在PHP中有没有一种方法可以在字符串中包含常量而不进行连接 define('MY_CONSTANT', 42); echo "This is my constant: MY_CONSTANT"; 没有 对于字符串,PHP无法区分字符串数据和常量标识符。这适用于PHP中的任何字符串格式,包括herdoc 是获取常量的另一种方法,但是如果没有连接,函数调用也不能放入字符串中 是的(在某种程度上;): 这可能不是您的目标,但我认为,从技术上讲,这不是串联,而是替换,从这个假设出发,它在字符串中包含

在PHP中有没有一种方法可以在字符串中包含常量而不进行连接

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";
没有

对于字符串,PHP无法区分字符串数据和常量标识符。这适用于PHP中的任何字符串格式,包括herdoc


是获取常量的另一种方法,但是如果没有连接,函数调用也不能放入字符串中

是的(在某种程度上;):


这可能不是您的目标,但我认为,从技术上讲,这不是串联,而是替换,从这个假设出发,它在字符串中包含一个常量,而不进行串联。

如果您确实希望在不进行串联的情况下回显常量,以下是解决方案:

define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';
注意:在本例中,echo采用许多参数(查看逗号),因此它不是真正的串联

Echo的行为就像一个函数,它需要更多的参数,它比串联更有效,因为它不必先串联然后再回送,它只会回送所有内容,而无需创建新的字符串串联对象:))

编辑

此外,如果考虑<强>连接字符串,则传递字符串为<强>参数<>强>或写出<>强字符串>“< /强”,<>强> (逗号版本)总是最快的,下一步则是<强> < /强>(与<强> <强>单引号连接)最慢的字符串构建方法是使用双引号,因为以这种方式编写的表达式必须根据声明的变量和函数进行求值。

您可以执行以下操作:

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

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

$constant = function($cons){
   return constant($cons);
};
以及有关其用法的基本示例:

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

我相信这回答了OP最初的问题。唯一的问题是globals索引键似乎只能作为小写字母使用

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

DB_USER=root

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

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

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

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

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


这是怎么回事? 您可以使用任何字符串函数名和任意参数 可以将任何函数名放在变量中,并使用双引号字符串中的参数调用它。也适用于多个参数

$fn = 'substr';

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

我喜欢海龟

匿名函数也是如此 如果运行的是PHP5.3+,也可以使用匿名函数

$escape   = function ( $string ) {
    return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );
牢记
这种做法是不明智的,但有时会产生更具可读性的代码,所以这取决于您-可能性是存在的。

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

define( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' );
使用extract()
这个很好,因为结果与变量相同。首先创建一个可重用函数:

function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); }
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;
}
然后从任何范围调用它:

extract( constants() );
$s = "I need to buy $bread, $eggs, and $milk from the store.";
$s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK );
在这里,它将常量小写以便于手指操作,但您可以删除数组\u change\u key\u case(),使其保持原样。如果已经有冲突的局部变量名,则常量不会覆盖它们

使用字符串替换
这一个类似于sprintf(),但使用一个替换令牌并接受无限数量的参数。我相信有更好的方法可以做到这一点,但请原谅我的笨拙,试着专注于它背后的想法

与前面一样,您创建了一个可重用函数:

function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); }
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;
}
然后从任何范围调用它:

extract( constants() );
$s = "I need to buy $bread, $eggs, and $milk from the store.";
$s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK );
您可以使用您想要的任何替换令牌,如%或#。我在这里使用斜杠,因为它更容易键入。

最简单的方法是

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\u EOL

所以,我做了一些类似的事情:

$isCLI = ( php_sapi_name() == 'cli' );
$eol = $isCLI ? PHP_EOL : '<br>'; 
echo "${eol} This is going to be printed in a new line";
$isCLI=(php_sapi_name()='cli');
$eol=$isCLI?PHP_EOL:“
”; echo“${eol}这将以新行打印”;
@Pekka:我知道:-D(就在这一次…;):)@juraj.blahunka的方法更狡猾。它用文字回答问题,但不是它的精神@布拉亨卡:不错的座右铭。我们可能每天都使用+1,因为它无疑是正确的答案。一开始我想写和你一样的东西,但读了你的后,我想我必须提出一些不同的东西;)呵呵!但每个人都有一个当之无愧的创意+1.:)“函数调用不能放入字符串”是的,它可以:
define('ANIMAL','turtles')$常量='常量';echo“我喜欢{$constant('ANIMAL')}”
@ravelen您应该正确提交答案,而不是作为评论。我相信这能以最高效、最优雅的方式回答OOP(和我的)问题。谢谢。我只是指出这是可能的,没有评论哪种方式更好。这似乎不起作用(即使你连续使用大写字母)$GLOBALS是。这个答案是错误的。这可能产生输出的唯一方法是,如果脚本中的某个地方也有
$db_user='root'这是一个伟大的技巧!与其他答案一样,从努力程度和可读性方面来说,这并不是对串联的一大胜利,但很高兴知道这一点。当您执行类似于
$\uu=create\u函数(“$a”,“return$a;”)的操作时,它甚至更性感$s=“我喜欢{$\动物)}”
。Taiko的版本删除了ne