tags:

views:

126

answers:

3

If I have code like this:

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".

Is it possible to print the person's name, stored as the variable name, from the method?

As it's not standard procedure, I'm guessing it's a bad idea.

I've looked it up and I can't find anything about it.

+16  A: 

No. Objects can have multiple names, or no names. What would happen here:

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

or here:

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

f(new Person());

If the objects need to know their own names, then they need to explicitly store their names as member variables (like $age and $height).

RichieHindle
+1 Nice examples!
fabrik
you can have a property though and just set that property when you initialise the class. Obviously if you know the name of the variable you are assigning it to then you will know the name. Plus, in the interest of logic, if you know the name of the variable to retrieve the object then you will know the name anyway... :/
Thomas Clayson
In my real-world example, the instance name and the value of the "name" property would have always been the same, and so it seemed redundant. But based on these examples, it now see that it is not redundant at all.
eje211
+1 for you, +2 next time when your example would be 2 variables, 1 with $John and another one with $Doe !
Jordy
@eje211 - even more important if you created a $persons array: $persons = array('John' => new Person('John'), 'Jane' => new Person('Jane'));
Mark Baker
@Mark Baker: Then, the name would be the array's key. But I see now it would still be a Very Bad Idea.
eje211
+2  A: 

Eje211, you're trying to use variables in very bizarre ways. Variables are simply data holders. Your application should never care about the name of the variables, but rather the values contained within them.

The standard way to accomplish this - as has been mentioned already, is to give the Person class a 'name' property.

Just to re-iterate, do not rely on variable names to determine the output/functionality of your application.

Craige
A: 

User defined variables names should be treated as totally transparent to the PHP compiler (or any compiler for that matter). The objects you create are just references to memory that point to the real object. Their name has no meaning. Name is a member of person.

You can, however, get the variables you want with get_defined_vars()

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

This should absolutely not be done, however, and the object would still need to know the order in which the variables were stored. No idea how you would calculate that.

tandu