[PHP] een object niet aanmaken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • erkje
  • Registratie: Oktober 2001
  • Laatst online: 12-06-2024
Geachte mede-ontwikkelaars,

Ik maak een instantie van een class aan, maar wil bij een bepaalde voorwaarde het object toch maar niet dus doe ik het volgende (hele versimpelde versie):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$obj_blaat = new Blaat($id);

if (!$obj_blaat)
    // redirect to other page

class Blaat {
    __construct($id) {
        // query uitvoeren
        if (/*num_rows <= 0*/)
            $this->__destruct();
    }

    __destruct() {
    }
}

Wat is nou het geval, het object bestaat na de eerste regel, terwijl er mijns inziens geen object moet bestaan. In mijn nederige opinie zorgt die destruct daarvoor...

Hier op tweakers is niets te vinden. Zelfs php.net doet hier geen uitspraken over (class-beschrijving is niet zo uitgebreid).

Nu heb ik een andere oplossing en dat is een ok variabele in de class op true of false zetten en die controle aan het begin dan alsvolgt:
PHP:
1
2
if (!$obj_blaat->ok)
    // redirect to other page

Maar eigenlijk wil ik gewoon dat dat hele object gedestruct wordt. De vraag is dus: hoe kan ik ervoor zorgen dat dat object gedestruct wordt, vanuit de class zelf?

taste and see that the Lord is good


Acties:
  • 0 Henk 'm!

Verwijderd

De __destructor() zelf verwijdert het object niet uit je geheugen, maar word enkel uitgevoerd als het object is getrashed door PHP's garbage collector.

delete $object; is het commando om je object te verwijderen.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op woensdag 22 december 2004 @ 10:44:
De __destructor() zelf verwijdert het object niet uit je geheugen, maar word enkel uitgevoerd als het object is getrashed door PHP's garbage collector.

delete $object; is het commando om je object te verwijderen.
delete bestaat niet in php. daarvoor moet je unset($object) gebruiken.

Verder is het erg smerig om de condities voor het wel of niet legaal bestaan van een object in de class zelf te zetten. Maak dan een factory die dat voor je regeld.

[ Voor 25% gewijzigd door Michali op 22-12-2004 10:51 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 19-09 17:00
Zowiezo: Waarom wil je een object in het object zelf destructen? Dat is vrij raar. Je kan beter false oid retourneren en daarmee een actie uitvoeren. Wat je ook kan doen, is een class maken die deze class aanroept en ook extra acties uitvoert zodra er false geretourneerd wordt.

Volgens mij is dat de refactoring manier die Michali aanroept

[ Voor 27% gewijzigd door FlowinG op 22-12-2004 10:53 ]


Acties:
  • 0 Henk 'm!

Verwijderd

delete bestaat niet in php. daarvoor moet je unset($object) gebruiken.
Mmmm, stuur jij een mailtje naar ZEND of ik? Dat hun handleiding niet klopt....

Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

delete is geen commando maar een alias van de methode unset.
Dus ja de handleiding klopt wel :)

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op woensdag 22 december 2004 @ 10:53:
[...]


Mmmm, stuur jij een mailtje naar ZEND of ik? Dat hun handleiding niet klopt....
De handleiding wordt niet door zend bijgehouden. Dat is een apart team. Verder zie ik dat ze wel plannen hebben voor een delete functie:

http://nl3.php.net/delete

Deze wordt echter aangeroepen als functie en niet op de C++ manier. Hij is op dit moment nog niet beschikbaar en wordt blijkbaar een functie voor het deleten van een bestand. Geen objecten dus.

Edit:

Nu ik nog eens goed lees zie ik dat de functie echt niet bestaat:
This is a dummy manual entry to satisfy those people who are looking for unlink() or unset() in the wrong place.

[ Voor 16% gewijzigd door Michali op 22-12-2004 10:59 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • erkje
  • Registratie: Oktober 2001
  • Laatst online: 12-06-2024
In principe niet relevant waarom ik het überhaupt wil, maar ik zal het even uitleggen:

ik heb een stuk of 7 pagina's die alle 7 aan het begin een object aanmaken om alle gegevens over hetzelfde te weten te komen (op alle pagina's is de informatie nodig). Binnen dit object worden queries uitgevoerd en deze wil ik (uiteraard) graag 1x maken en niet 7x.
Dus ik maak een nieuw object ($obj = new Blaat($id)) en geef dus het id mee om vervolgens in de class te controleren of dat een geldig id is.

Als dat geen geldig id is, hoef ik die hele class niet meer en wil ik dat ik geen object heb. Vervolgens wil ik dan graag zoiets als:
PHP:
1
2
3
4
$obj = new Blaat($id);

if (!$obj)
    // redirect


@mdekuijper
delete $bla; is meer iets voor C

[ Voor 5% gewijzigd door erkje op 22-12-2004 11:01 ]

taste and see that the Lord is good


Acties:
  • 0 Henk 'm!

Verwijderd

De handleiding wordt niet door zend bijgehouden. Dat is een apart team. Verder zie ik dat ze wel plannen hebben voor een delete functie:
mmm, ok. Maar vreemd dan dat er meerdere handleidingen zijn. Want in een PDF bestand van Zend staat er wel degelijk een functie delete. Na ja, das dus geen oplossing voor het probleem van erkje :|

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Tsja, zet dan een flag binnen de class en haal die op. Om daarna te controleren of de class is verwijderd door zichzelf is smerig om verschillende redenen. Ten eerste geef je informatie weg over wat er in de constructor gebeurt. Verder is het binnen de client code zeer onduidelijk wat er nou gebeurt.
PHP:
1
2
3
4
$validator = new Validator();

if ( $validator->isValid($id) )
  // doe je ding

Kijk dat is al heel wat netter.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Of:

PHP:
1
2
3
4
5
6
7
8
9
10
function CreateBlaat($id) {
  if (isValidId($id))
    return new Blaat($id);
  else
    return false;
}

if ($obj = CreateBlaat($id) !== false) {
  // Pagina code ...
}


Naast dat het niet netjes is, kan een object zichzelf simpelweg niet verwijderen, en de destructor aanroepen is niet hetzelfde. Je hebt dus de keuze tussen (a) zorgen dat het object niet aangemaakt wordt (middels een factory functie zoals hierboven, of een factory klasse zoals gesuggereerd door Michali), of (b) een vlag op de klasse definiëren die aangeeft of het om een geldig geïnstantieerd object gaat, en aan de hand daarvan case analysis doen (ook gesuggereerd door Michali, goed bezig! ;)).

In mijn voorbeeldcode is isValidId dus een plaatshouder voor de logica die bepaalt wanneer een klasse geldig is. Als je alle logica bij elkaar wilt houden kun je van CreateBlaat()[2] en isValidId() class methods[1] van Blaat maken; alle logica staat dan in de klasse Blaat. Dan komt het er zo uit te zien:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Blaat {
  ...

  static function isValidId($id) {
    return /* ... */;
  }

  static function Create($id) {
    if (Blaat::isValidId($id))  // Iemand beter bekend met PHP5: is expliciete scoping hier nodig?
      return new Blaat($id);
    else
      return false;
  }
}

if ($obj = Blaat::Create($id) !== false) {
  // Pagina code ...
}


offtopic:
(Ik vraag me nu wel af wat unset($this) doet in PHP :p ; maar dat is natuurlijk helemaal een kwestie van scoping en variabele binding in de implementatie)



[1] Bij Java en C++ en PHP5 programmeurs misschien beter bekend onder de naam `static methods'.
[2] Als de methode een class method is van de klasse Blaat, dan is CreateBlaat een beetje onnodig uitgebreid; ik zal hem dus gewoon Create noemen.

[ Voor 107% gewijzigd door Verwijderd op 22-12-2004 11:18 ]


Acties:
  • 0 Henk 'm!

  • erkje
  • Registratie: Oktober 2001
  • Laatst online: 12-06-2024
Om op het idee van OneOfBorg door te gaan. Zou een static function niet mooier zijn dan?
(unset heb ik geprobeerd, maar heeft hetzelfde effect. Object blijft bestaan)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class Blaat {
    function __construct($id) {
    }

    static function valid_id($id) {
        // controle
    }
}

if (Blaat::valid_id($id)) {
    $obj = new Blaat($id);
}

[ Voor 3% gewijzigd door erkje op 22-12-2004 11:09 ]

taste and see that the Lord is good


Acties:
  • 0 Henk 'm!

Verwijderd

erkje schreef op woensdag 22 december 2004 @ 11:09:
Om op het idee van OneOfBorg door te gaan. Zou een static function niet mooier zijn dan?
Heh, ja dat bedacht ik me ook na het posten. Ik heb mijn post dus aangepast :).

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP 5 kent het static keyword wel. Merkwaardig genoeg is deze niet nodig om een functie statisch aan te roepen. Zelfs $this is te gebruiken binnen een niet statische functie die statisch aangeroepen is. Deze verwijst dan naar het object die de functie heeft aangeroepen (leverde erg vreemde situaties op bij mij laatst). Dit lijkt wel een bug te zijn oid, erg vreemd als ze het zo bedoeld hebben.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • erkje
  • Registratie: Oktober 2001
  • Laatst online: 12-06-2024
Hele mooie oplossing zo :D
en het werkt perfect.
* erkje is helemaal blij

Dit is toch een 'design pattern'? Hoe heet die? Ik zag OneOfBorg het over factory hebben. Is dit de Factory-Pattern? (kan ik dat mooi in mijn afstudeerverslag opnemen :P)

[ Voor 8% gewijzigd door erkje op 22-12-2004 11:39 ]

taste and see that the Lord is good


Acties:
  • 0 Henk 'm!

  • ikke007
  • Registratie: Juni 2001
  • Laatst online: 18-09 14:10
patterns zijn wel termen die onderbouwd moeten worden

bijvoorbeeld een goed boek erover is van Larman - Applying UML and Patterns (ISBN: 0130925691)

verder kun je eens neuzen op websites zoals http://www.patterndigest.com/

Lets remove all security labels and let the problem of stupidity solve itself


Acties:
  • 0 Henk 'm!

  • erkje
  • Registratie: Oktober 2001
  • Laatst online: 12-06-2024
Uiteraard. Ik heb vorig jaar een module gevolgd over Software Architectuur en dat ging ook over design patterns. Alleen weet ik daar nu niet zo heel veel meer van.
Ik heb ook wel een boek waarin ik het zou kunnen nazoeken, maar dat ligt natuurlijk thuis... :|

taste and see that the Lord is good


Acties:
  • 0 Henk 'm!

Verwijderd

Patroon Class Factory lijkt me leuk om toe te passen. Dit biedt de mogelijkheid om afhankelijk van de situatie een ander type object aan te maken. Ook is het mogelijk een NULL object terug te geven en da's wat TS nu net wilde.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Wil je echt met design patterns beginnen, dan raad ik Design Patterns Explained erg aan. Dit is een zeer goede introductie voor OO princiepes en Design Patterns.

Noushka's Magnificent Dream | Unity

Pagina: 1