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

Bri*_*ian 155 php string constants concatenation

PHP中是否有一种方法可以在不连接的情况下在字符串中包含常量?

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";
Run Code Online (Sandbox Code Playgroud)

Pek*_*ica 136

没有.

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

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

PHP中的常量手册

  • "函数调用不能放入字符串中"是的它可以:`define('ANIMAL','turtles'); $常数= '常数'; echo"我喜欢{$ constant('ANIMAL')}";` (53认同)
  • 我只是指出它是可能的,而不是评论哪种方式更好. (4认同)
  • 呵呵!但是每个人都有创造力的应得+1.:) (2认同)
  • @Raveren 你应该正确提交你的答案,而不是作为评论。我相信这以最有效和优雅的方式回答了 OOP 问题(和我的)。谢谢你。 (2认同)
  • @Raveren,而其他人提供间接变化,不必要地创建函数,而您的则是最短且最直接的解决方案,它依赖于变量函数、被低估且很少使用的 PHP 特性。在整个线程中,我采用了您的特定解决方案。我希望我可以不止一次 +1 它。 (2认同)

Fel*_*ing 104

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

define('FOO', 'bar');

$test_string = sprintf('This is a %s test string', FOO);
Run Code Online (Sandbox Code Playgroud)

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

  • @Pekka:我知道:-D(就在这个时候......;)) (5认同)
  • :-D总有办法 (4认同)
  • @blahunka:很好的座右铭.我们可能每天都在使用它 (2认同)

rav*_*ren 55

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

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

echo "I like {$constant('ANIMAL')}";
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

您可以使用任何字符串函数名称和任意参数

可以将任何函数名称放在变量中,并使用双引号字符串中的参数调用它.也适用于多个参数.

$fn = 'substr';

echo "I like {$fn('turtles!', 0, -1)}";
Run Code Online (Sandbox Code Playgroud)

产生

我喜欢乌龟

匿名功能也是如此

如果您运行的是PHP 5.3+,也可以使用匿名函数.

$escape   = function ( $string ) {
    return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );
Run Code Online (Sandbox Code Playgroud)

按预期生成正确转义的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 )}" ); 
Run Code Online (Sandbox Code Playgroud)

记住

这种做法是不明智的,但有时候会产生更易读的代码,所以这取决于你 - 可能性就在那里.

  • 这是一个很棒的技巧!与其他答案一样,就工作量和可读性而言,并没有真正战胜串联,但很高兴知道。当你执行类似 `$_ = create_function('$a','return $a;'); 的操作时,它会更性感。$s =“我喜欢{$_(ANIMAL)}”`。Thetaiko 的版本不再需要引号,下划线也很可爱。 (2认同)
  • 我可以看到这对于构建模板引擎很有用,但实际上很难使用。 (2认同)

小智 21

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

  • 当我有一堆疯狂的SQL字符串要编写时,这是我最常用的.还有......被动攻击性很强?;-) (4认同)
  • 这只魔咒最少,以看起来多余为代价 (2认同)

the*_*iko 14

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


Jur*_*nka 13

如果你真的想在没有连接的情况下回显常量,那么解决方法是:

define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';
Run Code Online (Sandbox Code Playgroud)

注意:在这个例子中,echo接受了许多参数(查看逗号),因此它不是真正的连接

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

编辑

另外,如果你考虑连接字符串,传递字符串作为参数用",The ,(逗号版本)编写整个字符串总是最快的,接下来就是.(用'单引号连接)和最慢的字符串构建方法是使用双引号",因为必须根据声明的变量和函数来评估以这种方式编写的表达式.


Sim*_*mon 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']}";
Run Code Online (Sandbox Code Playgroud)


Yam*_*iko 5

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

$constant = function($cons){
   return constant($cons);
};
Run Code Online (Sandbox Code Playgroud)

以及它的用法的基本例子:

define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}"; 
Run Code Online (Sandbox Code Playgroud)


Jek*_*kis 5

最简单的方法是

define('MY_CONSTANT', 42);

$my_constant = MY_CONSTANT;
echo "This is my constant: $my_constant";
Run Code Online (Sandbox Code Playgroud)

另一种使用方式 (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;
Run Code Online (Sandbox Code Playgroud)