找到调用var的名称

Chr*_*isR 5 php

任何人都知道如果用PHP可以实现这一点吗?

function foo($var) {
    // the code here should output the value of the variable
    // and the name the variable has when calling this function
}

$hello = "World";
foo($hello);
Run Code Online (Sandbox Code Playgroud)

会给我这个输出

varName = $hello
varValue = World
Run Code Online (Sandbox Code Playgroud)

编辑

由于这里的大多数人"指责"我的不良做法和全局变量,我将进一步详细阐述我们为什么要寻找这种行为.

我们正在考虑这种行为的原因是我们希望更容易为视图分配变量.

大多数情况下,我们这样做是为我们的视图分配变量

$this->view->assign('products', $products);
$this->view->assign('members', $members);
Run Code Online (Sandbox Code Playgroud)

虽然只是能够执行以下操作并让视图负责确定变量名称,分配的数据会在我们的视图中进行,这样会更容易,更易读.

$this->view->assign($products);
$this->view->assign($members);
Run Code Online (Sandbox Code Playgroud)

Gor*_*don 5

简答:不可能.

龙答:你可以挖通apd,bytekit,runkit,的Reflection APIdebug_backtrace,看看是否有模糊的组合将让你实现这个行为.

但是,最简单的方法是简单地将变量名称与实际变量一起传递,就像您已经做的那样.它简短,易于掌握,当您需要变量具有不同的名称时它很灵活,并且它比任何可能能够实现其他所需行为的代码更快.

把事情简单化

OP编辑问题后删除不相关的部分


Dan*_*oap 4

尽管我怀疑这是否可能,但我认为强迫程序员如何命名他的变量通常是一个坏主意。你必须回答这样的问题

为什么我不能将变量命名$arrProducts$products

如果您想将函数的返回值放入视图中,您也会遇到严重的麻烦。想象一下以下代码,其中(无论出于何种原因)类别需要小写:

$this->view->assign(strtolower($category)); 
Run Code Online (Sandbox Code Playgroud)

这不符合您的计划。

因此,我的答案是:坚持“详细”的工作方式,它更容易阅读和维护。

如果你不能忍受这一点,你仍然可以向视图添加一个神奇的函数:

public function __set($name, $value) {
    $this->assign($name, $value);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写

$this->view->product = $product;
Run Code Online (Sandbox Code Playgroud)