[php] member variabel wordt static na return van functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik heb in PHP een probleem met een member variabel in een class, die static wordt nadat daar een statische variabel aan toe wordt gewezen via een return uit een functie.

Is er een manier om te zorgen dat een variabel niet statisch wordt na zo'n toewijzing? Ik heb geprobeerd te zoeken naar een functie die een kopie maakt van een variabel maar die heb ik ook niet kunnen vinden (ik zou ook niet weten waar die verder voor nodig zou zijn).

Het probleem wat ik heb kan ik denk ik het beste laten zien in een stukje code
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
32
33
34
35
<?php 

class test
{
    var $array;
    var $instance;

    function test($var)
    {
        $this->array = $this->dosome($var);
        $this->domore();
        
        var_dump($this);
    }
    
    function dosome($var)
    {
        static $result = array();
        $result[$var] = $var; 
        
        return $result;
    }
    
    function domore()
    {
        if ( in_array("client", $this->array) )
        {   
            $this->instance = new test("function");
        }
    }
}

$t1 = new test("client");

?>


Als ik dit uitvoer gaat het mis door een euwige loop. Ik reken erop dat variabel array geen client meer bevat als er een instantie van de class in domore() wordt gemaakt. Omdat die statisch is, is dat wel zo.

Als iemand nog een snellere oplossing weet dan wil ik dat graag ook horen.

(dit is niet hoe ik het precies heb uitgewerkt in de werkelijke class, ik weet dat het er hier een beetje omslachtig uitziet)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Er zitten nogal wat gaten in je uitleg. Hoe kom je met voorbeeldcode zonder recursieve functies of lusconstructies in een oneindige lus terecht? Welke member variables gaat het om? Wat bedoel je met dat die static wordt en na het retourneren van welke functie (of bedoel je member function/method?) dan?

edit:
Ik heb de recursieve aanroep intussen gevonden: het gaat dus om de constructor en domore die elkaar recursief aanroepen. Het probleem is dat $result in domore static is, dus zodra je er een entry in hebt gemaakt met als key en value "client" dan blijf je altijd een array returnen waar die value in voorkomt (je voegt er immers uitsluitend andere elementen aan toe).

Waarom heb je die $result dan ook static gemaakt? Wat wil je ueberhaupt bereiken met deze constructie? Kun je die hele $result niet gewoon lokaal maken (static keyword weghalen, dus)? Want uit je omschrijving leid ik af dat je elke keer een nieuwe array wilt maken.

[ Voor 57% gewijzigd door Soultaker op 06-10-2003 11:38 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Hij is nu static omdat ik in de functie waar ik een soortgelijke constructie gebruik, een recursieve call doet en elementen toevoegt aan $result. Ik heb het inmiddels anders opgelost.

In plaats van een static variable in de functie, laat ik de doe ik een array_merge met $result en de gereturnde array. (hoewel minder snel (verschil zal wel niet meetbaar zijn), het werkt)

Ik ben verder wel benieuwd of dit op andere manier is op te lossen. Ik kan het ook wel zo oplossen maar het lijkt mij niet de bedoeling dat de member $array ineens static wordt omdat er een static variabel aan toe wordt gewezen.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Michali schreef op 06 October 2003 @ 12:08:
Ik ben verder wel benieuwd of dit op andere manier is op te lossen.
Je kunt lokaal een nieuwe array aanmaken en die by-reference doorgeven in een recursieve call, waardoor de functie er elementen aan kan toevoegen. Als (simpelere) variate daarop kun je ook de array gewoon by-value meegeven en de return value van de functie gebruiken om de bijgewerkte array op te leveren. Die tweede constructie is natuurlijk wat minder efficient.
Ik kan het ook wel zo oplossen maar het lijkt mij niet de bedoeling dat de member $array ineens static wordt omdat er een static variabel aan toe wordt gewezen.
Dat gebeurt ook helemaal niet. Waarom denk je dat?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dat denk ik omdat in de $instance instantie van de class de waarde 'client' uit $array kan lezen, terwijl er daar alleen de waarde 'function' in zou moeten staan. Dat komt volgens mij omdat $array static is (geworden?). Als ik het keyword static voor $result weg haal dan is $array niet static meer.

$instance wordt nu in elke instantie van test opnieuw een nieuwe instantie, die eeuwige loop dus.

De manier die je noemde lijkt me ook wel effectief, met die reference. Ik denk dat ik die ga gebruiken.

[ Voor 14% gewijzigd door Michali op 06-10-2003 12:59 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Michali schreef op 06 October 2003 @ 12:58:
Dat denk ik omdat in de $instance instantie van de class de waarde 'client' uit $array kan lezen, terwijl er daar alleen de waarde 'function' in zou moeten staan. Dat komt volgens mij omdat $array static is (geworden?). Als ik het keyword static voor $result weg haal dan is $array niet static meer.
Volgens mij komt het doordat je de (static) $result vol stopt en de inhoud daarvan daarna aan $array toekent. Het attribuut wordt zelf dus niet static, maar inderdaad ontstaan de problemen doordat je de inhoud van de static local variable $result er aan toekent.

Het $array-attribuut van het eerste object dat je maakt zou volgens mij dus alleen 'client' moeten bevatten; ik denk dat je dat ook te zien krijg als je die var_dump voor de aanroep van domore zet (omdat je er op deze manier nooit komt; je krijg met het uitvoeren van domore immers oneindige recursie).

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dat begrijp ik ook allemaal wel. Maar is er dan een mogelijkheid om een static variabel aan een member toe te kennen zonder dat ik dan in deze problemen kom? Dat was eigenlijk de vraag een beetje. In princiepe heb ik het niet meer nodig door een andere oplossing voor dit probleem maar stel dat ik het in de toekomst wel nodig heb dan is het altijd handig om zoiets te weten. En ik ben ook erg nieuwsgierig naar de werking van dit soort dingen.

Noushka's Magnificent Dream | Unity

Pagina: 1