Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

porucha není na vašem přijímači

PHP hádanka VI.: zjištění názvu třídy

V těchto věcech si nejsem nikdy jist a občas si musím napsat modelový miniprográmek, abych věděl, jak se PHP zachová. V uvedeném příkladu vypisuji název aktuální třídy pomocí funkce get_class($this) a „magické“ konstanty __CLASS__. Konstanta má tu výhodu, že ji lze užít i ve statické metodě (tam není definováno $this). Otázka je, jestli i ve zděděné třídě vypíší totéž. Tak co, programátoři?

class A {

  function showClassName() {
    echo get_class($this) . ' ' . __CLASS__;
  }
}

class B extends A {
}

$foo = &new B();
$foo->showClassName();

Karma body: 18. Líbil se vám článek?

Komentáře » přidat

  1. [1] Mormegil: nový

    IMHO to samozrejme vypise „B A“. Nikdy jsem to nepouzival, ale prijde mi to uplne samozrejme. __CLASS__ je staticka informace, ergo nepotrebuje $this. Oproti tomu, jak by mela poznat, v jakem kontextu se vola, kdyby opravdu byla staticka? Naopak get_class($this) zjistuje, co je zac $this.

    Posláno 18. 11. 2004 v 18.42 | Odpovědět
  2. avatar [2] johno: nový

    Pravá sranda je to, že get_class() v PHP4 vracia ‚lowercase‘ názov triedy a v PHP5 už normálne.

    Posláno 18. 11. 2004 v 18.47 | Odpovědět
  3. [3] lamka: nový

    Nevíte někdo prosím jak tedy implementovat statickou funkci getInstance(), která bude vracet instanci, třídy kterou byla volána.

    př.//

    $object = Class::getClas­sName(); // $object obsahuje new Class;

    Posláno 24. 4. 2005 ve 12.09 | Odpovědět
    Na komentář reagoval [7] David Grudl
  4. [4] lamka: nový

    Sorry oprava u příkladu :

    $object = Class::getInstan­ce(); // $object obsahuje new Class;

    Posláno 24. 4. 2005 ve 12.10 | Odpovědět
  5. avatar [5] David Grudl: nový

    To by asi nešlo… Ale když už napíšu

    $object = Class::getInstan­ce();

    tak proč prostě rovnou nenapsat:

    $object = &new Class();

    nebo to potřebuješ v jiném kontextu?

    Posláno 24. 4. 2005 ve 14.44 | Odpovědět
  6. [6] xert: nový

    mozna uz jsem mimo, ale proc by to neslo?

    class Singleton
    {
       private static $instance;
    
       // private (!)
       private function __construct()
       {
            // ...
       }
    
       public static function getInstance()
       {
    
           if (!isset(self::$instance)) {
               $classname = __CLASS__;
               self::$instance = new $classname;
           }
    
           return self::$instance;
    
       }
    
       public function __clone()
       {
           throw new Exception('Cloning prohibited');
       }
    
    }
    Posláno 18. 5. 2005 v 15.59 | Odpovědět
    Na komentář reagoval [7] David Grudl
  7. avatar [7] David Grudl: nový

    [6] xert: to ale není totéž, co [3] lamka: požadoval.

    V PHP5 lze použít něco takového:

    class Test {
    
        static function getInstance() {
            return new self();
        }
    
    }
    
    $x = Test::getInstance();

    PHP4 klíčové slovo self nezná, existuje tu však náhradní cesta:

    class Test {
    
        function getInstance() {
            $class = __CLASS__;
            return new $class;
        }
    
    }
    
    $x = Test::getInstance();

    Oba příklady však mají vadu – nebudou korektně fungovat pro zděděné třídy. Vždy se totiž vrátí instance třídy, ve které je metoda getInstance() definována.

    Posláno 18. 5. 2005 v 16.19 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.