连接名称空间类静态变量的最佳方法是什么?

时间:2019-01-31 10:35:49

标签: php namespaces

在PHP中,我们可以执行以下操作:

$who = 'world';
$a = 'hello ' . $who;

$a = "hello $who";

$a = "hello {$who}"

将php.net中的 Stephen Clay 引用到String运算符部分中,最后一种方法是最好的,因为当我们使用点时,PHP被强制重新连接所有字符串。另外,如果我们需要连接更多的变量,则后一种方法比第二种方法更好。 但是,如果我必须从类静态变量中连接一个值,那是最好的方法? 如果您尝试将变量直接连接到名称空间类中而不使用点,则PHP会引发错误。仅允许前面显示的第一种方式。我想知道是否还有其他方法可以做到这一点

错误:

$a = "hello \namespace\classname::$who"; //NOTICE: undefined variable who
$b = "hello ${\namespace\classname::$who}"; //NOTICE: undefind variable classname
$c = "hello \namespace\classname::${who}"; //NOTICE: undefine variable who.
$d = "hello {\namespace\classname::$who}"; //NOTICE: undefine variable who

我试图用简单的代码来解释,实际上是我需要从无法获取实例的类中连接一个静态变量。如果您将某个类放入变量中,然后再尝试连接静态属性,则该属性也可以正确运行

$who = new \namespace\classname();
$a = "{$who::$who} $a"; // this run ok.

2 个答案:

答案 0 :(得分:0)

类似...的问题

$d = "hello {\namespace\classname::$who}"

{}通常只希望变量进行替换,但是如它所见,\namespace\classname不知道这是否是文字,因此默认变成文字,然后转到$who,因此在当前名称空间中查找变量。

如果无法获取该类的实例,则仍可以使用该类的名称来设置变量...

$class = namespace\classname::class;
echo "Hello {$class::$who}";

答案 1 :(得分:0)

  

如果我必须从类静态变量中连接一个值,那是最好的方法

有效的一种。这些是微优化,通常不会对性能产生任何可衡量的影响。选择对您来说更易读的版本并使用它:

procedure TForm1.FormCreate(Sender: TObject);
var 
  Compare: TFMXObjectSortCompare;
begin
  ComboBox1.Items.Add('C');
  ComboBox1.Items.Add('B');
  ComboBox1.Items.Add('A');
  Compare := function(Item1, Item2: TFmxObject): Integer
  begin
    if TListBoxItem(Item1).Text = TListBoxItem(Item2).Text then
      Result := 0
    else
    if TListBoxItem(Item1).Text > TListBoxItem(Item2).Text then
      Result := 1
    else
      Result := -1;
  end;

  ComboBox1.Sort(Compare);
end;

$who = \namespace\classname::$who;
$a = "hello {$who}";

然后专注于更重要的事情。我确信您的应用程序中有很多地方可以优化,并且可以带来一些可衡量的性能改进,请不要在这些低级内容上浪费时间(除非您的应用程序仅连接字符串:P)。