Может ли экземпляр объекта 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".

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

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

Я просмотрел его и ничего не могу найти об этом.

 11
Author: eje211, 2010-10-07

4 answers

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

$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).

 20
Author: RichieHindle, 2010-10-07 12:28:20

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

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

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

 3
Author: Craige, 2010-10-07 13:33:20

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

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

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

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

 0
Author: Explosion Pills, 2010-10-08 04:41:55

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

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'); 
 0
Author: saoud rehman, 2016-09-06 06:21:10