[PHP] Functies aanroepen op een returned object

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • eborn
  • Registratie: April 2000
  • Laatst online: 18-09 19:03
Ik probeer het volgende te bewerkstelligen:
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
<?

class A
{
    function A()
    {
    }
    
    function doPrint()
    {
        print "Hello world";
    }
}

class Obj
{
    var $a;

    function Obj()
    {
        $this->a =& new A();
    }
    
    function &getA()
    {
        return $this->a;
    }
}

$o =& new Obj();
$o->getA()->doPrint();

?>

Oftewel: de classe Obj wordt geinstantieerd, waarbij de constructor een nieuwe instantie van het object A aanmaakt. Vervolgens wil ik via de functie getA() dit object terugkrijgen, zodat ik er een functie op aan kan roepen.

Echter, de syntax op regel 31 klopt niet. Daarbij vraag ik me meteen af hoe het wel moet, of dat het misschien niet eens kan.

De code:
PHP:
1
2
3
$o =& new Obj();
$a =& $o->getA();
$a->doPrint();
werkt zoals je zou verwachten. Echter, dit kost weer een extra regel code en een toewijzing (hoewel dat intern ook vast wel gebeurd).

De vraag is daarom of (en zoja hoe) je een functie kunt aanroepen op de referentie van een andere functie. Zonder deze dus eerst in een variabele op te hoeven slaan.

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    function doPrint() 
    { 
        return "Hello world"; 
    } 

// andere class

function &getA()
{
    return $this->a->doPrint();
}

// object

echo $o->getA();
Ofzo? edit: Zo hoef je in je class ook niet te echooen. :)

[ Voor 48% gewijzigd door RedRose op 18-02-2004 11:31 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • eborn
  • Registratie: April 2000
  • Laatst online: 18-09 19:03
RedRose schreef op 18 februari 2004 @ 11:28:
PHP:
1
2
3
4
5
6
7
8
function &getA()
{
    return $this->a->doPrint();
}

// object

$o->getA();
Ofzo?
Dat werkt inderdaad wel. Maar het gaat er meer om dat ik het voor meerdere functies wil doen. Via deze methode zou ik voor elke functie een aparte wrapper binnen het hoofdobject aan moeten maken. Bovendien is het niet overdraagbaar. Als ik het object A in een ander object gebruik moet ik daar weer dezelfde functies aanmaken (of ik moet een 'interface' maken, maar dan kan ik weer geen andere classe extenden).

Acties:
  • 0 Henk 'm!

  • eborn
  • Registratie: April 2000
  • Laatst online: 18-09 19:03
Ik kom zojuist het volgende stukje tekst tegen in de omschrijving van de Zend Engine v2 (die in PHP5 zit):
Dereferencing objects returned from functions

In PHP 4 it wasn't possible to dereference objects returned by functions and make further method calls on those objects. With PHP 5, the following is now possible:
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
<?php
class Circle {
   function draw() {
       print "Circle\n";
   }
}
      
class Square {
   function draw() {
       print "Square\n";
   }
}

function ShapeFactoryMethod($shape) {
   switch ($shape) {
       case "Circle":
           return new Circle();
       case "Square":
           return new Square();
   }
}

ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("Square")->draw();
?>
Bron: http://www.php.net/zend-engine-2.php
Het ziet er dus naar uit dat ik nog even moet wachten :)

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
$o->a->doPrint() zou wel gewoon moeten werken.

[ Voor 15% gewijzigd door stekkel op 18-02-2004 12:05 ]