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

在 PHP 中有没有一种方法可以在字符串中包含一个常量而不需要连接?

define('MY_CONSTANT', 42);


echo "This is my constant: MY_CONSTANT";
87231 次浏览

没有。

使用字符串时,PHP 无法将字符串数据与常量标识符区分开来。这适用于 PHP 中的任何字符串格式,包括 herdoc。

constant() 是获取常量的另一种方法,但是函数调用也不能放入没有串联的字符串中。

PHP 常量手册

是的(在某种程度上) :

define('FOO', 'bar');


$test_string = sprintf('This is a %s test string', 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']}";
define('FOO', 'bar');
$constants = create_function('$a', 'return $a;');
echo "Hello, my name is {$constants(FOO)}";
define( 'FOO', 'bar');
$FOO = FOO;
$string = "I am too lazy to concatenate $FOO in my string";

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

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

以及一个用法的基本例子:

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

我相信这回答了观察员最初的问题。唯一的问题是,全局索引键似乎只能作为小写字母使用。

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

农产品

我喜欢乌龟

还有匿名函数

如果运行的是 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( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' );

使用 tract ()
这个很不错,因为结果和变量是一样的。首先你要创建一个可重用的函数:

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

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

最简单的方法是

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;

我需要它非常频繁,主要是在写脚本,打印新的行字符。 从浏览器运行脚本时,换行符应该是 <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";

参加聚会迟到了,但是如果你不喜欢的话,这里是我的解决办法:

// 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);