get called class? beste manier?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

17/11/2010 10:29:15
Quote Anchor link
Ik wil in een functie weten door welke class deze functie is aangeroepen. Helaas heb ik geen PHP 5.3 want hierin heb je de functie get_called_class().

Volgens mij heb ik 2 opties: of de class achterhalen via debug_backtrace(), of de class naam via __CLASS__ meegeven aan de functie. Deze laatste optie vind ik minder prettig omdat ik dan telkens een variabele moet meesturen, maar van de andere kant lees ik ook dat de de debug_backtrace() functie niet zo heel snel is.

Wat moet ik doen? Wat is de beste afweging als je kijkt naar gemak versus performance?

Methode 1:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
static public function foo() {
  $class = debug_backtrace();
  $class = $class[1]['file'];
  // doe iets met de class naam
}
?>

Aanroepen middels: Classnaam::foo();

Methode 2
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
static public function foo($class) {
  // doe iets met de class naam
}
?>

Aanroepen middels: Classnaam::foo(_CLASS_);
Gewijzigd op 17/11/2010 10:57:57 door Ozzie PHP
 
PHP hulp

PHP hulp

30/04/2024 16:41:51
 
Jelmer -

Jelmer -

17/11/2010 10:54:06
Quote Anchor link
Ik zou voor methode 1 gaan. Als je dan upgrade naar PHP 5.3 kan je dat vervangen door get_called_class() en is alles weer ok.

Maar als ik het probeer, dan krijg ik in $class[1]['class'] de class waar foo onderdeel van is, niet wat je zou verwachten bij get_called_class. Dus hij doet niet wat hij moet doen?

Alternatief voor 2 is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
class Foo
{
    static public function test($class = __CLASS__)
    {

        echo "Called from " . $class;
    }
}


class Bar extends Foo
{
    static public function test($class = __CLASS__)
    {

        return parent::test($class);
    }
}


class Baz extends Bar
{
    static public function test($class = __CLASS__)
    {

        return parent::test($class);
    }
}


Baz::test();
?>

Voordeel is dat je bij de aanroepen niet altijd meet __CLASS__ hoeft mee te geven. Nadeel is dat je in iedere extended class al je static functies waar je het nodig hebt weer moet opnoemen.
 
Ozzie PHP

Ozzie PHP

17/11/2010 11:01:55
Quote Anchor link
Dat upgraden van de functie als ik naar php 5.3 ga is lastig. Ik ben een universeel framework aan het maken, wat op verschillende php versies moet draaien. Maar is zo'n debug_backtrace() functie heel traag? Of valt dat uiteindelijk allemaal wel mee?

Toevoeging op 17/11/2010 11:09:59:

Jelmer rrrr op 17/11/2010 10:54:06:
Maar als ik het probeer, dan krijg ik in $class[1]['class'] de class waar foo onderdeel van is, niet wat je zou verwachten bij get_called_class. Dus hij doet niet wat hij moet doen?

Als ik vanuit class bar de functie foo in de class foo aanroep dan geeft ie bij mij wel gewoon de classnaam 'bar' terug. Bij jou niet?
Gewijzigd op 17/11/2010 11:10:52 door Ozzie PHP
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.