Avatar billede palito Nybegynder
07. december 2006 - 19:28 Der er 29 kommentarer

Kan sagtens udskrive, men gemmer ikke i array

Jeg har nedenstående kode, og den udskriver ganske fint (ved hjælp af min echo-linje). Men når jeg til sidst i mit dokument(ikke i klassen) vælger at skrive: "print_r($error->error)", så kommer der intet. Nogle der har en idé til hvorofr dette kan ske?

public function notify( $message, $level = 1 ) {
    echo "$message<br>";
    $this->error[] = array("message" => $message, "level" => $level);
}
Avatar billede palito Nybegynder
07. december 2006 - 19:30 #1
<?php
class Error {
    public $error = array();
   
    public function notify($message, $level = 1) {
        echo "$message<br>";
        $this->error[] = array("message" => $message, "level" => $level);
    }
   
    public function get_errors() {
        return "<pre>" . print_r($this->error, true) . "</pre>";
    }
}
?>
Avatar billede coderdk Praktikant
07. december 2006 - 19:31 #2
Jeg går ud fra at du i toppen af klassen har:

public $error;

? Altså:

class DinKlasse
{
  public $error;

?
Avatar billede coderdk Praktikant
07. december 2006 - 19:41 #3
print_r returnerer en boolsk værdi, du bruger return-parameteren forkert, nok fordi at dokumentationen er forkert:

    public function get_errors() {
        print_r( $this->error, $v );
        return "<pre>" . $v . "</pre>";
    }
Avatar billede palito Nybegynder
07. december 2006 - 19:44 #4
Ved godt jeg bruger funktionen forkert, men det virkede på den måde. Det var alligevel ikke min hensigt at bruge print_r når jeg endelig fik det til at virke, men ellers tak ;)

Det gør desværre ingen forskel.
Avatar billede erikjacobsen Ekspert
07. december 2006 - 19:56 #5
Du skal vel bare
        $this->error = array("message" => $message, "level" => $level);
Avatar billede palito Nybegynder
07. december 2006 - 20:02 #6
For det første, så hjælper det underligt nok heller ikke :S

Men der SKAL jo også stå $this->error[], da funktionen ikke kun bliver kørt igennem 1 gang. Der skal tilføjes nye pladser i mit array hver gang funktionen køres igennem.

Jeg forstår virkelig ikke hvad der er galt :S
Avatar billede erikjacobsen Ekspert
07. december 2006 - 20:05 #7
Ja, hvis du skal køre den flere gang, selvfølgelig. Men så virker det du har jo godt nok. Eksempel:

<?php
class Error {
    public $error = array();
 
    public function notify($message, $level = 1) {
        echo "$message<br>";
        $this->error[] = array("message" => $message, "level" => $level);
    }
 
    public function get_errors() {
        return "<pre>" . print_r($this->error, true) . "</pre>";
    }
}
$e = new Error();
$e->notify("hejsa");

print $e->get_errors();
?>
Avatar billede palito Nybegynder
07. december 2006 - 20:16 #8
Underligt :S Det virker slet ikke i mit system :S
Avatar billede erikjacobsen Ekspert
07. december 2006 - 20:17 #9
Hvad sker der hvis du tager min kode fra før, og intet andet?
Avatar billede palito Nybegynder
07. december 2006 - 20:19 #10
Så virker det helt fint. Hvor mærkeligt :S
Avatar billede palito Nybegynder
07. december 2006 - 20:21 #11
Sådan her ser mine filer ud mere eller mindre:

index.php:
<?php
include( "config.php" );

//...

$error->get_errors();
?>

__
config.php:
<?php
function __autoload( $className )
{
    require_once( "{$_SERVER['DOCUMENT_ROOT']}/library/class.{$className}.inc" );
}

// ...

$error = new Error();
?>

______________
kan slet ikke se hvad der kan være i vejen :S
Avatar billede erikjacobsen Ekspert
07. december 2006 - 20:22 #12
Egentlig ikke - kig lidt på de to scripts og find selv forskellen ;)
Avatar billede palito Nybegynder
07. december 2006 - 20:24 #13
Der er ingen forskel. Det eneste resultat jeg får er:

Array
(
)
Avatar billede erikjacobsen Ekspert
07. december 2006 - 20:27 #14
Nu er det jo ikke til at vide hvad du gør i den kode du ikke viser os, men den grundlæggende idé, som du kan se, er jo go' nok.
Avatar billede palito Nybegynder
08. december 2006 - 06:20 #15
Ahh. Har fundet fejlen. Jeg tilgår kun notify() igennem andre klasser, hvilke ser ud som nedenstående. Det kan den åbenbart ikke forstå at gemme i et array, når de kommer igennem en klasse på den måde, men fint nok hvis jeg fx. skriver: **$error->notify( "test" ); echo $error->getErrors();**. Hvordan skal det så gøres?

class MySQL extends Error {
function __construct($username, $password) {
  if(...) {
  $this->notify("der skete noget");
  }
}
}
Avatar billede erikjacobsen Ekspert
08. december 2006 - 08:40 #16
Hvis jeg forstår dig rigtigt skal du tilgå notify og get_errors gennem det objekt du opretter med new MySQL
Avatar billede palito Nybegynder
08. december 2006 - 11:04 #17
Det virker fint hvis jeg gør således:

class MySQL {
function __construct($username, $password) {
  global $error;

  if(...) {
  $error->notify("der skete noget");
  }
}
}

Men den "global" er irriterende. Kan det gøres på andre måder?
Avatar billede erikjacobsen Ekspert
08. december 2006 - 11:18 #18
Du bør kun har een instans af din klase MySql, og så bruger du den. I og med MySQL nedarver fra Error, så kan jeg ikke se nogen grund til at oprette et specielt Error-objekt.
Avatar billede palito Nybegynder
08. december 2006 - 17:21 #19
og hvordan ville du så ordne det?
Avatar billede erikjacobsen Ekspert
08. december 2006 - 17:30 #20
Hvis jeg ikke ser din kode, kan jeg ikke komme med bedre forslag end jeg allerede har gjort.
Avatar billede palito Nybegynder
08. december 2006 - 17:45 #21
**
class MySQL extends Error {
function __construct($username, $password) {
  if(...) {
  $this->notify("der skete noget");
  }
}
}
**

det kodestykke virker ikke. dette virker:

**
class MySQL {
function __construct($username, $password) {
  global $error;
  if(...) {
  $error->notify("der skete noget");
  }
}
}
**

Kan jeg få det til at virke ved at undgå brugen af "global"?
Avatar billede erikjacobsen Ekspert
08. december 2006 - 18:30 #22
Jamen jeg har jo fortalt dig, at jeg ikke ser nogen grund til at oprette et specielt error-objekt, når mysql nedarver fra Error. Så bruger du bare dit mysql-objekt, som du så kun skal have een af. (ca. det samme som jeg skrev 08/12-2006 11:18:09)
Avatar billede coderdk Praktikant
09. december 2006 - 16:02 #23
som erik skriver, fjern global $error; og lav:

$error->notify("der skete noget");

om til:

$this->notify("der skete noget");
Avatar billede palito Nybegynder
10. december 2006 - 19:46 #24
det er jo - som sagt - det der gør at den ikke gemmer i arrayet ordentligt.

DERFOR efterspørger jeg en anden måde at gøre det på!
Avatar billede erikjacobsen Ekspert
10. december 2006 - 19:53 #25
Måden er go' nok  -  bevist ved det lille eksempel fra før. Hvad du gør forkert kan jeg ikke vide, og jeg gider ikke gætte mere, når jeg ikke må se din kode. Længere er den vel ikke.
Avatar billede palito Nybegynder
11. december 2006 - 09:29 #26
erikjacobsen ->det er da overhovedet ikke bevist ved et eksempel. jeg synes jeg har gjort det klart nok, at jeg kørte min funktion i klassen Error igennem en ANDEN klasse.

Nedenstående kode virker jo heller ikke.

<?php
class Error {
    public $error = array();

    public function notify($message, $level = 1) {
        $this->error[] = array("message" => $message, "level" => $level);
    }

    public function get_errors() {
        return "<pre>" . print_r($this->error, true) . "</pre>";
    }
}

class NyKlasse extends Error {
    public function test( $i = 0 ) {
        if( $i < 5 )
        {
            $this->notify( "i er mindre end 5" );
        }
    }
}
$error = new Error();
$ny = new NyKlasse();

$error->notify("hejsa");
$ny->test(4);

print $error->get_errors();
?>
__
er ked af hvis jeg ikke har sagt det klart nok ;) det irriterer mig virkelig, at jeg ikke kan få det til at virke
Avatar billede coderdk Praktikant
11. december 2006 - 09:45 #27
Det virker da 100% efter hensigten. Vil du have de errors som NyKlasse har lavet skal du skrive:

print $ny->get_errors();

Ellers skal du give et error-objekt med i din NyKlasse-contructor...
Avatar billede erikjacobsen Ekspert
11. december 2006 - 10:29 #28
...som jeg har skrevet  08/12-2006 11:18:09  og  08/12-2006 18:30:27
Avatar billede palito Nybegynder
14. december 2006 - 15:43 #29
NÅÅÅÅÅRH. undskyld! var slet ikke klar over den måde extends blev brugt på. Det må i undskylde, at jeg ikke lige fik fat i, hehe.

Jeg var bare helt sikker på, at det ville virke sådan, at get_errors() i min Error-klasse ville gemme alle fejlene. Tænkte ikke over, at den lavede hele denne funktion igen i den klasse jeg har brugt extends i (men kan selvfølgelig godt se logikken nu).

Hvordan skal jeg så gøre hvis jeg godt vil have, at alle mine fejl gemmes i "$error->get_errors()" - og ikke at jeg skal skrive $variablen_for_den_klasse_jeg_vil_hente_fejl_fra->get_errors()????
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester