双引号中的 PHP 静态变量
Posted
技术标签:
【中文标题】双引号中的 PHP 静态变量【英文标题】:PHP static variables in double quotes 【发布时间】:2010-11-19 00:29:42 【问题描述】:如何让 php 在双引号中计算静态变量?
我想做这样的事情:
log("self::$CLASS $METHOD entering");
我尝试了各种 组合来获得
self::$CLASS
的变量值,但没有任何效果。我目前已经解决了字符串连接问题,但输入起来很痛苦:
log(self::$CLASS . " $METHOD entering");
【问题讨论】:
log(self::$CLASS . "$METHOD 输入");是要输入一个额外的字符而不是 log("self::$CLASS $METHOD enter"); ..这很痛苦? 还不错,但是另一个更容易阅读和输入。 :) 我只是想知道如果您不关心优化,是否还有其他选择。 @Scott:沮丧不是答案 @cmc 这不是一个答案,它只是 the 答案。 抱歉,您可以这样做。看看我的帖子:http://***.com/questions/8773236/proper-way-to-access-a-static-variable-inside-a-string-with-a-heredoc-syntax/39778415#39778415 【参考方案1】:对不起,你不能这样做。它只适用于简单的表达式。见here。
【讨论】:
"由于 不能被转义,这种语法只有在 $ 紧跟 时才会被识别。"如果我理解正确,“ self::$METHOD ”将不起作用,因为 $ 字符必须直接跟在左大括号之后。【参考方案2】:不幸的是,目前还没有办法做到这一点。此处答案之一中的示例将不起作用,因为$self::$CLASS
不会返回self::$CLASS
的内容,但会返回名称为self::$CLASS
的变量的内容。
这里是一个例子,它不返回myvar
,而是返回aaa
:
$myvar = 'aaa';
self::$CLASS = 'myvar';
echo "$self::$CLASS";
【讨论】:
【参考方案3】:使用存储在变量中的匿名标识函数。这样你就可以在 之后立即拥有
$
:
$I = function($v) return $v; ;
$interpolated = "Doing $I(self::FOO) with $I(self::BAR)";
(我在此示例中使用类常量,但这也适用于静态变量)。
【讨论】:
【参考方案4】:我不知道你的问题的答案,但是你可以使用__METHOD__
magic constant显示类名和方法。
【讨论】:
谢谢。这很有帮助。我从 Java 搬过来,还没有机会深入研究魔法常数。我将使用这些而不是定义类和方法变量。【参考方案5】:我知道这是一个老问题,但奇怪的是还没有人建议使用 [sprintf][1]
函数。
说:
<?php
class Foo
public static $a = 'apple';
你会使用它:
echo sprintf( '$a value is %s', Foo::$a );
以你的例子为例:
log(
sprintf ( ' %s $METHOD entering', self::$CLASS )
);
【讨论】:
虽然我原则上同意你的观点,但 OP 专门询问双引号中的字符串插值。不是sprintf
。
@maiorano84 OP 说:I've currently settled with string concatenation but it is a pain to type
【参考方案6】:
<?php
class test
public $static = 'text';
public $self = __CLASS__;
// static Method
static function author()
return "Frank Glück";
// static variable
static $url = 'https://www.dozent.net';
public function dothis()
$self = __CLASS__;
echo <<<TEST
$!$''=static::author() // works
$self::author() // works
$this->self::author() // works
$!$''=self::author() // works
$$this->self::author() // don't works
$$self::author() // do/don't works but with notice
$@$self::author() // works but with @ !
TEST;
$test = 'test'; // this is the trick, put the Classname into a variable
echo "$test::author() $$test::$url";
echo <<<html
<div>$test::author()</div>
<div>$$test::$url</div>
HTML;
$test = new test();
$test->dothis();
【讨论】:
【参考方案7】://define below
function EXPR($v) return $v;
$E = EXPR;
//now you can use it in string
echo "hello - three is equal to $E(1+2)";
【讨论】:
【参考方案8】:只需使用串联即可。 You'd be surprised how inefficient variable interpolation in strings can be.
虽然这可能属于预优化或微优化的范畴,但我认为您在此示例中实际上并没有获得任何优雅。
就个人而言,如果我要对其中一个进行微小的优化,并且我的选择是“更快”和“更容易输入” - 我会选择“更快”。因为你只输入了几次,但它可能会执行数千次。
【讨论】:
沮丧不是答案。 看起来永久链接不是。 关于字符串插值的讨论可能仍然不正确:根据 Rasmus Lerdorf(通过 Twitter),这是 1 opcode 与 tmp var 的权衡,性能相似。 文章声称插值是低效的。不提供任何基准 -_-【参考方案9】:是的,这可以做到:
log("$self::$CLASS $METHOD entering");
【讨论】:
是的,是允许的,但是并没有达到预期的效果——它会把self::$CLASS
当作变量名;所以如果self::$CLASS == 'foo'
那么你最终会得到$foo
,而不是你可能期望的'foo'
。以上是关于双引号中的 PHP 静态变量的主要内容,如果未能解决你的问题,请参考以下文章