[PHP/OOP] naam child class

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit met het volgende probleem/uitdaging. Ik heb het volgende stukje code
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

class parent {
  public static function foo() {
    // hier moet ik weten wat de naam is van de child class
  }
}

class child extends parent {

}

$test = child::foo();
?>

Nu wil ik in de statische functie foo() weten wat de naam is van de child class. Nu kan ik dit wel oplossen met het volgende stukje code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

class parent {
  public static function foo($child_name) {

  }
}

class child extends parent {
  public static function foo() {
    parent::foo(__CLASS__);
  }
}

$test = child::foo();
?>

Maar dan moet ik in elke child class weer de functie foo() herhalen. Is er een mogelijkheid om het te realiseren zoals in het eerste stukje code?

Acties:
  • 0 Henk 'm!

Verwijderd

*oops* verkeerd gelezen.

[ Voor 78% gewijzigd door Verwijderd op 27-07-2007 11:58 ]


Acties:
  • 0 Henk 'm!

  • Vaudtje
  • Registratie: April 2002
  • Niet online
Je moet op zoek naar een methode om de naam van de klasse uit de runtime informatie te halen mbv de standaard PHP API, ipv zelf iets te schrijven.
Google helpt, zie bv hier

In deeze zin staan drie fauten


Acties:
  • 0 Henk 'm!

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 08-09 11:11
Het kan aan mij liggen, maar volgens mij heeft TS niet zoveel aan de 10 functies genoemd in het artikel "Determine class type with these 10 PHP variable testing functions".

Ik denk dat TS opzoek is naar dit:
www.php.net/classobj

Acties:
  • 0 Henk 'm!

  • Vaudtje
  • Registratie: April 2002
  • Niet online
remcotolsma schreef op vrijdag 27 juli 2007 @ 12:51:
Het kan aan mij liggen, maar volgens mij heeft TS niet zoveel aan de 10 functies genoemd in het artikel "Determine class type with these 10 PHP variable testing functions".
Ik ben ook maar een Java programmeur, maar misschien had TS in de geest van mijn melding verder kunnen zoeken.
Ik vond gettype($var) heel veelbelovend klinken :)

Sluit deze dan beter aan op de vraag? http://nl2.php.net/is_a

[ Voor 6% gewijzigd door Vaudtje op 27-07-2007 15:25 ]

In deeze zin staan drie fauten


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
get_class functie geeft de naam van de class terug.
NB. altijd lower case in PHP4.

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Als je een klasse initieerd zoals:

PHP:
1
$reference = new className();


Dan weet je de child toch al? :?
Als je namelijk eerst de parent instantiert, bestaat de child niet.
Je kan namelijk wel 100 objecten schrijven die poteniel het kind van je klasse zijn....

Of was je vraag al beantwoord TS?

[ Voor 0% gewijzigd door Zoolander op 27-07-2007 20:32 . Reden: was wat vergeten ]

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

Verwijderd

Zoolander schreef op vrijdag 27 juli 2007 @ 20:30:
Als je een klasse initieerd zoals:

PHP:
1
$reference = new className();


Dan weet je de child toch al? :?
Het punt is dat TS de Scope Resolution Operator gebruikt, hij maakt een call naar een static method.
Ik denk dat daar dan ook je beperking in ligt... Bij een instantie en dus een non-static call, zou je gebruik gemaakt kunnen hebben van debug_backtrace() om te weten uit welke extend class de call komt.

Is het een optie om eerst een instantie te maken? Dan is er geen probleem.

[ Voor 3% gewijzigd door Verwijderd op 27-07-2007 21:49 . Reden: wel goed doen.. ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
get_class werkt niet in statische context, die kun je alleen op een object uitvoeren en $this bestaat niet in een statische functie. Leg eens uit wat je precies wilt bereiken, want waarschijnlijk is er een veel nettere oplossing te vinden. Er is vast wel een mooi design pattern of een variant voor. Ik heb zelf zoiets als dit nooit nodig gehad.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08 23:34
Kun je niet het 'abstract method' design pattern gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Parent {
  ...
  public abstract String getClassName();
  public void someMethod {
    String childName = getClassName();
    ...
  }
}

class Child extends Parent {
   ...
   
   public String getClassName() {
     // mbv reflection de naam te weten te komen
   }
}

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Waarom wil je weten wat de naam van de Class is? 99 van de 100 keer betekent dat dat je ontwerp een gebrek heeft.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 17:42

kokx

WIN

Leg eens uit waarom je perse de naam daarvan wilt weten. Want ik kan me echt geen situatie indenken waarom je dat nodig zou hebben.

Verder, de naamkeuze parent voor een class is in php5 nogal fout. Gezien je het keyword parent hebt, welke in een class voor een bovenliggende class staat.

Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
Waarschijnlijk wil je late static binding en dat kan niet in PHP5. Static methods weten worden altijd uitgevoerd in de scope van de class waarin ze gedefined staan.

self verwijst dus altijd naar zichzelf. De naam van de extending class kom je dus niet te weten behalve als je deze met parameters doorgeeft. Dit wordt nog gefixt in php, waarschijnlijk in PHP6 waarbij dan 'this' verwijst naar de class waarop de method is aangeroepen :)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Feyd-Rautha schreef op zaterdag 28 juli 2007 @ 12:04:
Kun je niet het 'abstract method' design pattern gebruiken:
In dit voorbeeld zou get_class wel juist weer goed voldoen.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Feyd-Rautha schreef op zaterdag 28 juli 2007 @ 12:04:
Kun je niet het 'abstract method' design pattern gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Parent {
  ...
  public abstract String getClassName();
  public void someMethod {
    String childName = getClassName();
    ...
  }
}

class Child extends Parent {
   ...
   
   public String getClassName() {
     // mbv reflection de naam te weten te komen
   }
}
Ik neem aan dat je het template method design pattern bedoelt? En dat kun je idd implementeren met een abstract methode.

Echt een sterke oplossing vind ik het niet eerlijk gezegd, want je dwingt niet meer af dat een subklasse van een subklasse de methode implementeert. Bovendien lijkt het me sterk dat je niet kunt vinden hoe je in PHP niet het klasse-object kunt opvragen, zoals aangegeven in bovenstaande posts.
kokx schreef op zaterdag 28 juli 2007 @ 12:50:
Leg eens uit waarom je perse de naam daarvan wilt weten. Want ik kan me echt geen situatie indenken waarom je dat nodig zou hebben.

Verder, de naamkeuze parent voor een class is in php5 nogal fout. Gezien je het keyword parent hebt, welke in een class voor een bovenliggende class staat.
Volgens mij is de meest gebruikte toepassing van dergelijke constructies (dwz. het gebruik van de klassenaam) logging frameworks. Een logger kan uit een klasse vrij veel info halen, zoals package/namespace, klassenaam, etc. Op die manier kun je je loglevels per package en klasse configureren.

Echte logica zou ik er absoluut niet op baseren. Ik vind het een beetje vergelijkbaar met de instanceof operator in Java waarmee je controleert of een object van een bepaald type is. Als je veel if statements hebt met die operator, moet je eens kijken of je je objecten naar een hoger/generieker type kunt tillen.

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Michali schreef op zaterdag 28 juli 2007 @ 11:26:
get_class werkt niet in statische context, die kun je alleen op een object uitvoeren en $this bestaat niet in een statische functie.
get_class() kan ook aangeroepen worden zonder parameters, maar dan is het resultaat hetzelfde als __CLASS__, nog steeds niet nuttig dus in dit geval.
twiekert schreef op zaterdag 28 juli 2007 @ 13:08:
Waarschijnlijk wil je late static binding en dat kan niet in PHP5. Static methods weten worden altijd uitgevoerd in de scope van de class waarin ze gedefined staan.
Volgens dit document krijgt PHP6 wel late static binding maar dat kan nog wel eventjes duren.
JKVA schreef op zaterdag 28 juli 2007 @ 14:20:
Ik vind het een beetje vergelijkbaar met de instanceof operator in Java waarmee je controleert of een object van een bepaald type is.
In PHP5 heb je die operator ook en hoewel dubieus heeft het wel z'n nut. Namelijk in deze situatie:
PHP:
1
2
3
4
5
6
7
function foo($class = null){
    if(!($class instanceof SomeClass)) trigger_error('Foei!', E_USER_ERROR);
}

// dit word namelijk niet ondersteund:
function foo(SomeClass $class = null){
}
Verwijderd schreef op vrijdag 27 juli 2007 @ 21:48:
[...]
Bij een instantie en dus een non-static call, zou je gebruik gemaakt kunnen hebben van debug_backtrace() om te weten uit welke extend class de call komt.
debug_backtrace doet 't wel maar omdat static methods compile time resolved worden heb levert 't verkeerde resultaten op:
PHP:
1
2
3
4
5
6
7
8
9
10
class Foo{
    public static function bar(){
        print_r(debug_backtrace());
    }
}

class Bar extends Foo{
}

Bar::bar();

Output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dexter:~ Home$ php ./base.name.php 
Array
(
    [0] => Array
        (
            [file] => base.name.php
            [line] => 10
            [function] => bar
            [class] => Foo
            [type] => ::
            [args] => Array
                (
                )

        )

)

Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

PrisonerOfPain schreef op zaterdag 28 juli 2007 @ 14:40:
[...]
In PHP5 heb je die operator ook en hoewel dubieus heeft het wel z'n nut. Namelijk in deze situatie:
PHP:
1
2
3
4
5
6
7
function foo($class = null){
    if(!($class instanceof SomeClass)) trigger_error('Foei!', E_USER_ERROR);
}

// dit word namelijk niet ondersteund:
function foo(SomeClass $class = null){
}

[...]
Ok, in een weak typed taal heeft het idd meer nut dan in Java. In Java wordt het overigens ook weleens voor hetzelfde, bijvoorbeeld als je aan een interfacedefinitie vastzit en toch een specifiek type verwacht.

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PrisonerOfPain schreef op zaterdag 28 juli 2007 @ 14:40:
[...]

get_class() kan ook aangeroepen worden zonder parameters, maar dan is het resultaat hetzelfde als __CLASS__, nog steeds niet nuttig dus in dit geval.
Ah, dat wist ik niet. Heeft idd. nog steeds geen nut dan.
PHP:
1
2
3
// dit word namelijk niet ondersteund:
function foo(SomeClass $class = null){
}
Wat wordt niet ondersteund? Als je type hints bedoelt, dan wordt dit in versie 5 al vanaf het begin ondersteund. Als je het over defaulting naar null hebt als je een type hint opgeeft hebt, dan wordt dit sinds versie 5.1.0 ondersteund. Daarvoor gaf het idd. een error.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Michali schreef op zondag 29 juli 2007 @ 11:17:
[...]
Als je het over defaulting naar null hebt als je een type hint opgeeft hebt, dan wordt dit sinds versie 5.1.0 ondersteund. Daarvoor gaf het idd. een error.
Daar doelde ik inderdaad op! Zal het vast in de changelogs gemist hebben. :)
Pagina: 1