Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sprawdzenie wywołania klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
menic
Jak sprawdzic czy dana klasa została utworzona za pomocą new bądź poprzez utworzenie dziecka tej klasy?
shk
get_class - ta funkcja sprawdza czy został utworzony egzemplarz klasy.
siemakuba
@shk: get_class" title="Zobacz w manualu PHP" target="_manual zwróci ci nazwę klasy, której instancję podasz, a nie sprawdzi czy został utworzony egzemplarz (instancja) klasy. Tak więc, musisz mieć najpierw instancję, żeby móc sprawdzić jakiej klasy jest to instancja ;)


Przychodzi do głowy takie rozwiązanie:
get_defined_vars" title="Zobacz w manualu PHP" target="_manual
Sprawdzasz każą zmienną po kolei, czy jest obiektem. Jeżeli jest, sprawdzasz za pomocą get_class" title="Zobacz w manualu PHP" target="_manual właśnie jakiej klasy jest obiektem. No i jak już to wiesz, możesz sobie sprawdzić czy jest to obiekt klasy która cię interesuje.

pozdr.
Sedziwoj
Cytat(menic @ 26.03.2007, 17:28:09 ) *
Jak sprawdzic czy dana klasa została utworzona za pomocą new bądź poprzez utworzenie dziecka tej klasy?

Dziecka? Chodzi że jej ojcem jest dana klasa, bo jeśli tak to get_class wtedy nie zadziała tylko instaceof
Strzałek
Cytat
Jak sprawdzic czy dana klasa została utworzona za pomocą new bądź poprzez utworzenie dziecka tej klasy?


PHP4 - is_a" title="Zobacz w manualu PHP" target="_manual
PHP5 - instanceof" title="Zobacz w manualu PHP" target="_manual
dr_bonzo
Cytat
instanceof can also be used to determine whether a variable is an instantiated object of a class that inherits from a parent class:


Czyli instanceof()em nie sprawdzisz czy OBIEKT jest instancją klasy czy jej rodzica.



Cytat
Jak sprawdzic czy dana klasa została utworzona za pomocą new bądź poprzez utworzenie dziecka tej klasy?

Kazdy obiekt został utworzony new()'em. Ew pozostaje jeszcze unserialize() i clone().

Mozesz tylko pobrac nazwe klasy obiektu. I zawsze poda ci nazwe Klasy, dla ktorej bylo new() wykonane.
Potem mozesz porownywac z nazwami klas: dziecka i rodzica.

Chyba ze o cos innego ci chodzilo, bo ja tak zrozumialem twoje pytanie
menic
Moze wytłumacze dokładniej. klasa rodzic:
  1. <?php
  2. class rodzic
  3. {
  4. __construct(){
  5. //tu by wypadało sprawdzic w jakis sposob zostala wywolana klasa
  6. }
  7. function funkcja(){
  8. $o = new Dziecko;
  9. }}
  10. ?>

  1. <?php
  2. class dziecko extends rodzic{}
  3. ?>

Z jakiejs klasy wywołuje new Rodzic. Nastepnie z klasy rodzic wywołuje new dziecko które dziedziczy po Rodzic. I w taki sposób konstruktor wywoływany jest 2x. Na chwile obecna poradziłem sobie parametrami, ale ciekawi mnie inny, być moze elegantszy sposób smile.gif

BTW. preg_replace() nie przyjmuje tablic indexowanych stringami?
Sedziwoj
Cytat(dr_bonzo @ 27.03.2007, 11:28:15 ) *
Czyli instanceof()em nie sprawdzisz czy OBIEKT jest instancją klasy czy jej rodzica.

Jak chce dokładny typ to sprawdza get_class, ale przecież klasy dziedziczące mają wszystkie metody rodzica więc chyba nie ważne dla nas jest czy dziedziczy czy jest tej obiektem tej klasy.

Ale chodziło przecież czy jest "dana klasa została utworzona za pomocą new bądź poprzez utworzenie dziecka tej klasy" więc chodzi zarówno obiekty tej klasy jak i obiekty klas po niej dziedziczących.
Tak więc tu pasuje instanceof, tylko trzeba mieć zmienne przechowujące obiekty i sprawdzić za pomocą tego, a jak znaleźć takie zmienne, to jest już napisane.

menic to tworzysz w obiekt klasy potomnej, w klasie z której dziedziczy? Jak dla mnie trochę dziwne, ale może ma to jakieś zastosowanie...
Możesz przecież dodać pusty konstruktor w klasie potomnej, wtedy nie zostanie wywołany konstruktor klasy z której dziedziczy (tak chociaż powinno być).
Cytat
Note: Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.