Может ли экземпляр объекта PHP узнать его имя?

Если у меня есть такой код:

class Person { $age; $height; $more_stuff_about_the_person; function about() { return /* Can I get the person's name? */; } } $John = new Person(); $Peter = new Person(); print $John->about(); // Print "John". print $Peter->about(); // Print "Peter". 

Возможно ли напечатать имя человека, сохраненное как имя переменной, из метода?

Поскольку это не стандартная процедура, я предполагаю, что это плохая идея.

Я искал его, и я ничего не могу с этим поделать.

Нет. Объекты могут иметь несколько имен или имена. Что будет здесь:

 $John = new Person(); $Richie = $John; // $John and $Richie now both refer to the same object. print $Richie->about(); 

или здесь:

 function f($person) { print $person->about(); } f(new Person()); 

Если объекты должны знать свои собственные имена, тогда они должны явно хранить свои имена в качестве переменных-членов (например, $age и $height ).

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

Стандартный способ сделать это – как уже упоминалось, – дать классу Person свойство «имя».

Просто для повторной итерации, не полагайтесь на имена переменных, чтобы определить выход / функциональность вашего приложения.

Определенные пользователем имена переменных должны рассматриваться как полностью прозрачные для компилятора PHP (или любого компилятора, если на то пошло). Объекты, которые вы создаете, – это просто ссылки на память, которые указывают на реальный объект. Их имя не имеет никакого значения. Имя является членом лица.

Однако вы можете получить нужные переменные с помощью get_defined_vars ()

 foreach (get_defined_vars() as $key => $val) { if ($val instanceof Person) { echo $key; } } 

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

Этот пример может быть полезен, в настоящее время нет метода, который сообщает вам имя объекта, которое вы должны указать себе, как в приведенном ниже коде:

 class Person { public $age=0; public $height=0; public $objPerson=''; function about($objPerson,$age,$height) { return 'Person Object Name: '.$objPerson.'<br>'. 'Age: '.$age.'<br>'. 'height: '.$height.'ft<br><hr>'; } } $John = new Person(); $Peter = new Person(); print $John->about('John',25,'5.5'); print $Peter->about('Peter',34,'6.0');