Получить имя переменной внутри нового объекта - PullRequest
0 голосов
/ 15 марта 2012
class Foo {
   private $_id;
   public function __construct (){
     $this->_id = /*requesting variable name*/;
   }
}
$bar = NEW Foo();

Я пытаюсь установить $ bar -> _ id равным 'bar'

Ответы [ 4 ]

1 голос
/ 15 марта 2012

Невозможно получить имя переменной, которой назначается объект, если не считать парсинг PHP-кода строки, вызывающей скрипт.Что, возможно, является злым и достаточно трудным делом, которое не стоит делать.

Учтите, что $bar = new Foo(); делает следующие вещи:

  1. Создает новый Foo
  2. Назначает ссылку на него $bar.

Вы можете думать о тех шагах, происходящих в этом порядке - то естькогда работает Foo конструктор, вы даже не знаете, что произойдет с тем Foo, который вы создаете. Это хорошо, в конечном итоге .Представьте, что каждая функция изменила свое поведение в зависимости от того, как и где она была вызвана.Только тестируемость была бы кошмаром.

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

1 голос
/ 15 марта 2012
class Foo {

   private $_id;

   public function __construct($id) {
     $this->_id = $id;
   }

}

$bar = new Foo('bar');

Нет другого разумного способа сделать это.

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

0 голосов
/ 15 марта 2012

Вы просто устанавливаете значение в конструкторе, но вам нужно получить это значение вне объекта.Поскольку конструктор не возвращает значение, используйте решение getter.

class Foo {

    private $_id;

    public function __construct() {

        $this->_id = 'Foo';

    }

    public function getId() {
        // Because $_id is class member, you can access it like this:
        return $this->_id;

    }

}

$bar = NEW Foo();

echo $bar->getId();
0 голосов
/ 15 марта 2012

Если идея заключается в создании экземпляра объекта с произвольными свойствами, вы можете сделать

public function __construct(array $properties)
{
    foreach($properties as $property => $value) {
        $this->$property = $value
    }
}
$foo = new Foo(array('prop1' => 1, 'prop2' => 2));

Добавить варианты по своему усмотрению.Например, добавьте проверки в property_exists, чтобы разрешить установку только определенных членов.Я нахожу метание случайных свойств в объектах недостатком дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...