2010-10-07 10 views
11

Jeśli mam kod jak poniżej:Czy instancja obiektu PHP może znać swoją nazwę?

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

to możliwe, aby wydrukować imię i nazwisko osoby, przechowywane jako nazwa zmiennej, od metody?

Ponieważ nie jest to standardowa procedura, domyślam się, że to zły pomysł.

Sprawdziłem i nie mogę nic na ten temat znaleźć.

+0

byłoby przydatne w niektórych przypadkach, ale boję się tego nie jest możliwe. Może to ze zmiennymi zmiennymi? – fabrik

+2

Czy "Osoba" nie powinna mieć zmiennej instancji '$ name'? Co jeśli masz obiekty w tablicy typu '$ p = array (new Person(), new Person())'? –

+1

Może być strasznie kludgy sposób używając 'debug_backtrace()' (która da ci linię, z której wywołano wywołanie 'about()') i tokenizera (który może dać ci odniesienie do zmiennej, z której wywołano wywołanie), ale to naprawdę nie nadaje się do użytku produkcyjnego –

Odpowiedz

20

Nie. Obiekty mogą mieć wiele nazw lub brak imion. Co by się stało tutaj:

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

lub tutaj:

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

f(new Person()); 

Jeżeli przedmioty trzeba znać swoje nazwy, a następnie muszą wyraźnie zapisać ich imiona jak zmienne składowe (jak $age i $height).

+3

+ 1 Ładne przykłady! – fabrik

+0

możesz jednak mieć właściwość i ustawić tę właściwość podczas inicjowania klasy. Oczywiście jeśli znasz nazwę zmiennej, do której ją przypisujesz, poznasz nazwę. Dodatkowo, w interesie logiki, jeśli znasz nazwę zmiennej do pobrania obiektu, to i tak będziesz znać nazwę ...:/ –

+0

W moim przykładzie rzeczywistym, nazwa instancji i wartość "nazwa" "własność zawsze byłaby taka sama, a więc wydawało się zbędne. Ale na podstawie tych przykładów widać teraz, że wcale nie jest zbędny. – eje211

3

Eje211, próbujesz używać zmiennych w bardzo dziwny sposób. Zmienne są po prostu posiadaczami danych. Twoja aplikacja nigdy nie powinna zajmować się nazwami zmiennych, lecz wartościami w nich zawartymi.

Standardowym sposobem osiągnięcia tego - jak już wspomniano, jest nadanie klasie Person właściwości "name".

Aby powtórzyć, nie należy polegać na nazwach zmiennych w celu określenia wydajności/funkcjonalności aplikacji.

+0

Składasz roszczenie, nawet nie próbując złożyć kopii zapasowych swoich roszczeń z powodów. Równie dobrze może to być losowy hałas. Zgadzam się, że nie jest to standardowa praktyka, ale stwierdzenie, że nigdy nie jest dobrym pomysłem, jest ograniczone. Byłoby bardzo przydatne w wewnętrznym DSL. Zgadzam się, że nie można tego zrobić, ale mówisz, że nikt nie powinien tego robić. –

0

Nazwy zmiennych zdefiniowanych przez użytkownika należy traktować jako całkowicie przezroczyste dla kompilatora PHP (lub dowolnego kompilatora). Tworzone obiekty są po prostu odniesieniami do pamięci, która wskazuje na rzeczywisty obiekt. Ich nazwa nie ma znaczenia. Imię i nazwisko to członek osoby.

Można jednak uzyskać zmienne, które mają z get_defined_vars()

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

Nie powinno to absolutnie to zrobić jednak, a obiekt będzie nadal muszą wiedzieć, w jakiej kolejności były przechowywane zmienne . Nie mam pojęcia, jak to obliczyć.

+0

Nie jest prawdą, że nazwy zmiennych nie mają znaczenia. Gdyby to była prawda, podawalibyśmy im losowe nazwy, a może nie mieliby żadnego imienia lub nazwa byłaby ukryta przed programistą. Są formą komunikacji i mogą oznaczać to, co chcemy, aby znaczyły w języku, który wspiera język. Chciałbym, aby był dobrze obsługiwany sposób robienia tego, o co pyta. –

+0

@ still_dreaming_1 To prawda, zależy to od twojego punktu widzenia. Kompilator absolutnie nie dba o to, czy nazywasz zmienne po swoich byłych przyjaciółkach, byłych żonach lub pełnej obsadzie wszystkich sezonów Gry o Tron. Jest to pierwszy poziom interpretacji, a mianowicie ty, osoba, która to pisze. Teraz, jeśli dzielimy się kodem, a ja nie mam zielonego pojęcia, kim były twoje byłye lub byłe żony i co to znaczy, nie mogę _interpretować twojego kodu. Oznacza to, że nie rozumiem twojej interpretacji języka programowania. Staje się dla mnie bezużyteczna, ale nie dla kompilatora. – dbf

0

Przykład ten może być pomocny obecnie nie istnieje metoda, która powie Ci nazwę obiektu musisz określić się jak w poniższym kodzie:

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'); 
Powiązane problemy