login  Naam:   Wachtwoord: 
Registreer je!
 Forum

FATAL ERROR:

Offline RonsterS - 31/12/2007 13:36 (laatste wijziging 31/12/2007 13:38)
Avatar van RonsterSNieuw lid HOi,

Ik heb een class die error moet gaan afhandelen, met volgende code

  1. class MyMessages
  2. {
  3.  
  4. public $messages;
  5.  
  6. public function __construct()
  7. {
  8. $this->messages = array();
  9. }
  10.  
  11. public function addMessage($message)
  12. {
  13. $this->messages[] = array("message" => $message);
  14. }
  15.  
  16. public function hasMessages()
  17. {
  18. return (count($this->messages) > 0);
  19. }
  20.  
  21. public function getMessages()
  22. {
  23. return $this->messages;
  24. }
  25. }


Nu krijg ik echter de volgende error

Fatal error: Using $this when not in object context in C:\xampp\htdocs\reloaded\mymessages.class.php on line 19

dit is lijn 19 $sHasMessage = MyMessages::hasMessages();

Wat houdt de foutmelding in en fout doe ik fout

13 antwoorden

Gesponsorde links
Offline Wim - 31/12/2007 13:37 (laatste wijziging 31/12/2007 13:39)
Avatar van Wim Crew algemeen geef je ganse script eens

//edit:
je roept die functie uit de classe aan, maar je hebt nog geen instantie van die classe gecreerd -> geen $this object (zeker niet voor waardes, gezien $this de HUIDIGE instantie is).

Maak eerst een nieuw object aan dmv "new", en gebruik overal dat object:
$obj = new class();
$obj->functie();
$obj->var = 'value';
Offline fluaju - 31/12/2007 13:38
Avatar van fluaju IRC nerd yeah, lijkt me ook. Je geeft een stuk code, maar de fout zit ergens anders?  
Offline avdg - 31/12/2007 13:39 (laatste wijziging 31/12/2007 13:39)
Avatar van avdg PHP gevorderde kun je ook de regels ervoor geven: dat maakt ons makkelijker om te volgen  

Edit: oei, er was al reactie 
Offline RonsterS - 31/12/2007 13:39 (laatste wijziging 31/12/2007 13:40)
Avatar van RonsterS Nieuw lid
  1. include_once("includes/base.inc.php");
  2. include_once(WEBSITE_URI ."/classes/calendar.class.php");
  3. $sAction = MyUtils::param("command"); // what do we want to show
  4. $sYear = (MyUtils::param("year") == "" ? date("Y") : MyUtils::param("year"));
  5. $sMonth = (MyUtils::param("month") == "" ? date("m") : MyUtils::param("month"));
  6. $oCalendar = new Calender($sYear, $sMonth);
  7. $sDate = MyUtils::param("date");
  8. $sHasMessage = MyMessages::hasMessages();
  9. switch ($sAction)
  10. {
  11. case "GETDATE":
  12. if(isset($sDate) && $sDate != "")
  13. {
  14. $oTPL->assign("template", "pages/calendar/schedule.tpl");
  15. $oTPL->assign("aSchedule", $oCalendar->loadschedule(MyUtils::param("date")));
  16. }
  17. else
  18. {
  19. $oTPL->assign("template", "pages/calendar/schedule.tpl");
  20.  
  21.  
  22. if($sHasMessage)
  23. {
  24. foreach(MyMessages::getMessages() as $sValue)
  25. {
  26.  
  27. $oTPL->assign("sError", $sValue['message']);
  28. }
  29. }
  30. }
  31.  
  32. break;
  33. default:
  34. $oTPL->assign("template", "pages/calendar/calendar.tpl");
  35. $oTPL->assign("getCal", $oCalendar->getMonthView(2));
  36. }
  37. $oTPL->display("basetemplate.tpl");


dit is de pagina waarop de boel wil hebbe zegmaar.
en dan heb ik nog een apparte pagina waar ik

  1. $oMyMessages = new MyMessages();

aanroep

Ik gebruik zegmaar een base pagina die eigenlijk alle classes die de pagina altij nodig heeft aaanroept..
Offline Wim - 31/12/2007 13:44
Avatar van Wim Crew algemeen gebruik eens overal $oMyMessages-> ipv MyMessages::
Offline timo - 31/12/2007 13:50
Avatar van timo PHP ver gevorderde classNaam::functie() zal niet werken als je met de $this variabel werkt voor zover ik weet, maak gewoon een object aan en gebruik dat, aangezien $this = new classNaam
Offline Wim - 31/12/2007 13:52
Avatar van Wim Crew algemeen
timo schreef:
classNaam::functie() zal niet werken als je met de $this variabel werkt voor zover ik weet, maak gewoon een object aan en gebruik dat, aangezien $this = new classNaam


dat laatste is dus compleet niet waar. Als je zoiets zou doen dan bekom je een instantie binnen een instantie van die classe (wat soms overigens wel nuttig kan zijn). Had je trouwens reply #1 gelezen had je hetzelfde antwoord gehad als dat je zelf nu geeft :/
Offline timo - 01/01/2008 10:45
Avatar van timo PHP ver gevorderde
wimmarien schreef:
[..quote..]

dat laatste is dus compleet niet waar. Als je zoiets zou doen dan bekom je een instantie binnen een instantie van die classe (wat soms overigens wel nuttig kan zijn). Had je trouwens reply #1 gelezen had je hetzelfde antwoord gehad als dat je zelf nu geeft :/

wel toch , als ik doe:
$blaat = new Blaat;
dan is $blaat de externe versie van wat je binnen de class als $this gebruikt, want $this->foo is $blaat->foo, hangt natuurlijk nu af van private, protected en public, en binnen de class kan je niet $blaat gebruiken, maar zo werkt het wel..
Offline Wim - 01/01/2008 14:08
Avatar van Wim Crew algemeen jij zei in je vorige post dat $this een nieuwe instantie van hetzelfde object was, maar dat is niet. $this is gewoon de huidige instantie waar je in bezig bent
Offline Vincjenzo - 02/01/2008 12:30 (laatste wijziging 02/01/2008 12:38)
Avatar van Vincjenzo Nieuw lid Volgens mij probeer je this-> te gebruiken terwijl je de methode statisch aanroept.

Je zal het dus iets moeten veranderen.

  1. <?php error_reporting(E_ALL); ?>
  2. <?php
  3. class MyMessages
  4. {
  5. public $messages;
  6.  
  7. public function __construct()
  8. {
  9. $this->messages = array();
  10. }
  11.  
  12. public function addMessage($message)
  13. {
  14. $this->messages[] = array("message" => $message);
  15. }
  16.  
  17. public function hasMessages()
  18. {
  19. return (count($this->messages) > 0);
  20. }
  21.  
  22. public function getMessages()
  23. {
  24. return $this->messages;
  25. }
  26. }
  27. ?>
  28.  
  29. <?php
  30. $messages_o = new MyMessages();
  31.  
  32. // Are there messages?
  33. var_dump($messages_o->hasMessages());
  34.  
  35. // Add a message
  36. $messages_o->addMessage('test');
  37.  
  38. // Are there messages now?
  39. var_dump($messages_o->hasMessages());
  40.  
  41. // Dump all messages
  42. var_dump($messages_o->getMessages());
  43. ?>
Offline Rik - 02/01/2008 12:36
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Wat Vincjenzo zegt klopt: als je een class statisch aanroept maak je geen instantie van de class en kan je dus geen $this gebruiken.

Wat je wel kunt doen is je class statisch maken. Dan zet je static in plaats van public voor $messages en maak je verder overal van $this->messages self::$messages.
Offline Stijn - 02/01/2008 15:10
Avatar van Stijn PHP expert
Citaat:
Using $this when not in object context
Jij roept de functie hasMessages op alsof het static is. Static wordt niet gebruikt als die methode gebruik maakt van de eigenschappen van de class.

Je kan je eigenschappen static maken, maar dat is een onhandige keuze omdat die eigenschappen niet lang static blijven. Wat je wel als static kan beschouwen zijn class constantes.

Static kan je gebruiken wanneer je methodes maakt voor je class die niet gebruikt maakt van de class eigenschappen.
Offline Rik - 02/01/2008 21:47 (laatste wijziging 02/01/2008 21:48)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
stijn1989 schreef:
Je kan je eigenschappen static maken, maar dat is een onhandige keuze omdat die eigenschappen niet lang static blijven. Wat je wel als static kan beschouwen zijn class constantes.

Volgens mij klopt het niet helemaal wat je zegt, en ik heb nog wat aan te vullen.

De waarde van zo'n eigenschap wordt door php onthouden als je hem static gebruikt. Als je een instantie van de class maakt kan je de statische waarden niet gebruiken. Dat is ook logisch want een instantie maak je juist om een uniek object aan te maken:
  1. class mijnClass {
  2. static $eigenschap = 'waarde';
  3. }
  4. $o = new mijnClass;
  5. $o->eigenschap = 'nieuwe waarde';
  6. echo mijnClass::$eigenschap;

Zal dan ook 'waarde' echoën. Je kan wel zoiets doen om toch die nieuwe waarde te laten onthouden:
  1. class mijnClass {
  2. static $eigenschap = 'waarde';
  3. public function verander($waarde) {
  4. self::$eigenschap = $waarde;
  5. }
  6. }
  7. $o = new mijnClass;
  8. $o->verander('nieuwe waarde');
  9. echo mijnClass::$eigenschap;
Dat geeft wel 'nieuwe waarde terug'.

Een constante kan niet veranderen en is dus sowieso statisch maar een static kan wel veranderen en is dus geen constante. Een constante kan je alleen op de statisch manier oproepen.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.231s