[PHP] OO -> Objecten meegeven aan objecten *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

ik ben een beetje aan het pielen met PHP om een object georienteerde database laag te genereren.
Dit werk opzich al goed, alleen nu geef ik aan mijn "table" klasse een object "database". Deze gebruikt "table" om queries uit te voeren (dit werkt).

Alleen behoud ik het gemaakt object van de "database", deze noem ik myDB.
Nu maak ik dus een nieuwe "table" klasse $test = new Table1($myDB);
Nu kan de klasse Table1 alles.

Alleen moet deze ook iets opslaan in de myDB klasse, maar dit werkt dus niet. In Java worden automatisch references van objecten gegeven. Maar hoe zit dit in php? Ik heb al wat geprobeerd met &'entjes te zetten. Maar ik kan er niet helemaal uit.

Hoe krijg ik de waardes uit myDB die Table1 erin zet?

Alvast bedankt

Acties:
  • 0 Henk 'm!

Verwijderd

ik begrijp niet helemaal wat je bedoelt, maar misschien mbv $$?
code:
1
2
3
$eenVar = "waarde";
$varNaam = "eenVar";
print ($$varNaam);

levert "waarde" op.
Kun je daar iets mee?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

By reference moet je overal waar je kunt expliciet opgeven. Geef het aan in de functievoorschriften voor zowel return-values als parameters:

code:
1
2
function & someFunc ( &$param ) {
}


Ik vertrouw references alleen voor geen meter in PHP en probeer ze altijd zo veel mogelijk te vermijden.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Het zou logischer zijn om het table object aan de database class toe te voegen i.p.v. andersom.

Hoe een object by reference toe te voegen aan een class:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class Table {

    function Table(&$oDB) {
         $this->DB = $oDB;
    }
    .....
}


$myDB =& new myDB();

$oTable =& new Table($myDB);

[ Voor 4% gewijzigd door stekkel op 29-01-2004 17:04 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Vergeet op regel 4 dan niet om ook by-reference te assignen ;)
PHP:
4
$this->Db =& $oDb

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik weet nog niet zo goed wat ik met deze replies moet.

Ik zal mijn probleem eens ruimer omschrijven
ik wil bijvoorbeeld het aantal queries tellen dat op mijn verbinding is gedaan.

(nu heb ik in de database klassen een functie query, die in het object een teller ophoogd)

voorbeeld
PHP:
1
2
3
4
5
6
7
8
9
10
11
$myDB = new Database( ... );

$tabel1 = new Table1($myDB);
$tabel2 = new Table2($myDB);

$myDB->open();

$tabel1.get(1); // haal iets op met waarde 1, dus een query.... dus teller ophogen
$tabel2.delete(10); // nummer 10 verwijderen, ook ophogen

$myDB->getAantalQueries(); // dit moet dan 2 opleveren


Wat ik uit de code van DRM kan opmaken moet ik nu overal waar ik myDB doorgeef doorgeven als &$myDB?
Maar zoals je zei.... zoveel mogelijk te omzeilen, kan dit ook op een andere manier?

Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 20-09 23:02
drm schreef op 29 januari 2004 @ 16:50:Ik vertrouw references alleen voor geen meter in PHP en probeer ze altijd zo veel mogelijk te vermijden.
Als ik een beetje oo probeer te programmeren in php loop ik daar ook altijd tegen aan. Je moet echt bij elke assignment opgeven dat het om een reference gaat. Als dan ook nog functies als call_user_func en get_func_args gaat gebruiken wordt het helemaal waardeloos. Maar een reference wordt wel behouden als je hem in een array zet en de array dan kopieert.
Ik dev al een tijdje niet meer voor het web, maar als ik weer eens iets ingewikkelds wil gaan maken doe ik dat wel in een taal die references fatsoenlijk gebruikt.
Ik hoop op een grote verbetering in php 5.

Acties:
  • 0 Henk 'm!

Verwijderd

Zou me verbazen dat PHP5 opeens voor default pass-by-reference gaat zorgen want dat is toch echt wat je wil. Ik zou toch ook eerder voor ASP.NET of J2EE kiezen voor het maken van web-applicaties als je object geörienteerd wil werken.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Somey:
Zou me verbazen dat PHP5 opeens voor default pass-by-reference gaat zorgen want dat is toch echt wat je wil.
Je moet je niet vergissen in de enorme veranderingen die in PHP5 plaats gaan vinden, hoor. Default pass-by-reference wordt het niet, afaik, maar het begint wel eindelijk een beetje op OO te lijken. Zie ook http://www.php.net/zend-engine-2.php
bojo:
Wat ik uit de code van drm kan opmaken moet ik nu overal waar ik myDB doorgeef doorgeven als &$myDB?
Daar komt het wel op neer ja.
Maar zoals je zei.... zoveel mogelijk te omzeilen, kan dit ook op een andere manier?
De meest eenvoudige manier om dit voor elkaar te krijgen zonder references is op de ranzige manier: met globals.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Heb ik dan misschien een opmerking gemaakt over iets anders dan default-pass-by-reference? Kbedoel zelfs jij zegt dat dit er waarschijnlijk niet zal zijn. Das nu net de opmerking die ik maak. Al die OO shit is wel leuk enz maar als je voor een beetje correct OOP steeds met die references gaat moeten kloten dan zal je werk hebben.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

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
<?
    class test_data
    {
        var $data = 'no reference';

        function setdata($d)
        {
            $this->data = $d;
        }

        function printdata()
        {
            echo $this->data, "\n";
        }
    }

    class test_function
    {
        function use_test_data($td)
        {
            $td->setdata("Called by reference? Yes!");
        }
    }

    $td = new test_data();
    $tf = new test_function();

    $tf->use_test_data($td);

    $td->printdata();
?>

Heeft als output in php5:
Called by reference? Yes!

En in php4:
no reference

[ Voor 8% gewijzigd door ACM op 29-01-2004 19:37 ]


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

drm schreef op 29 januari 2004 @ 16:50:
Ik vertrouw references alleen voor geen meter in PHP en probeer ze altijd zo veel mogelijk te vermijden.
Mag ik vragen waarom je references niet vertrouwt in PHP?
ACM schreef op 29 januari 2004 @ 19:34:
PHP:
1
2
3
<?
//knip
?>

Heeft als output in php5:
Called by reference? Yes!

En in php4:
no reference
Afaik zijn worden de objecthandlers inderdaad standaard by-ref doorgegeven in PHP 5. Ik vraag me alleen af of dit geldt voor alleen de objecthandlers.
Verwijderd schreef op 29 januari 2004 @ 19:21:
Heb ik dan misschien een opmerking gemaakt over iets anders dan default-pass-by-reference? Kbedoel zelfs jij zegt dat dit er waarschijnlijk niet zal zijn. Das nu net de opmerking die ik maak. Al die OO shit is wel leuk enz maar als je voor een beetje correct OOP steeds met die references gaat moeten kloten dan zal je werk hebben.
Voor zover ik weet, geldt dat ook bij de meeste andere talen. ;)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

RedRose:
Mag ik vragen waarom je references niet vertrouwt in PHP?
Dat mag zeker ;)

Het heeft 2 redenen:
• In de oudere PHP versies bleek het te zorgen voor memoryleaks. Het feit dat zoiets heeft kunnen zorgen voor memoryleaks geeft mij al de creeps.
• Je zoekt je altijd scheel naar dat ene plekje waar je een ampersandje bent vergeten om erachter te komen waar nou precies die ene clone aangemaakt waardoor je inconsistente gegevens krijgt.

Dat laatste heeft me vaak behoorlijk wat ergernis opgeleverd. Het echt netjes OO programmeren heb ik door dit soort dingen (in PHP4 that is) echt opgegeven.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Je zou eventueel je database als global kunnen maken, dus in je constructor:
PHP:
1
global $myDb;

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

drm schreef op 30 januari 2004 @ 02:38:
[...]
Dat mag zeker ;)

Het heeft 2 redenen:
• In de oudere PHP versies bleek het te zorgen voor memoryleaks. Het feit dat zoiets heeft kunnen zorgen voor memoryleaks geeft mij al de creeps.
Memoryleaks komen idd vaak voor.
• Je zoekt je altijd scheel naar dat ene plekje waar je een ampersandje bent vergeten om erachter te komen waar nou precies die ene clone aangemaakt waardoor je inconsistente gegevens krijgt.
Dat klopt. ctrl+f op &$ komt bij mij heel vaak voor :+
Dat laatste heeft me vaak behoorlijk wat ergernis opgeleverd. Het echt netjes OO programmeren heb ik door dit soort dingen (in PHP4 that is) echt opgegeven.
Voor zover dat al mogelijk was. ;)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

RedRose schreef op 30 januari 2004 @ 01:14:
Afaik zijn worden de objecthandlers inderdaad standaard by-ref doorgegeven in PHP 5. Ik vraag me alleen af of dit geldt voor alleen de objecthandlers.
Klopt, dat was het punt van mijn voorbeeldje.
En alleen de objects worden by-ref doorgegeven, de andere typen niet. De resource identifiers waren sowieso al een soort references natuurlijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Nou das mooi als PHP5 nu wel met default pass-by-reference werkt want dat vond ik altijd erg vervelend. En ja ik weet dat het je met talen zoals c++ ook verplicht bent om overal die reference of pointer symbooltjes te plaatsen maar dat vind ik dan ook net zo kut.
Pagina: 1