Найдите название var вызова

У кого-либо есть идея, если это вообще возможно с 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);

Дал бы мне этот вывод

varName = $hello
varValue = World

Править

Так как большинство людей здесь 'обвиняет' меня в плохом материале методов и глобальных переменных, я собираюсь уточнить немного далее то, почему мы ищем это поведение.

причина мы смотрим на этот вид поведения, состоит в том, что мы хотим сделать переменные присвоения к нашим Представлениям легче.

Большую часть времени мы делаем это для присвоения переменных нашему представлению

$this->view->assign('products', $products);
$this->view->assign('members', $members);

В то время как это было бы легче и более читаемым, чтобы просто смочь сделать следующее и позволить представлению быть ответственным определению имени переменной, присвоенные данные входят в наши представления.

$this->view->assign($products);
$this->view->assign($members);
5
задан ChrisR 2 February 2010 в 13:57
поделиться

10 ответов

Несмотря на мои сомнения, что это вообще возможно, я думаю, что заставлять программиста называть свои переменные, как правило, плохая идея. Вам нужно будет ответить на такие вопросы, как

Почему я не могу назвать свою переменную $ arrProducts вместо $ products ?

У вас также могут возникнуть серьезные проблемы, если вы захотите чтобы поместить возвращаемое значение функции в представление. Представьте себе следующий код, в котором (по какой-либо причине) категория должна быть в нижнем регистре:

$this->view->assign(strtolower($category)); 

Это не сработает с тем, что вы планируете.

Поэтому мой ответ: Придерживайтесь «многословного» способа работы, его намного легче читать и поддерживать.

Если вы не можете смириться с этим, вы все равно можете добавить в представление магическую функцию :

public function __set($name, $value) {
    $this->assign($name, $value);
}

Затем вы можете написать

$this->view->product = $product;
4
ответ дан 18 December 2019 в 11:56
поделиться

Я не думаю, что есть любой язык, где это возможно. Это просто не то, как работают переменные. Существует разница между переменной и значением, которое он содержит. Внутри функции foo , у вас есть значение, но переменная, удерживаемая значением, недоступна. Вместо этого у вас есть новая переменная $ var , чтобы удерживать это значение.

Посмотрите на него так: переменная похожа на ведро с именем на нем. Содержание (значение) переменной - это то, что внутри ведра. Когда вы вызываете функцию, она поставляется со своими собственными ведрами (именами параметров), и вы наливаете содержимое ведра в эти (ну, метафору отрывается здесь, потому что значение копируется и все еще доступно снаружи). Внутри функции нет способа узнать об ведре, который используется для удержания контента.

2
ответ дан 18 December 2019 в 11:56
поделиться

Краткий ответ: невозможно.

Долгий ответ: вы можете прокопать через APD , bytekit , Runkit , API API и Debug_Backtrace Чтобы увидеть, если какая-либо неясная комбинация позволит вам добиться этого поведения.

Однако самый простой способ - просто пройти имя переменной вместе с фактической переменной, как вы уже делаете. Кратко, это легко понять, это гибко, когда вам нужна переменная, чтобы иметь другое имя, и это путь быстрее , чем любой возможный код, который может быть в состоянии достичь другого желаемого поведения.

Держите его простым

Удаленные неактуальные части после ОПК редактированы вопрос

5
ответ дан 18 December 2019 в 11:56
поделиться

Это не невозможно, то можно найти, где была вызвана функция из debug_backtrace(), а затем лексеонизировать копию запущенного скрипта для извлечения выражений параметров (а что если вызывающая строка foo("hello $user, " . $indirect($user,5))?),

, однако, какова бы ни была причина, по которой вы пытаетесь этого добиться - это неправильная причина.

C.

1
ответ дан 18 December 2019 в 11:56
поделиться

То, что вы спрашиваете, не возможно. Даже если бы это было, это, скорее всего, будет считаться плохой практикой, так как ее вид может легко использовать.

Если вы решите добиться чего-то вроде этого, ближайший к тому, что вы можете получить, чтобы пройти имя переменной как строку и ссылаться на его функцию из массива $ Globals.

Например,

function this_aint_a_good_idea_really($var) {
    print "Variable name: {$var}\n";
    print "Variable contents: {$GLOBALS[$var]}\n";
}
$hello="World";
this_aint_a_good_idea_really('hello');

, но, как я уже говорю, это не очень хорошая идея, и не очень полезно. (Честно говоря, почти в любое время вы прибегаете к использованию глобальных переменных, вы, вероятно, делаете что-то не так)

2
ответ дан 18 December 2019 в 11:56
поделиться

Хорошо, время для некоторых уродливых хаков, но это то, что у меня есть, я попробую поработать немного позже

<?php
class foo
{
    //Public so we can test it later
    public $bar;
    function foo()
    {
        //Init the array
        $this->bar = array();
    }
    function assign($__baz)
    {
        //Try to figure out the context
        $context = debug_backtrace();
        //assign the local array with the name and the value
        //Alternately you can initialize the variable localy
        //using $$__baz = $context[1]['object']->$__baz;
        $this->bar[$__baz] = $context[1]['object']->$__baz;
    }
}
//We need to have a calling context of a class in order for this to work
class a
{
    function a()
    {

    }
    function foobar()
    {
        $s = "testing";
        $w = new foo();
        //Reassign local variables to the class
        foreach(get_defined_vars() as $name => $val)
        {
            $this->$name = $val;
        }
        //Assign the variable
        $w->assign('s');
        //test it
        echo $w->bar['s'];
    }
}
//Testrun
$a = new a();
$a->foobar();
1
ответ дан 18 December 2019 в 11:56
поделиться

В этом решении используется переменная GLOBALS. Чтобы решить проблемы с областью видимости, переменная передается по ссылке, а значение изменяется, чтобы быть уникальным.

function get_var_name(&$var, $scope=FALSE) {
    if($scope) $vals = $scope;
    else      $vals = $GLOBALS;
    $old = $var;
    $var = $new = 'unique'.rand().'value';
    $vname = FALSE;
    foreach ($vals as $key => $val) {
        if($val === $new) $vname = $key;
    }
    $var = $old;
    return $vname;
}

$testvar = "name";
echo get_var_name($testvar);  // "testvar"

function testfunction() {
    $var_in_function = "variable value";
    return get_var_name($var_in_function, get_defined_vars());
}

echo testfunction();  // "var_in_function"

class testclass {
    public $testproperty;
    public function __constructor() {
        $this->testproperty = "property value";
    }
}

$testobj = new testclass();
echo get_var_name($testobj->testproperty, $testobj);  // "testproperty"
0
ответ дан 18 December 2019 в 11:56
поделиться
- [1137455-

Может быть, что вы хотите сделать, это наоборот, хакерское решение, как это работает нормально:

<?php
  function assign($val)
  {
    global $$val;
    echo $$val;
  }
  $hello = "Some value";
  assign('hello');

OUPUTS: Некоторые значения

0
ответ дан 18 December 2019 в 11:56
поделиться

невозможно - Максимум. объем информации, который вы можете получить, - это то, что вы видите при сбросе

debug_backtrace();
0
ответ дан 18 December 2019 в 11:56
поделиться

PHP не предназначен для того, что вы хотите сделать. Для этого нет обычного способа. На самом деле доступны только довольно экстравагантные решения. Один из них, который остается настолько близким к PHP, насколько я могу представить, - это создание нового класса.

Вы можете назвать его NamedVariable или что-то в этом роде, и в качестве конструктора он принимает имя переменной и значение. Вы должны запустить его как $ products = new NamedVariable ('products', $ productData); , а затем использовать его как $ this-> view-> assign ($ products); . Конечно, ваша строка объявления теперь довольно длинная, вы включаете еще один - и довольно неясный - класс в свою базу кода, и теперь метод assign должен знать о NamedVariable , чтобы извлечь оба имени переменной и стоимость.

Как ответило большинство других участников, вам лучше пострадать из-за этого небольшого недостатка синтаксического сахара. Имейте в виду, что другим подходом было бы создание сценария, который распознает экземпляры assign () и переписывает исходный код. Теперь это потребует некоторого дополнительного шага перед запуском кода, а для PHP это глупо. Вы даже можете настроить свою IDE для автоматического заполнения assign (). Что бы вы ни выбрали, PHP изначально не предполагает решения.

0
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: