Avatar billede hoppe11 Nybegynder
16. oktober 2010 - 12:29 Der er 7 kommentarer og
1 løsning

"global" class

jeg skal have lavet en debug klasse til hjælp til at debug'e.. nu ved jeg heller ikke om jeg griber det korrekt an, men hvordan kan man gøre noget i stil med dette uden at skal gøre $Debug global manuelt i hver eneste funktion?

class Debug
{
    private $debug_arr = array();

    function add($str)
    {
        $this->debug_arr[] = $str;
    }
}

class Test
{
    function Test()
    {
        // global $Debug;

        $Debug->add('testen');
    }
}

er selvfølgelig åben overfor andre og bedre forslag :)
Avatar billede danco Nybegynder
16. oktober 2010 - 12:57 #1
Som jeg umiddelbart forstår dit spørgsmål vil du lave en form for unit test på dine klasser hvilket er meget fornuftigt i sig selv.

Den måde jeg vil gøre det på er at lave et globalt array til fejlmeddelser hvor du i hver funktion tilføjer en meddelse ved en fejl. Til sidst ville jeg så have en getter til arrayet for at få det returneret.

function getArray(){
  return $this->debug_arr;
}

På den måde sikre du at det kun er klassen selv der kan tilføje til arrayet, altså konstatere fejl, hvilket må give den bedste integritet i din klasse.
Avatar billede hoppe11 Nybegynder
16. oktober 2010 - 13:05 #2
kan du ikke lige lave et lille eksempel.. ved ikke om jeg forstår dig korrekt?
Avatar billede danco Nybegynder
16. oktober 2010 - 13:27 #3
Jamen jeg mener bare at du i din klasse har et $debug_arr som du bruger til at opsamle fejl, i alle dine functions tilføjer du så en meddelse i det globale array ved fejl og derefter bruger arrayet til at vise alle opstået fejl.
Konceptet bag unit test er at laver en helt ny klasse kun med det formål at teste den rigtige klasse, så har du function til at teste alle dine "rigtige" functions. Eksempelvis:

class User{
  public static function createUser($name) {
      $correct = false;
      //create user logic
      return $correct;
  }
}

class UserTest {
  $debug = array();
  require_once('user.class.php');
 
  public static function testCreateUser($name) {
    if(!User::createUser($name)) {
      $debug[sizeof($debug)+1] = 'Fejl i oprettelse af bruger';
    }
  }
 
  public function getErrors(){
    return $this->debug;
  }
}

jeg håber det gav dig lidt mere overblik.
Avatar billede intenz Novice
16. oktober 2010 - 13:35 #4
Hvis du vil have et metode i en klasse til at være 'global' skal du bare lave den statisk og også de variabler i klassen der skal bruges af statiske metoder.

I stedet for at bruge -> kalder du så variablerne med self::$variabelNavn, da de er statiske.

class Debug
{
    private static $debug_arr = array();

    static function add($str)
    {
        self::$debug_arr[] = $str;
    }
}

Og hver gang du skal kalde en statisk metode i Debug kalder du den som:
Debug::metodeNavn();

class Test
{
    function Test()
    {
        Debug::add('testen');
    }
}
Avatar billede hoppe11 Nybegynder
16. oktober 2010 - 14:16 #5
vil du ikke lige prøve at rette min klasse til.. kan ikke helt få det til at fungere.. får fejl

men hvad er det præcist at static gør ved funktioner og variabler?

<?
class Debug
{
    private $debug = true;
    private $debug_ip_arr = array(
        'xxx.xxx.xxx.xxx'
        );
   
    private static $debug_arr = array();
   
    function Debug()
    {
        if(!in_array($_SERVER['REMOTE_ADDR'], $this->debug_ip_arr)) $this->debug = false;
       
        if($this->debug) register_shutdown_function(array($this, 'write'));
    }
   
    static function add($str, $error = false)
    {
        if($this->debug)
        {
            if($str) self::$debug_arr[] = ($error ? '<b>error:</b> ':'').htmlspecialchars($str);
           
            if($error)
            {
                self::write();
                exit;
            }
        }
    }
   
    static function write()
    {
        if($this->debug_arr) echo implode('<br>', $this->debug_arr);
    }
}
?>
Avatar billede hoppe11 Nybegynder
16. oktober 2010 - 14:39 #6
jeg fandt selv ud af det! :)

smid et svar intenz
Avatar billede danco Nybegynder
16. oktober 2010 - 14:40 #7
Statiske funktioner kan kaldes på klassen fremfor på et objekt.
Avatar billede intenz Novice
17. oktober 2010 - 18:01 #8
Fint, kommer her :)
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