Na navigaci | Klávesové zkratky

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();

Komentáře

  1. Mormegil #1

    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.

    před 19 lety
  2. johno #2

    avatar

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

    před 19 lety
  3. lamka #3

    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::getClassName(); // $object obsahuje new Class;

    před 19 lety | reagoval [7] David Grudl
  4. lamka #4

    Sorry oprava u příkladu :

    $object = Class::getInstance(); // $object obsahuje new Class;

    před 19 lety
  5. David Grudl #5

    avatar

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

    $object = Class::getInstance();

    tak proč prostě rovnou nenapsat:

    $object = &new Class();

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

    před 19 lety
  6. xert #6

    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');
       }
    
    }
    před 19 lety | reagoval [7] David Grudl
  7. David Grudl #7

    avatar

    #6 xerte, 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.

    před 19 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

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