Toon posts:

[PHP5] Child methods via parent class

Pagina: 1
Acties:

Verwijderd

Topicstarter
Child methods via parent class aanroepen

Ik kan via extends parent methods en members aanroepen in de child class. Maar is het ook mogelijk om Child methods en members aan te roepen vanuit de parent class?

Voorbeeld:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//PHP5

class server{

    // Body!
}

class client extends server{

    public function output(){

        echo "Hello World!";
    }
}

server::output(); // Fatal error: Call to undefined method server::output()

?>

Het voorbeeld werkt niet. Maar is een indicatie van waar ik naar zoek.

Take care,
Pherion

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:35

aex351

I am the one

Nee dat werkt niet. De parent class weet niet dat de child class bestaat. De child class kan wel functies uit de parent class gebruiken dmv extenden.

Je kan via de statische methode wel functies gebruiken uit de parent class.

[ Voor 99% gewijzigd door aex351 op 21-03-2006 01:52 ]

< dit stukje webruimte is te huur >


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 00:22
Natuurlijk kan dat niet. Er kunnen immers a) meerdere child classes zijn met de dezelfde methode en b) in een child klasse methoden overschreven worden uit de parent.
Als je een dergelijke methode wil aanroepen zonder een instantie van de klasse aan te maken moet je hem of aanroepen in de child klasse ( child::output() ) of je moet de methode deel uit laten maken van je basisklasse.

Regeren is vooruitschuiven


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Ik ben stiekem wel nieuwsgierig waarom je zoiets geks wilt doen eigenlijk? :)

Dat het niet mogelijk is hoef ik niet te herhalen want dat hebben de beide heren boven mij al duidelijk genoeg gezegd. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Wat nou het kan niet :*) ! Bedankt voor het reageren in ieder geval. Ik heb een oplossing gevonden.

[ Voor 102% gewijzigd door Verwijderd op 21-03-2006 15:59 ]


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 20:49

RayNbow

Kirika <3

Verwijderd schreef op dinsdag 21 maart 2006 @ 14:14:
Ik vind die extends wel leuk maar ik heb liever een centraal punt waar je alles aan kunt koppelen. En ik noem de oplossing een "parent-child request" :P.
Facade Pattern?

[ Voor 5% gewijzigd door RayNbow op 21-03-2006 14:22 ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Resteert nog steeds de vraag: waarom? Dit is nou niet bepaald net ontwerp te noemen, en in de meeste andere talen is het terecht compleet onmogelijk. Wat voor voordeel heb je van dit soort raar ontwerp? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Het is niet een ontwerp zoals singleton of een ander patroon. Ik wil het gaan gebruiken voor een webcore zodat alle libraries via één class gaat en aangeroepen kan worden.

Met extends maak je namelijk een nieuwe class gebasseerd op de parent en dit is niet wat ik zocht.

@RayNbow: Dat is inderdaad het idee :), bedankt!

[ Voor 33% gewijzigd door Verwijderd op 21-03-2006 14:43 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Verwijderd schreef op dinsdag 21 maart 2006 @ 14:36:
@RayNbow: Dat is inderdaad het idee :), bedankt!
Maar wat jij hebt is niet de implementatie, dat snap je toch wel? :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
Dat weet ik maar mijn idee werkt voor mij goed genoeg :)

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 00:22
Dit gaat wel gruwelijk de mist in als je dezelfde methodenaam in twee klassen gebruikt. Waarom je de moete neemt om dit in klassen te stoppen zie ik derhalve niet helemaal. Je kunt net zo goed je functies in de globale scope definiëren, dan kun je ze ook vanuit je centrale "webcore" aanroepen.

Regeren is vooruitschuiven


Verwijderd

Topicstarter
T-MOB schreef op dinsdag 21 maart 2006 @ 15:24:
Dit gaat wel gruwelijk de mist in als je dezelfde methodenaam in twee klassen gebruikt. Waarom je de moete neemt om dit in klassen te stoppen zie ik derhalve niet helemaal. Je kunt net zo goed je functies in de globale scope definiëren, dan kun je ze ook vanuit je centrale "webcore" aanroepen.
Dat snap ik zelf ook nog wel. Is al opgelost dit was een voorbeeld. Maar goed doe het op je eigen manier. Bedankt, topic mag dicht.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Dit heet idd een Facade. Deze geeft je toegang tot een groep objecten, zonder (over het algemeen) de objecten zelf direct aan te spreken.

Let wel even op het God Class anti pattern, want ik kan hem hier ruiken.

Noushka's Magnificent Dream | Unity


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 24-02 13:08

Janoz

Moderator Devschuur®

!litemod

Topics gaan niet dicht omdat de TS vindt dat hij de oplossing heeft. TOpics gaan alleen dicht wanneer ze niet aan de policy voldoen.

Toch ben ook ik erg benieuwd wat nu eigenlijk je probleem was. Wat je precies wilde oplossen en welke oplossing je daarvoor nu eigenlijk gekozen hebt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
PHP:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
//PHP5

error_reporting(E_ALL);

class server{

    public $child_methods;

    public function __construct(){
        $this->child_methods["client01"] = get_class_methods('client01');
        $this->child_methods["client02"] = get_class_methods('client02');
    }
    
    public function __call($method, $arguments){

        $class_name      = substr($method, 0, strpos($method, "_"));
        $class_method    = substr($method, strpos($method, "_") + 1, strlen($method));
        
        if(in_array($class_method, $this->child_methods[$class_name])){

            call_user_func(array($class_name, $class_method));
        }
    }
}

class client01{

    public function root(){

        echo "Hello World 01!<br />";
    }

    public function eat(){

        echo "Eating...<br />";
    }
}

class client02{

    public function root(){

        echo "Hello World 02!<br />";
    }

    public function sleep(){

        echo "Sleeping...<br />";
    }
}

$riverburn = new server;

$riverburn->client01_root();
$riverburn->client02_root();

?>
Ik zal even uitleggen wat de bedoeling is. Ik heb een core class gemaakt (het voorbeeld is niet mijn core class) en die laadt elke class in die ik aanroep via loadLib en registreert de child methods. Als je een method via het core object aanroept welke niet bestaat dan probeerd hij via de callback te kijken of hij de method van een child class kan krijgen.

Als je straks de webcore gaat gebruiken dan hoef je alleen maar dit te doen.
PHP:
1
2
3
4
5
6
7
8
9
<?php
//PHP5

$riverburn = new core;

$riverburn->loadLib('mysql');
$riverburn->mysql_query("SELECT * FROM table"); // Dit komt uit de mysql library

?>

Ik wil mijn core class dynamisch uitbreiden met verschillende libraries.

[ Voor 16% gewijzigd door Verwijderd op 21-03-2006 16:30 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Waarom zou je dat in vredesnaam willen? Je kunt toch direct bij de class die de service levert de methoden aanroepen? Communiceert lekker totaal niet zeg maar. Typisch een god class nu, en totaal niet OO. Zou je kunnen uitleggen wat voor problemen je hebt bij het direct aanroepen? Dit slaat nergens op iig.

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Het leek me handig als het zou kunnen, maar het kan niet. Wat ik wilde bereiken was dat het hoofd object alle methodes en members kon erven van library classen.

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 20:49

RayNbow

Kirika <3

Verwijderd schreef op dinsdag 21 maart 2006 @ 16:28:
Als je straks de webcore gaat gebruiken dan hoef je alleen maar dit te doen.
PHP:
1
2
3
4
5
6
7
8
9
<?php
//PHP5

$riverburn = new core;

$riverburn->loadLib('mysql');
$riverburn->mysql_query("SELECT * FROM table"); // Dit komt uit de mysql library

?>

Ik wil mijn core class dynamisch uitbreiden met verschillende libraries.
Lijkt je het Factory pattern dan niet beter? Code voorbeeld van de Zend site:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Example
{
    // The parameterized factory method
    public static function factory($type)
    {
        if (include_once 'Drivers/' . $type . '.php') {
            $classname = 'Driver_' . $type;
            return new $classname;
        } else {
            throw new Exception ('Driver not found');
        }
    }
}
?>

PHP:
1
2
3
4
5
6
7
<?php
// Load a MySQL Driver
$mysql = Example::factory('MySQL');

// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>

Ipsa Scientia Potestas Est
NNID: ShinNoNoir

Pagina: 1