[php]default arguments met variablen kan niet?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020
Hoi,

Ik ben bezig met om wat classes te schrijven en ik loop nu tegen het probleem aan dat ik een functie heb met default waarden, maar die waarden verwijzen naar variables die geset worden in de constructor van die klasse. Op de een of andere manier valt php hier over en ik kan nergens terug vinden óf dit uberhaupt wel kan...
Misschien heeft iemand hier ervaring met dit soort dingen of een workaround..

Nog een ander vraagje (newbie OO):

Ik heb een user classe en een db classe, en nu heeft die user classe de db classe nodig om bv een user te valideren in de database.
Nou vraag ik me af: ontwerp je de user classe op zo'n manier, dat ie zelf een nieuw db object maakt en het zelf regelt, of ontwerp je de user classe zo dat je bij het maken van een nieuwe user instance een 'pointer'(?) meegeeft naar het db object wat je aanmaakt voordat je je user object maakt?

Ik begrijp het namelijk niet helemaal meer en ik heb ook niet echt een idee waar ik kan lezen over dit soort dingen, dus als iemand nog goeie links weet mbt dit soort onderwerpen: graag.

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class dbClass {
   function dbClass() {
      /* blaat */
   }
}

class userClass {
   function userClass(&$db) {   /* Constructor met reference */
      /* blaat */
   }
}

$db   = new dbClass(); /* Connectie maken (door constructor) */
$user = new userClass($db); /* Instance van dbClass doorgeven */

Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

djazete:
Hoi,

Ik ben bezig met om wat classes te schrijven en ik loop nu tegen het probleem aan dat ik een functie heb met default waarden, maar die waarden verwijzen naar variables die geset worden in de constructor van die klasse. Op de een of andere manier valt php hier over en ik kan nergens terug vinden óf dit uberhaupt wel kan...
Misschien heeft iemand hier ervaring met dit soort dingen of een workaround..
Je bedoelt dus dat dit niet kan:
[nohtml]
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class A {
   var $member_1,
         $member_2;
   function A () {
       $this->member_1 = 'default_value';
       $this->member_2 = 'default_value2';
   }

   function woei ( $param_1 = $this->member_1, $param_2 = $this->member_2 ) {
 
   }
}
[/nohtml]
:? Of begrijp ik je dan verkeerd?

Je kunt daar heel eenvoudig een volgende workaround voor gebruiken:

code:
1
2
define ( 'A_MEMBER_1_DEFAULT', 'default_value' );
define ( 'A_MEMBER_2_DEFAULT', 'default_value2' );

Om vervolgens naar die constanten te verwijzen. 't Nadeel is dan natuurlijk dat ze statisch zijn, en dat wil je waarschijnlijk niet.

Andere workaround is gewoon zelf een default implementeren:

code:
1
2
3
4
5
6
7
8
function woei ( $a = null, $b = null ) {
   if ( is_null ( $a ) ) {
      $a = $this->member_1;
   }
   if ( is_null ( $b ) ) {
      // etcetera
   } 
}
't Is niet echt prachtig ofzo, maar helaas, 't is ook PHP ;)
Nog een ander vraagje (newbie OO):

Ik heb een user classe en een db classe, en nu heeft die user classe de db classe nodig om bv een user te valideren in de database.
Nou vraag ik me af: ontwerp je de user classe op zo'n manier, dat ie zelf een nieuw db object maakt en het zelf regelt, of ontwerp je de user classe zo dat je bij het maken van een nieuwe user instance een 'pointer'(?) meegeeft naar het db object wat je aanmaakt voordat je je user object maakt?

Ik begrijp het namelijk niet helemaal meer en ik heb ook niet echt een idee waar ik kan lezen over dit soort dingen, dus als iemand nog goeie links weet mbt dit soort onderwerpen: graag.

Ik zou zelf de voorkeur geven aan de laatste oplossing.

code:
1
2
3
4
5
class User {
   function User ( &$db ) {
      $this->db = & $db;
   }
}
Helaas schijnt 't zo te zijn dat PHP memoryleaks gaat vertonen als je met references aan object gaat werken, maar daar weet ik het fijne niet van...

hth :)

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


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
djazete schreef op 19 February 2003 @ 11:01:
Hoi,

Ik ben bezig met om wat classes te schrijven en ik loop nu tegen het probleem aan dat ik een functie heb met default waarden, maar die waarden verwijzen naar variables die geset worden in de constructor van die klasse. Op de een of andere manier valt php hier over en ik kan nergens terug vinden óf dit uberhaupt wel kan...
Misschien heeft iemand hier ervaring met dit soort dingen of een workaround..
Zou je hier wat code van kunnen geven, want helemaal duidelijk is het zo niet. Wat ik eruit begrijp zou dit verhaal zijn: function( &$bla = $var )
waarbij $var een variabele van de klasse is.

Dat dat niet gaat lukken lijkt me logisch
http://www.php.net/manual...nctions.arguments.default
The default value must be a constant expression, not (for example) a variable or class member.
Omdat $var geen constante is (hij kan veranderen) kun je die niet gebruiken als default argument. Alleen dingen als 3, "bla" en met define gedefinde zut kun je gebuiken als def. argument.

Maar post eens je (relevante) code, want ik ben er van overtuigd dat een expressie als $var niet nodig als als def. arguemnt
Nog een ander vraagje (newbie OO):

Ik heb een user classe en een db classe, en nu heeft die user classe de db classe nodig om bv een user te valideren in de database.
Nou vraag ik me af: ontwerp je de user classe op zo'n manier, dat ie zelf een nieuw db object maakt en het zelf regelt, of ontwerp je de user classe zo dat je bij het maken van een nieuwe user instance een 'pointer'(?) meegeeft naar het db object wat je aanmaakt voordat je je user object maakt?

Ik begrijp het namelijk niet helemaal meer en ik heb ook niet echt een idee waar ik kan lezen over dit soort dingen, dus als iemand nog goeie links weet mbt dit soort onderwerpen: graag.
Lijkt me dat je hier een reference/pointer gebruikt. Je wilt immers niet meerdere instanties van een database in je model hebben. Er is nl. toch maar 1 database :)

Acties:
  • 0 Henk 'm!

  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020
Verwijderd schreef op 19 februari 2003 @ 11:09:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class dbClass {
   function dbClass() {
      /* blaat */
   }
}

class userClass {
   function userClass(&$db) {   /* Constructor met reference */
      /* blaat */
   }
}

$db   = new dbClass(); /* Connectie maken (door constructor) */
$user = new userClass($db); /* Instance van dbClass doorgeven */
Volgens mij is dat precies wat ik bedoel. Volgens mij heb ik het ook geprobeerd maar heb ik wat & tekentjes op de verkeerde plaatsen staan....
Ik ga dit even proberen, tnx!
(en wat betreft die memleaks: kheb net het topic gevonden waarin dat aangesneden wordt dus ik ga dat even doorspitten)

Drm:
Klopt! Dat is wat ik bedoel, en dat trekt ie inderdaad niet.. Die workaround met if($var = null){} heb ik al aan gedacht maar vind ik niet echt netjes eigenlijk.. :(
Maar idd, het is php, geen C++.. :)
Toch maar iets minder generieke functie schrijven dan..

tnx iig!

Acties:
  • 0 Henk 'm!

Verwijderd

djazete schreef op 19 februari 2003 @ 11:19:
[...]


Volgens mij is dat precies wat ik bedoel. Volgens mij heb ik het ook geprobeerd maar heb ik wat & tekentjes op de verkeerde plaatsen staan....
Ik ga dit even proberen, tnx!
(en wat betreft die memleaks: kheb net het topic gevonden waarin dat aangesneden wordt dus ik ga dat even doorspitten)

Drm:
Klopt! Dat is wat ik bedoel, en dat trekt ie inderdaad niet.. Die workaround met if($var = null){} heb ik al aan gedacht maar vind ik niet echt netjes eigenlijk.. :(
Maar idd, het is php, geen C++.. :)
Toch maar iets minder generieke functie schrijven dan..

tnx iig!
Kun je dat topic ff hier posten? Dan kan ik ook ff een kijkje nemen :)

Acties:
  • 0 Henk 'm!

  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020
dit is het topic: [rml][ Design Pattern] Elke class beschikbaar maken[/rml]
let op chem's opmerkingen

en deze link komt daarin voorbij:
http://www.zend.com/zend/trick/tricks-app-patt-php.php

offtopic:
bij het searchen naar dit soort dingen liet ik dit topic links liggen omdat ik dacht dat design patterns niet echt konden/golden voor php....schijnbaar min of meer dus toch...:)

Acties:
  • 0 Henk 'm!

Verwijderd

djazete schreef op 19 February 2003 @ 11:23:
dit is het topic: [rml][ Design Pattern] Elke class beschikbaar maken[/rml]
let op chem's opmerkingen

en deze link komt daarin voorbij:
http://www.zend.com/zend/trick/tricks-app-patt-php.php

offtopic:
bij het searchen naar dit soort dingen liet ik dit topic links liggen omdat ik dacht dat design patterns niet echt konden/golden voor php....schijnbaar min of meer dus toch...:)
Thx :) /me gaat topic doorlezen :)

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
djazete schreef op 19 February 2003 @ 11:19:
Drm:
Klopt! Dat is wat ik bedoel, en dat trekt ie inderdaad niet.. Die workaround met if($var = null){} heb ik al aan gedacht maar vind ik niet echt netjes eigenlijk.. :(
Maar idd, het is php, geen C++.. :)
Toch maar iets minder generieke functie schrijven dan..

tnx iig!

C++ kan dat ook niet hoor :P
C++:
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
class Name {

        private:
                std::string _name;
                const std::string _defaultVar;

        public:
                Name( std::string defaultVar );
                void setName( std::string name = _defaultVar );
};

Name::Name( std::string defaultVar ) {

        _defaultVar = defaultVar;
}

void Name::setName( std::string name ) {

        _name = name;
}

int main(int argc, char* argv[])
{

        Name name( "Bla" );
        name.setName( "woei" );
        name.setName( );
        return 0;
}

Zal niet gaan werken omdat er geen constante gebruikt is voor default argument, zodat de compiler de waarde niet kan bepalen.

Als je _defaultValue veranderd naar een static const value is het geen probleem :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Glimi schreef op 19 February 2003 @ 11:49:
[nohtml]
[...]
[/nohtml]
C++ kan dat ook niet hoor :P
[...]
Zal niet gaan werken omdat er geen constante gebruikt is voor default argument, zodat de compiler de waarde niet kan bepalen.

Als je _defaultValue veranderd naar een static const value is het geen probleem :)


const maakt niets uit, en het kan net zo goed een resultaat van een functie zijn of een expressie of iets dergelijks. Het probleem is alleen dat het idd geen instance variabele kan zijn

[ Voor 34% gewijzigd door .oisyn op 19-02-2003 12:04 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • djazete
  • Registratie: Juli 1999
  • Laatst online: 07-02-2020
:o en dat terwijl het me zo logisch voorkomt...
Ik heb een constructor die bv mn mysql user/host/passwd uit een file leest, en die stored naar vars. en dan heb ik dus een sqlConnect($user = $this->defUser, etc){}.. maar dat kan dus niet.. helaas
of zou ik er dan consts of statics van moeten maken, (als dat zou kunnen in php..)
Pagina: 1