Toon posts:

[PHP] __destruct te vroeg aangeroepen

Pagina: 1
Acties:

Onderwerpen


  • cyberstalker
  • Registratie: september 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik heb een vervelend probleem met PHP5.3.6. De destructor van sommige objecten wordt aangeroepen voordat de laatste call naar het object is gemaakt. Dit gebeurt in een database klasse die ik heb.

Een korte beschrijving:

• Object wordt geconstrueerd
• Queries worden gedraaid
• __destruct wordt aangeroepen (welke weer $this->close() aanroept)
• Queries worden gedraaid, die uiteraard falen.

Dit probleem treedt op omdat ik met objecten werk die gewijzigde properties opslaan bij het destructen. Dit om onnodige queries te voorkomen (meerdere gewijzigde properties kunnen in één query worden opgeslagen). In dit scenario wordt de destructor van de database eerder aangeroepen dan de destructor van objecten die nog dingen willen opslaan.

Hoe kan ik ervoor zorgen dat PHP de database klasse pas opruimt *nadat* alle andere objecten zjin opgeruimd?

Ik ontken het bestaan van IE.


  • cyberstalker
  • Registratie: september 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
@mithras: Ja, het is een AR implementatie. Ik had gehoopt dat PHP wel zo slim zou zijn om te zien dat het object de database connectie nog gebruikt in de destructor en dus eerst het object opruimt voordat de database connectie is opgeruimd.

@GlowMouse: dat lijkt inderdaad een goede oplossing. Ik denk dat ik dan het beste alle records track in een static variabele en alle bekende records update bij het afsluiten van het script.

Ik ontken het bestaan van IE.


  • cyberstalker
  • Registratie: september 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
frickY schreef op zaterdag 26 november 2011 @ 17:32:
[...]

Dat doet PHP ook, en het Database-object dat je nodig hebt zal ook nog bestaan. Alleen de resource die dat object naar de database heeft is weg omdat die je die al closed in de destruct van een andere instantie van je Database. Athans, ik vermoed dat dit is wat er gebeurd.
Ik werk in mijn project met een enkel database object. Die houdt dus ook de connectie open totdat close() wordt aangeroepen (of de destructor, die ook close() aanroept).

Ik clone mijn connectie nergens, en gebruik dus overal dezelfde connectie, die door PHP wordt gedestruct.

Ik snap ook het sentiment dat save()n vanuit de __destruct()or misschien niet heel netjes is, maar het is wel handig, aangezien je nooit meer updates op een rij uitvoert dan nodig.

Ik ontken het bestaan van IE.


  • cyberstalker
  • Registratie: september 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Omdat ik de redenen om niet voor opslaan in de constructor te kiezen wel begrijp, maar ik het onhandig vind om op elke rij handmatig te save()n, heb ik het nu omgebouwd.

Alle rijen die worden geconstruct worden bijgehouden en er is één statische save() functie waarmee gelijk alle rijen kunnen worden opgeslagen. Hierbij is dus nog wel de mogelijkheid om een Exception te gooien en af te handelen, maar zonder het ongemak van losse save()s.

Bijkomend voordeel is dat er nu per bestaande rij maar één object instantie is.

Ik ontken het bestaan van IE.

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2022 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee