在没有连接的string中包含常量

有没有一种方法在PHP中包含一个string常量不串联?

define('MY_CONSTANT', 42); echo "This is my constant: MY_CONSTANT"; 

没有。

使用string,除了常量标识符之外,PHP不能告诉string数据。 这适用于PHP中的任何string格式,包括heredoc。

constant()是获取constant()一种替代方法,但函数调用不能在没有连接的情况下放入一个string中。

PHP中的常量手册

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

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

这可能不是你想要的,但是我想在技术上这不是连接而是一个replace,并且从这个假设中,它包含了一个不串连的string中的常量

要在string中使用常量,可以使用以下方法:

 define( 'ANIMAL', 'turtles' ); $constant = 'constant'; echo "I like {$constant('ANIMAL')}"; 


这个怎么用?

您可以使用任何string函数名称和任意参数

可以将任何函数名称放在一个variables中,并用双引号string中的参数调用它。 也可以使用多个参数。

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

产生

我喜欢乌龟

匿名function

你也可以使用匿名函数,只要你运行的是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。

不允许callback数组!

如果现在你的印象是函数名可以是任何可调用的,那么不是这样的,因为在传递给is_callable时返回true的数组在string中使用时会导致严重错误:

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

如果你真的想回声不断连接这里是解决scheme:

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

注意 :在这个例子中,echo使用了许多参数( 查看逗号 ),所以它不是真正的串联

Echo作为一个函数,它需要更多的参数,它比串联效率更高,因为它不需要连接,然后回声,它只是回声的一切,而不需要创build新的string连接的对象:))

编辑

另外,如果考虑连接string,传递string作为参数或者用“ ,,(逗号版本)总是最快的string写入,下一步(用单引号连接),最慢的string构build方法是用双引号因为用这种方式编写的expression式必须根据声明的variables和函数进行评估。

你可以这样做:

 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() ,它不能直接在string中调用,但我们可以很容易地解决这个问题。

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

以及其用法的基本示例:

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

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

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

使用extract()
这个很好,因为结果和variables是一样的。 首先你创build一个可重用的函数:

 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()以保持原样。 如果您已经有冲突的局部variables名称,常量将不会覆盖它们。

使用stringreplace
这个类似于sprintf(),但使用一个replace标记并接受无限数量的参数。 我相信有更好的办法可以做到这一点,但是请原谅我的笨拙,并试图把注意力集中在它的背后。

像以前一样,您创build一个可重用的函数:

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

您可以使用任何您想要的replace令牌,如%或#。 我在这里使用了斜线,因为键入起来更容易一些。

最简单的方法是

 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; 

您可以使用关键字'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;}; 

不确定未来使用是否安全。 而更糟糕的是,它看起来还很丑陋。

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

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

输出:

 DB_USER=root