[PHP] "Warning: Problem with method call"

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Bij het implementeren van een OO website in php stuit ik op de volgende error:

code:
1
Warning: Problem with method call - please report this bug in \user.php on line 78


In deze betreffende regel roep ik een statische methode uit een andere klasse aan, te weten:
code:
1
      stats::incrementStats("logins");


Heeft iemand een idee waardoor deze error veroorzaakt wordt? De methode wordt namelijk wel goed aangeroepen. En ik vind een oplossing duizend maal mooier dan het onderdrukken van de error.

Op google kan ik niets nuttigs vinden over deze error.

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Geef het stukje code eens waar je de methode aanroept.

Het is volgens mij een bug in PHP (of je doet iets wat eigenlijk niet mag, maar dan is het eigenlijk nog steeds een bug als PHP op deze manier reageert). Er is wel het een en ander over te vinden (probeer ook de Google Groups).

Acties:
  • 0 Henk 'm!

Verwijderd

Ik denk dat het dit is:
PHP:
1
stats->incrementStats("logins");

Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  function login($username, $password) {
    if (!$this->database) {
      $this->database = new database();
    }
    $user = $this->database->loginUser($username, $password);
    // check if a user have been returned
    if ($user) {
      // apparently the credentials were correct, a user has been returned
      stats::incrementStats("logins");
      $user->updateStats();
      $_SESSION['id'] = $user->getUserID();
      return $user;
    }
    return null;
  }


vreemde is dat als ik de statische aanroep van incrementStats in updateStats van de userklasse zet, dat het dan wel werkt. Terwijl ik alleen de aanroep alleen naar een andere methode binnen dezelfde klasse verplaats :S

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Gebruik je ergens in je code misschien een variabele met de naam $this (buiten een class definition)?

[edit]
Ik kan hem namelijk reproduceren met het volgende stukje code:
PHP:
1
2
3
4
5
6
7
8
9
class EenTest {
    function staticTest() {
        echo 'staticTest() aangeroepen';
    }
}

$this = 'zo maar iets';

EenTest::staticTest();

Output:
Warning: Problem with method call - please report this bug in ###.php on line 11
staticTest() aangeroepen
Terwijl dit stukje code geen error geeft:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

class EenTest {
    function staticTest() {
        echo 'staticTest() aangeroepen';
    }
}

$that = 'zo maar iets';

EenTest::staticTest();

?>

Output:
staticTest() aangeroepen
Het vreemde hieraan is dat volgens de docs '$this' helemaal niet gereserveerd is.

[ Voor 85% gewijzigd door tomato op 16-02-2003 22:29 ]


Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
ik gebruik geen $this buiten class definitions. Daarbinnen uiteraard wel, bij de statische methodes op deze manier:
code:
1
2
3
4
5
6
  function incrementStats($type) {
    if (!$this->database) {
      $this->database = new database();
    }
    return $this->database->incrementStats($type);
  }


Dit lijkt mij de correcte manier en het werkt ook naar behoren (bij het voorgaande testen).

bovendien moet ik stats::incrementStats("logins"); gebruiken omdat het een statische methode is. Als ik echter een (fake) instantie van stats maak en de methode dynamisch aanroep werkt het wel. Maar ik heb liever een goede oplossing dan zo'n workaround.

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
narotic schreef op 16 February 2003 @ 21:59:
ik gebruik geen $this buiten class definitions. Daarbinnen uiteraard wel, bij de statische methodes op deze manier:
code:
1
2
3
4
5
6
  function incrementStats($type) {
    if (!$this->database) {
      $this->database = new database();
    }
    return $this->database->incrementStats($type);
  }
Ah, heb je goed door wat een statische methode eigenlijk is? En wat denk je dat het inhoudt als je '$this' probeert te gebruiken in een statische methode?

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
narotic schreef op 16 February 2003 @ 21:59:
ik gebruik geen $this buiten class definitions. Daarbinnen uiteraard wel, bij de statische methodes op deze manier:
code:
1
2
3
4
5
6
  function incrementStats($type) {
    if (!$this->database) {
      $this->database = new database();
    }
    return $this->database->incrementStats($type);
  }
Ik denk dat ik door heb waar het door komt. Je maakt in je statische methode een variabele met de naam '$this' en dat komt op hetzelfde neer als wat ik in de code boven doe.

Ik vind dit een bug in PHP, als dit niet kan dan zou '$this' reserved moeten zijn.

Daarnaast is jouw probleem eigenlijk niet deze 'bug', maar doordat je iets anders verkeerd doet in een statische methode loop je er toch tegenaan ;)

Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Ja, ik weet wat een statische methode is. Ik moet eerlijk zeggen dat ik vind dat php hier wel stricter mee om zou mogen gaan. Ook polymorphisme (2 methodes met verschillende (aantal) attributen wat je meegeeft is bv. niet mogelijk) is niet echt optimaal.

Ik heb $this op veel plaatsen zo gebruikt (vele methodes, zodat ik ze zowel statisch als dynamisch aan kan roepen, dus checkt hij of er een instantie van de database klasse is, die normaal gesproken in de constructor gemaakt zou worden). tot nu toe heeft dat overal gewerkt.

Bovendien, zoals eerder gezegd, werkt alles bugfree als ik de methode aanroep verplaats naar updateStats in de user klasse.

Wat ik uit het hierboven beschrevene begrepen heb zou dit goed moeten werken:

code:
1
2
3
4
5
6
7
  function incrementStats($type) {
    //if (!$this->database) {
      $database = new database();
      return $database->incrementStats($type);
    //}
    //return $this->database->incrementStats($type);
  }


Helaas geeft dit nog steeds dezelfde error.

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Voor de liefhebbers, de fout heb ik er inmiddels uit weten te halen. Ik heb overal uit de statische methodes $this weggehaald. (wat concretere informatie over het gebruik van $this zou inderdaad welkom zijn!).

Het probleem leek dat ik vanuit een statische methode een andere statische methode aanriep, in beide stond $this. Als die weggehaald worden werkt het wel.

- = Step Into The Pit | Industrial Strength = -

Pagina: 1