Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[php5] waarde returnen vanuit __construct

Pagina: 1
Acties:
  • 207 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil een kleine validatie van de waardes doen die meegegeven worden aan de constructor. indien dat goed gaat mag hij doorgaan met het object, indien niet zie ik graag dat er bijv NULL oid gereturned wordt.

main.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$oTestObj = new TestObj("juiste waarde"); //hier moet dus gewoon een object gereturned worden.

//echter wil ik graag dit kunnen doen:
if($oTestObj = new TestObj("onjuiste waarde")
{
  echo 'hoera';
}
else
{
  echo 'PRUTSER!';
}
?>


dit heb ik geprobeert met allerlei dingen.
return NULL. alleen de constructor kan niet returnen
unset($this). object wordt nogsteeds netjes terug gegegevn
$this=NULL. foutmelding

wie kan me de goede richting op duwen? ik zit hier echt een beetje op vast.

  • simon
  • Registratie: Maart 2002
  • Laatst online: 20-11 11:51
constructs mogen niets terug geven. die geven het object al terug.

ik denk dat je hier beter een functie voor kan gebruiken

[ Voor 31% gewijzigd door simon op 15-01-2008 12:01 ]

|>


  • mithras
  • Registratie: Maart 2003
  • Niet online
De returnwaarde van een constructor bevat het object zelf. Anders kan je niets met de instantie van het object, dat wil je namelijk juist terug hebben.

Ik zou een static functie maken binnen het object:
PHP:
1
2
3
4
if( TestClass :: is_available() )
  $obj = new TestClass();
else
  trigger_error( "Class is not available" );


/edit:
En dus zo'n klasse:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
class TestClass{
  public function __construct(){
    //Do something to construct myself
  }

  public static function is_available(){
    //Check something
    if( $something)
      return true;
    else
      return false;
  }
}

[ Voor 29% gewijzigd door mithras op 15-01-2008 12:07 ]


  • simon
  • Registratie: Maart 2002
  • Laatst online: 20-11 11:51
weet niet hoor mithras, waarom daar een object voor gebruiken? kun je niet beter gewoon een functie zonder class gebruiken...

|>


  • mithras
  • Registratie: Maart 2003
  • Niet online
Simon schreef op dinsdag 15 januari 2008 @ 12:06:
weet niet hoor mithras, waarom daar een object voor gebruiken? kun je niet beter gewoon een functie zonder class gebruiken...
Tja, daar zou ik ook voor kiezen, maar TS heeft iets in de klasse waar de juistheid wordt gecontroleerd. Blijkbaar zoekt TS het liever in een method van de klasse dan een aparte functie :)

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

SchizoDuckie

Kwaak

Zoals je het hier presenteert zou ik eerder een try/catch aanmaken. Of een static functie die van tevoren de juistheid controleert, maar eigenlijk zegt het al genoeg dat je dit probeert en het lukt niet: Het is waarschijnlijk beter om het op een andere manier op te lossen á la mithras z'n methode.

Stop uploading passwords to Github!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Volgens mij is hier het factory-pattern redelijk goed bruikbaar voor?

  • robbert
  • Registratie: April 2002
  • Laatst online: 20-11 18:22
Als je de constructor "iets" terug wil geven kun je exceptions gebruiken.

  • Cyphax
  • Registratie: November 2000
  • Nu online

Cyphax

Moderator LNX
Ik zou dit ook met een exception doen, dan kan je netjes aangeven wat er mis gaat en is het tenminste duidelijk dat er iets niet in de haak is.

Saved by the buoyancy of citrus


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 20-11 13:35
Als alternatief zou je ook je test iets kunnen aanpassen natuurlijk:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class Foo {
  
  public function __toString () {
    if ($something)
      return 'this teh workz!';
    else
      return 'this teh failz';
  }
}

$object = new Foo;
echo $object; // echo's 'this teh failz' or 'this teh workz' depending on $something


Maargoed, dit is een beetje een ranzige workaround met een functie die daar niet voor bedoelt is. Waarschijnlijk kun je in jou situatie zoals gezegd veel beter gebruik maken van exceptions :)

[ Voor 6% gewijzigd door FragFrog op 15-01-2008 13:30 ]

[ Site ] [ twitch ] [ jijbuis ]


  • Cyphax
  • Registratie: November 2000
  • Nu online

Cyphax

Moderator LNX
FragFrog schreef op dinsdag 15 januari 2008 @ 13:29:
Als alternatief zou je ook je test iets kunnen aanpassen natuurlijk:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class Foo {
  
  public function __toString () {
    if ($something)
      return 'this teh workz!';
    else
      return 'this teh failz';
  }
}

$object = new Foo;
echo $object; // echo's 'this teh failz' or 'this teh workz' depending on $something


Maargoed, dit is een beetje een ranzige workaround met een functie die daar niet voor bedoelt is. Waarschijnlijk kun je in jou situatie zoals gezegd veel beter gebruik maken van exceptions :)
Het nadeel van dit soort dingen is dat het kwaad al geschied is: je object is gemaakt en alles staat er al in. Dat betekent dat je zo'n check kan vergeten, of zelfs fout kunt schrijven. Een klein kansje, maar wel een kansje op bugs met dit soort omwegen. :)

Saved by the buoyancy of citrus


Verwijderd

Exceptions lijken inderdaad de goeie oplossing, al is het niet de bedoeling dat ze zeer frequent opgeroepen worden (nl alleen bij 'uitzondering').
Als het aanmaken van je object zeer vaak kan misgaan, kan je het best gebruik maken van een statische methode:

code:
1
2
3
4
5
6
7
8
9
10
11
12
class MyClass{

 public function __construct($a,$b){
    ....
  }

  public static function parseMyClass(){
   if(geldig)
      return new MyClass($a,$b);
   else
     return null;
  }

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

SchizoDuckie

Kwaak

Verwijderd schreef op dinsdag 15 januari 2008 @ 13:40:
Exceptions lijken inderdaad de goeie oplossing, al is het niet de bedoeling dat ze zeer frequent opgeroepen worden (nl alleen bij 'uitzondering').
Als het aanmaken van je object zeer vaak kan misgaan, kan je het best gebruik maken van een statische methode:

code:
1
2
3
4
5
6
7
8
9
10
11
12
class MyClass{

 public function __construct($a,$b){
    ....
  }

  public static function parseMyClass(){
   if(geldig)
      return new MyClass($a,$b);
   else
     return null;
  }
Ik snap even niet waarom je in plaats van een exception (er gaat iets duidelijk keihard fout) een null zou willen gooien vanuit een static functie :? Een exception lijkt me the way to go als je je code later nog wil kunnen begrijpen. Sterker nog, óók al zou ik die static functie aan maken, dan nog zou ik daarin een exception gooien :P

Stop uploading passwords to Github!


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 20-11 13:35
Cyphax schreef op dinsdag 15 januari 2008 @ 13:31:
[...]

Het nadeel van dit soort dingen is dat het kwaad al geschied is: je object is gemaakt en alles staat er al in. Dat betekent dat je zo'n check kan vergeten, of zelfs fout kunt schrijven. Een klein kansje, maar wel een kansje op bugs met dit soort omwegen. :)
Tja, like I said, 't is een ranzige workaround, maargoed, kan geen kwaad soms een alternatief op te gooien - wellicht is het hele doel van de class van de TS wel om een melding weer te geven, afhankelijk van interne parameters van de class (waardoor bijvoorbeeld een statische call niet zou werken). In zo'n geval zorgt toString er juist voor dat je niet zelf een if/else loop hoeft te doen waardoor je juist weer minder kans hebt dat het fout gaat.

Oke, klein kansje, maar het kan ;)

[ Site ] [ twitch ] [ jijbuis ]


  • mithras
  • Registratie: Maart 2003
  • Niet online
Eigenlijk ben ik nog niet 100% thuis in php5, dus vandaar mijn methode. Een try/catch met exceptions is eigenlijk veel netter. Ik sluit me dus aan bij robbert en Cyphax.

En ik vind FragFrog's methode ook ranzig. Eigenlijk misbruik je bepaalde magic methods, en dat is best wel ranzig ;)

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Vanuit een OO perspectief zijn exceptions _de_ methode om hier te gebruiken, je wil iets instantieren wat incorrect is, dan moet je gewoon een exception krijgen want dat hoort niet. Waarom zou je hier omheen willen werken?

Blog [Stackoverflow] [LinkedIn]

Pagina: 1