[PHP] Array wordt niet gevuld (errorhandling)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sn0rkel
  • Registratie: Februari 2003
  • Laatst online: 25-06 20:45
Hoi, ik zit met het volgende: een klasse maakt gebruik van een array waarin alle gevonden error's horen te komen. De init-functie stelt de errorhandler in, maar na trigger_error() blijkt de array met gevonden errors niets te bevatten... als er dan nog een trigger_error wordt gegeven en ik print de array vanuit de handler dan blijkt de array toch dingen te bevatten.

Ik vermoed daarom dat er twee versies van het object zijn oid, hoewel ik toch echt een reference gebruik, kan ik het haast niet anders verklaren. De vraag is: waarom??

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
<?
$myObject = new myClass();
$myObject->errorReport();

class myClass
{
    var $error;

    function myClass()
    {
        error_reporting(0);
        set_error_handler( array( &$this, 'myErrorHandler' ) ); 
    }

    function myErrorHandler($errno, $errstr, $errfile, $errline)
    {
        $this->error[] = 'errordata';

        // dit print de hele lijst met errors, ook eerder doorgegeven errors
        print_r($this->error);
    }

    function errorReport()
    {
        // dit zou moeten vullen
        trigger_error('er gaat iets mis', E_USER_ERROR);
        trigger_error('er gaat nog iets mis', E_USER_ERROR);

         // maar dit print een lege array
        print '<Br><br><b>Komtie dan he:</b>';
        print_r($this->error);
    }
}
?>

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom maak je er geen singleton van?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Sn0rkel
  • Registratie: Februari 2003
  • Laatst online: 25-06 20:45
Een singleton is toch juist om zeker te maken dat je van buitenaf telkens hetzelfde object benaderd? Ik maak nu toch maar op een plek het object aan, het gekke is dat het lijkt alsof de error_handler die getriggered wordt niet die is van het object, terwijl ik &$this meegeef. Jouw suggestie is dus om &$this te vervangen door een getMyClassObject() die dus vlgns. Singleton een referentie aan zichzelf oplevert? Dit is toch exact hetzelfde?

Acties:
  • 0 Henk 'm!

  • Sn0rkel
  • Registratie: Februari 2003
  • Laatst online: 25-06 20:45
Wat nu blijkt is dat als ik $myObject &= new myClass() gebruik dat het dan wel werkt. Wat is hier nou precies het verschil dat het dan ineens wel werkt?

Acties:
  • 0 Henk 'm!

Verwijderd

var $error;

moet worden

var $error = array();

Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Je maakt gebruik van PHP4, om fatsoenlijk met classen te werken moet je werken met de zogenaamde references. Als je daar even mee gewerkt hebt in combinatie met classen in PHP4 kom je er al snel achter dat het behoorlijk veel werk opleverd.

Dit komt door de technische implementatie, er worden in PHP4 kopien van gemaakt als je een object aan een variabele signed. (Pass by value, en pass by reference: over het hoe en wat is op php.net genoeg te vinden.)

Terwijl het handiger is natuurlijk om de PHP-engine hetzelf te laten doen (pass-by-reference). Dat hebben ze dus gedaan voor PHP5. Daar hoef je dus niet met die &tjes te werken, omdat PHP dat vanzelf al voor jouw doet.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Sn0rkel schreef op donderdag 08 december 2005 @ 16:57:
Wat nu blijkt is dat als ik $myObject &= new myClass() gebruik dat het dan wel werkt. Wat is hier nou precies het verschil dat het dan ineens wel werkt?
Tja, php. Analyseren we de volgende code:

$myObject = new myClass()

Met new myClass() wordt een nieuwe class aangemaakt. Vervolgens wordt met = een kopie van deze class gemaakt en toegekend aan $myObject.

Door &= te gebruiken wordt er geen kopie gemaakt maar zullen de variabelen naar dezelfde waarde refereren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Sn0rkel
  • Registratie: Februari 2003
  • Laatst online: 25-06 20:45
Hardstikke bedankt allemaal, nog even een kleine reactie...

dverkade, dat werkt niet omdat je een arrayproperty van een object niet direct kan initialiseren, vandaar dat dit al in een init-functie gebeurt (hier even buiten beschouwing).

PHP4 en classes is zowieso een crime inderdaad, veel standaardregels voor OOP komt pas netjes terug in PHP5, maar PHP4 ondersteuning moet je nu eenmaal nog wel een tijdje aanhouden denk ik. Waar uiteindelijk mijn denkfout lag is dus dat zelfs $myObject blijkbaar een andere versie van het object wordt tov de new myClass(). Nuttig voor in het vervolg om te onthouden :)

Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 20-09 22:51
Is dat je hele myErrorHandler? Je vult namelijk nergens je array, ja je lijkt er 'errordata' in te zetten (het lijkt mij een vreemde assignment, maar ik ken geen PHP).

Je moet nog ergens iets als "error[pos] = errstr" tussenzetten, je doet nu niets met die variabelen die je doorgeeft.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Sn0rkel schreef op donderdag 08 december 2005 @ 19:47:
dverkade, dat werkt niet omdat je een arrayproperty van een object niet direct kan initialiseren, vandaar dat dit al in een init-functie gebeurt (hier even buiten beschouwing).
Enigzins offtopic, maar dat kan dus wel. Zolang je constante data gebruikt kun je prima properties initialiseren in PHP4.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class foo {
   var $string = 'string';
   var $array = array ('foo','bar');

   function foo() {
      echo $this->string;
      echo $this->array[0];
   }
}

new foo();
//prints "stringfoo"

Wat je niet kunt is variabelen gebruiken tijdens het initialiseren
PHP:
1
2
3
4
5
6
class bar {
   var $foo = 4;
   var $bar = 2 * $this->foo;
}
new bar();
//results in error


offtopic:
De code higlighter bugt op $this->array ...

Regeren is vooruitschuiven

Pagina: 1