[PHP] OOP functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
Ik zoek een bepaalde OOP functie, maar kan het niet vinden.

Ik wil een puch-pull systeem opzetten, en wil moet dus de naam van de objecten dorgeven (niet de objecten zelf). zoiets als: get_name($this).
Ik zou de naam kunnen doorgeven met argumenten, maar dat is compleet onzinnig, want het is helemaal niet relevant in het "verhaal".


Ik probeer te illustreren met een fictief voorbeeld.

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
<?php
$wereld = new werelden;
$koe = new dier("melk");

class dier
{
function __construct("product")
{
# Het gaat dus om deze regel:
$wereld->nieuw(get_name($this));
}
function get_actie()
{
return "melk";
}
}

class werelden
{
function nieuw($objectnaam)
{
$array[] = $objectnaam;
}
function maakwereld()
{
$wereldactie = '';
foreach( $array as $objectnaam)
{
$wereldactie .= $objectnaam->get_actie();
}
return $wereldactie;
}
}



*heb een beetje php gekribbeld hier, hoop dat het duidelijk is.

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Het zou allicht schelen als je de opmaak van je code wat beter leesbaarder maakte...
Misschien zie je dan zelf ook of er iets niet goed is... :)
PHP:
1
2
3
4
function foo()
{
    return $foo->bar;
}
Zo bedoel ik... ;) Dan zie je tenminste wat de functie moet doen... :)

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

deze al gezien: http://nl3.php.net/__autoload ?

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

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

Confusion

Fallen from grace

g4wx3 schreef op maandag 30 juni 2008 @ 22:16:
Ik wil een puch-pull systeem opzetten
Een wat?
en wil moet dus de naam van de objecten dorgeven (niet de objecten zelf). zoiets als: get_name($this).
Wat is 'de' naam van een object? Bedoel je daarmee een eigenschap die jij aan objecten toekent of een eigenschap die ze volgens jou al zouden moeten hebben?

In beide gevallen geldt: als je de naam aan de hand van het object kan bepalen, dan kan je natuurlijk ook het object 'doorgeven' en de naam bepalen op de plek waar de objectreferentie beschikbaar is gekomen.
hoop dat het duidelijk is.
Helaas, nee. Ik heb geen flauw idee wat je wilt.

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


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
Confusion schreef op maandag 30 juni 2008 @ 22:34:
[...]

Een wat?


[...]

Wat is 'de' naam van een object? Bedoel je daarmee een eigenschap die jij aan objecten toekent of een eigenschap die ze volgens jou al zouden moeten hebben?

In beide gevallen geldt: als je de naam aan de hand van het object kan bepalen, dan kan je natuurlijk ook het object 'doorgeven' en de naam bepalen op de plek waar de objectreferentie beschikbaar is gekomen.


[...]

Helaas, nee. Ik heb geen flauw idee wat je wilt.
Hij wil eigenlijk de naam van de variabele (van de instantie van het object) doorgeven. Ik heb dat ook een keer geprobeerd, maar dat is dus nog niet zo makkelijk, de functie die g4wx3 zoekt is er volgens mij dus niet zo even.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
met indenting:
g4wx3 schreef op maandag 30 juni 2008 @ 22:16:
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
<?php
$wereld = new werelden;
$koe = new dier("melk");

class dier
{
  function __construct("product")
  {
    # Het gaat dus om deze regel:
    $wereld->nieuw(get_name($this));
  }
  function get_actie()
  {
    return "melk";
  }
}

class werelden
{
  function nieuw($objectnaam)
  {
    $array[] = $objectnaam;
  }
  function maakwereld()
  {
    $wereldactie = '';
    foreach( $array as $objectnaam)
    {
      $wereldactie .= $objectnaam->get_actie();
    }
    return $wereldactie;
  }
}
1) wat doe je met globals als je OOP bezig bent
2) je doet absoluut niets met de naam van het object
3) de naam van het object heeft geen 1-op-1-relatie met het object:
PHP:
1
2
$a = new Ding();
$b = $a;

wat is dan de naam van $a?
4) mocht je bedoelen dat je het type wilt weten -> http://nl.php.net/manual/en/function.get-class.php

maar ik heb vooral het vermoeden dat je zelf geen idee hebt waar je mee bezig bent :P

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Cyphax schreef op maandag 30 juni 2008 @ 22:40:
[...]

Hij wil eigenlijk de naam van de variabele (van de instantie van het object) doorgeven. Ik heb dat ook een keer geprobeerd, maar dat is dus nog niet zo makkelijk, de functie die g4wx3 zoekt is er volgens mij dus niet zo even.
wtf, waar zou je dat nu toch weer voor willen :?

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
Kun je $this niet by reference doorgeven? Dus deze regel:
PHP:
1
function nieuw($objectnaam)


veranderen naar:
PHP:
1
function nieuw(&$objectnaam)


Je zou een adres toch wel kunnen zien als een 'naam'. Het is in ieder geval een gegeven uniek voor dat object. :)

@NetForce1, volgens mij om een object op te kunnen slaan in een array, voor zover ik uit het codevoorbeeld kan opmaken.

Brak codevoorbeeld trouwens:
PHP:
1
function __construct("product")
slaat nergens op. :P

[ Voor 29% gewijzigd door Jaap-Jan op 30-06-2008 22:54 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Jaap-Jan schreef op maandag 30 juni 2008 @ 22:49:
Kun je $this niet by reference doorgeven? Dus deze regel:
PHP:
1
function nieuw($objectnaam)


veranderen naar:
PHP:
1
function nieuw(&$objectnaam)


Je zou een adres toch wel kunnen zien als een 'naam'. Het is in ieder geval een gegeven uniek voor dat object. :)

@NetForce1, volgens mij om een object op te kunnen slaan in een array, voor zover ik uit het codevoorbeeld kan opmaken.
Gaar, in dit geval zou dat toevallig goed gaan omdat de scope goed is, maar anders gaat dat natuurlijk nooit werken. Beter lijkt met om gewoon het object zelf door te geven met $this (afaik zijn objecten altijd by-ref in php5). Maar dan nog vraag ik me af of dit de juiste oplossing is voor het probleem van ts, het is namelijk niet bekend wat hij hiermee probeerd op te lossen.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 22:05
NetForce1 schreef op maandag 30 juni 2008 @ 22:57:
[...]

Gaar, in dit geval zou dat toevallig goed gaan omdat de scope goed is, maar anders gaat dat natuurlijk nooit werken. Beter lijkt met om gewoon het object zelf door te geven met $this (afaik zijn objecten altijd by-ref in php5). Maar dan nog vraag ik me af of dit de juiste oplossing is voor het probleem van ts, het is namelijk niet bekend wat hij hiermee probeerd op te lossen.
Klopt, alleen in PHP 3 en 4 by value, dus deze constructie is ook niet nodig. Nu ik het ook zie, wordt mij uit het codevoorbeeld ook helemaal niet duidelijk wat het probleem is.

Een werkend voorbeeld (zonder die get_name() of wat dat ook moge doen):

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
$wereld = new werelden();
$koe = new dier($wereld, "melk");
print_r($wereld->array);
print $wereld->maakwereld();

class dier
{
        function __construct($wereld, $product)
        {
                # Het gaat dus om deze regel:
                $wereld->nieuw($this);
        }

        function get_actie()
        {
                return "melk";
        }
}

class werelden
{
        public $array = array();

        function nieuw($objectnaam)
        {
                $this->array[] = $objectnaam;
        }

        function maakwereld()
        {
                $wereldactie = '';
                foreach( $this->array as $objectnaam)
                {
                        $wereldactie .= $objectnaam->get_actie();
                }
                return $wereldactie;
        }
}


Wat is hier niet goed genoeg aan, TS? :) Zeg nou niet public membervariabelen, want dat weet ik zelf ook wel. :+

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
NetForce1 schreef op maandag 30 juni 2008 @ 22:42:
[...]

wtf, waar zou je dat nu toch weer voor willen :?
In mijn geval alleen om een overzicht bij de houden van de objecten op een pagina voor wat debugging.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Cyphax schreef op maandag 30 juni 2008 @ 23:49:
[...]

In mijn geval alleen om een overzicht bij de houden van de objecten op een pagina voor wat debugging.
Hoe kom je dan aan een lijst met al die objecten? Als je die zelf in code samenstelt kun je natuurlijk net zogoed zelf de naam daar ook opgeven.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Volgens mij is TS op zoek naar een soort Factory Method design pattern. En wil hij de volgende zin vertalen naar programmacode:

Applicatie: wereld, creeer voor mij een nieuwe koe.
PHP:
1
$koe = $wereld->createAnimal(koe_type);

waarbij koe_type een class-reference is en $koe de instantiatie die aan de wereld is toegevoegd.

Er zijn situaties denkbaar dat 'wereld' de koe heeft gemaakt met eigenschappen die voor de wereld private zijn. Helaas zijn mij geen class references bekend binnen PHP, dus open de trukendoos:
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
class World
{
    public animals[];
    private privateWorldData;
    
    function World()
    {
        $this->privateWorldData = 'something only God will know about';
    }
    
    function &createAnimal($createAnimalProc)
    {
        $newAnimal = call_user_func($createAnimalProc, $this->privateWorldData);
        $this->animals[] = &$newAnimal;
        return $newAnimal;
    }

    function print()
    {
        foreach($this->animals as $animal)
          echo $animal->getProduct();
    }
}

// each descendant has to implement the function getProduct()
// cannot force this with an abstract function in PHP
class AbstractAnimal
{
    private privateWorldData;
    
    function AbstractAnimal($privateWorldData)
    {
        $this->privateWorldData = $privateWorldData;
    }
}

class Cow extends AbstractAnimal
{
    function Cow($privateWorldData)
    {
        parent::AbstractAnimal($privateWorldData);
    }
    
    // my virtual function
    function getProduct()
    {
        return 'milk';  
    }
}

class Chicken extends AbstractAnimal
{
    function Chicken($privateWorldData)
    {
        parent::AbstractAnimal($privateWorldData);
    }
    
    // my virtual function
    function getProduct()
    {
        return 'eggs';
    }
}

// application
function &createACow($privateWorldData)
{
    $newCow = new Cow($privateWorldData);
    return $newCow;
}

function &createAChicken($privateWorldData)
{
    $newChicken = new Chicken($privateWorldData);
    return $newChicken;
}

$world = new World();

$cow = $world->createAnimal('createACow');
$chicken = $world->createAnimal('createAChicken');

$world->print();

[ Voor 27% gewijzigd door Cousin Boneless op 01-07-2008 00:55 ]


Acties:
  • 0 Henk 'm!

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

Confusion

Fallen from grace

Cousin Boneless schreef op dinsdag 01 juli 2008 @ 00:32:
Volgens mij is TS op zoek naar een soort Factory Method design pattern.
[..]
Helaas zijn mij geen class references bekend binnen PHP,
Als ik in Java het Factory Method patroon implementeer, dan ga ik dus niet vervolgens roepen factoryInstance.getObject(Impl1.class). That deafeats the purpose of the pattern. Om een factory method te implementeren heb je geen class reference of, God forbid, instantie van het te creeeren object nodig.

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


Acties:
  • 0 Henk 'm!

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
@Confusion: Zo beter? Of doelde je hier niet op? Werkt wel die call-back weg, maar geeft wel extra overhead:

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
<?php
// each descendant has an abstract public function createAnimal($privateWorldData)
class AbstractAnimalFactory
{..}

class CowFactory extends AbstractAnimalFactory
{
    ...
    
    function &createAnimal($privateWorldData)
    {
        return new Cow($privateWorldData);
    }
}

class ChickenFactory extends AbstractAnimalFactory
{
    ...
    
    function &createAnimal($privateWorldData)
    {
        return new Chicken($privateWorldData);
    }
}

$world = new World();
$world->createAnimal(new CowFactory());
$world->createAnimal(new ChickenFactory());
...
?>

[ Voor 8% gewijzigd door Cousin Boneless op 01-07-2008 11:51 ]


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
NetForce1 schreef op maandag 30 juni 2008 @ 23:54:
[...]

Hoe kom je dan aan een lijst met al die objecten?
Door de constructor van het object zich te laten registreren in een debuggingobject waar je referenties opslaat, dan zou het wel leuk zijn als je de naam van de variabele er ook bij hebt.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Cyphax schreef op dinsdag 01 juli 2008 @ 11:36:
[...]

Door de constructor van het object zich te laten registreren in een debuggingobject waar je referenties opslaat, dan zou het wel leuk zijn als je de naam van de variabele er ook bij hebt.
Ok, daar heb je wel een geinige toepassing idd. Kun je dat niet bereiken door een native uitbreiding te schrijven op php? (heb daar nooit naar gekeken, geen flauw idee wat de mogelijkheden daarvan zijn).

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Cyphax schreef op dinsdag 01 juli 2008 @ 11:36:
[...]

Door de constructor van het object zich te laten registreren in een debuggingobject waar je referenties opslaat, dan zou het wel leuk zijn als je de naam van de variabele er ook bij hebt.
Zoals al eerder gezegd: De naam van de variabele staat niet vast. Meerdere variabelen kunnen naar 1 object verwijzen.

Dit is imo dus ook niet mogelijk.

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
Allereerst iedereen bedankt voor de moeite, heb weer veel geleerd.
Nu heb ik code die werkt zoals gewenst.
Probleem zat niet bij het doorgeven van het object, maar domweg bij de scope van de gebruikte variabele waardoor ik die niet kon gebruiken in verschillende objecten.

Om de variabele dus in verschillende objecten te gebruiken moet ik die als een global toewijzen,of via de superglobal aanroepen. Wat ik doe.

Hier de echt gebruikte code, maar men classen zijn nog lang niet af (eerder net begonnen)

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
class page
{
    var $_objects;
    var $_title;
    var $_keywords;
    function page()
    {
        $this->_object = array();
        $this->_title = '';
        $this->_keywords = '';
    }
    function new_object($object)
    {
        $this->_objects[] = $object;
    }
    function get_html()
    {
        $html = '';
        foreach($this->_objects as $object)
        {
            $html .= $object->get_html();
        }
        echo $html;
    }
    function get_css()
    {
        $css = '';
        foreach($this->_objects as $object)
        {
            $css .= $object->get_css();
        }
        echo $css;
    }
}

$page = new page;

class FORM
{
    var ..;
    
    function FORM($name='form')
    {
        #probleem - global
        $GLOBALS['page']->new_object($this);    
        $this->_labellength = 0;
        $this->set_name($name);
    }
.....
}

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Waarom wil je form zichzelf laten registreren bij de global page. Het is imho beter om dat te laten doen door de code die een form maakt, dus:
PHP:
1
2
3
$page = new page();
$mySuperForm = new Form();
$page->new_object($mySuperForm);

Of anders page meegeven aan de constructor van form als je page echt nodig hebt in form.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Bedoel je nou niet gewoon
PHP:
1
echo __CLASS__ // vanuit een class
of bedoel je misschien [google=late static binding php] :?

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Probeer je zoiets te doen?

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
<?php

class page {
    static $instance = null;
    
    private $waarde = 1;
    
    function getInstance()  {
        if (self::$instance == null) 
            self::$instance = new page();
            
        return self::$instance;
    }

    function setWaarde($int = 0){
        $this->waarde = $int;
    }
    
    function getWaarde() {
        return $this->waarde;
    }
}

class form {
    
    private $pageInstance;
    function __construct() {
        $p = page::getInstance();
        $this->pageInstance=$p;
    }
    
    function getWaardePage(){
        return $this->pageInstance->getWaarde();
    }

}

$page = page::getInstance();

echo "<br>Waarde van page: " . $page->getWaarde();

$f = new form();

echo "<br>Waarde van page binnen \$f: " . $f->getWaardePage();

$f2 = new form();

echo "<br>Waarde van page binnen \$f2: " . $f2->getWaardePage();

$page->setWaarde(100);

echo "<br>Waarde van page binnen \$f: " . $f->getWaardePage();
echo "<br>Waarde van page binnen \$f2: " . $f2->getWaardePage();
echo "<hr>";
show_source(__FILE__);
?>

Programmer - an organism that turns coffee into software.

Pagina: 1