Avatar billede w13 Novice
05. august 2010 - 16:22 Der er 9 kommentarer og
2 løsninger

Gøre funktioner i en klasse globale

Hej Eksperter.

Jeg sidder og arbejder med nogle klasser i PHP, hvor jeg har en del funktioner. En klasse kunne være:

class Date {
   
    public function Month( $timestamp ) {
        // Return monthnumber
    }
   
    public function Year( $timestamp ) {
        // Return year
    }
   
}


Det er meget fint - så kan man kalde en af funktionerne ved at skrive:

Date::Month();

Eller:

$d = new Date();
$d->Month();


Mit problem er nu, at jeg har rigtig mange funktioner i klassen, som jeg bruger rigtig ofte - og på den ene side er det rart at have dem samlet i Date-objektet, på den anden side er det irriterende at skulle skrive Date:: foran funktionsnavnene hele tiden.

Er det muligt på nogen måde at gøre, så man kan tilgå funktionerne som helt normale funktioner, som om de lå i det globale variable-scope:
[i]Month();[i]
- selvom de ligger i klassen? Og så hvis man vil gøre det på den 'besværligere' måde, kan man stadig det?

På forhånd tak!

Med venlig hilsen
Tobias
Avatar billede w13 Novice
05. august 2010 - 16:23 #1
Der var lige en typo...

Jeg ville selvfølgelig gerne kunne bruge funktionerne sådan her:

Month();
Avatar billede Slettet bruger
05. august 2010 - 19:24 #2
Jeg har ikke arbejdet enormt meget med objekt-orienteret programmering i PHP, men jeg tror kun det du ønsker er muligt the pseudo-way:

class Date {
   
    public static function Month( $timestamp ) {
        // Return monthnumber
    }
   
    public static function Year( $timestamp ) {
        // Return year
    }
   
}

function Month($timestamp) {
    return Date::Month($timestamp);
}

function Year($timestamp) {
    return Date::Year($timestamp);
}


Men det kan selvfølgelig være jeg tager fejl :)
Avatar billede danco Nybegynder
06. august 2010 - 01:09 #3
Jeg er nu ret sikker på at du bliver nødt til at fortælle PHP hvilken klasse den skal finde funktionerne i.
De globale funktioner du snakker om ligge pakket ind i selve PHP som sprog og kan derfor tilgås globalt.

Jeg har intet dokumentation for det, men det er mit umiddelbare gæt
Avatar billede repox Seniormester
06. august 2010 - 09:10 #4
Du kan forhåbentligt godt se det tåbelige i at pakke de funktioner ind i en klasse, hvis du ikke har tænkt dig at anvende klassen alligevel? Think smarter, not harder...
Avatar billede danco Nybegynder
06. august 2010 - 13:12 #5
Pinligt !
Den havde jeg ikke set komme, men selvfølgelig giver jeg repox ret her. Jeg er blot vant til at benytte funktioner i forbindelse med et objekt.
Repox har vidst mere end rigeligt besvaret spørgsmålet her :)
Avatar billede repox Seniormester
06. august 2010 - 14:00 #6
Jeg kan dog godt se hvor du gerne vil hen med det; måske en mulighed kunne være noget ala:
<?php

    class Date
    {
        public $timestamp;
        private $common = array();
   
        public function __construct( $timestamp = null )
        {       
            if( !isset($timestamp) )
                $timestamp = time();
       
            $this->timestamp = $timestamp;
            $this->createCommon();
        }
               
        public function datetime()
        {
            return date("Y-m-d H:i:s", $this->timestamp);
        }
       
        public function time( $format = "H:i:s" )
        {
            return date($format, $this->timestamp);
        }
       
        private function createCommon()
        {
            $common = array("year" => "Y", "month" => "m", "date" => "d", "hour" => "H", "minute" => "i", "second" => "s");
            foreach($common as $key => $value)
                $this->common[$key] = date($value, $this->timestamp);
        }
           
        public function __get( $name )
        {
           
            if( method_exists($this, $name) )
                return call_user_method($name, $this);
               
            if( isset($this->common[$name]) )
                return $this->common[$name];
               
            return null;
           
        }
       
   
    }

    $eol = "<br />";

    $tid = new Date(); //Giver dig tiden nu
    //eller
    $tid = new Date( strtotime("2010-08-12 12:52:00") );
    //eller
    $tid = new Date( 1281094488 );


   
    echo $tid->month;
    echo $eol;
   
    echo $tid->year;
    echo $eol;
       
    echo $tid->datetime;
    echo $eol;
   
    echo $tid->time;
    echo $eol;

    echo $tid->time("H:i");
    echo $eol;   
?>
Avatar billede w13 Novice
06. august 2010 - 18:20 #7
kimsey0>> Jaeh, men det ødelægger lidt idéen synes jeg. :)

repox>> Ja, det strider måske lidt imod logikken i det, men det var mere en tanke jeg lige ville have udforsket. =) Jeg bruger den meget gennem dén klasse, men på én PHP-side kunne jeg virkelig godt tænke mig at bruge funktionerne helt uden om klassen for simpelthen bare at gøre koden pænere og mere overskuelig.

Jeg kaster dog håndklædet i ringen nu - det ser ud til at det kan gøres uden at instantiere klassen på den ene eller anden måde.

Opret bare et svar alle sammen, så deler I pointene! :) Tak for jeres bud!
Avatar billede Slettet bruger
06. august 2010 - 18:34 #8
Svar her :)
Avatar billede repox Seniormester
06. august 2010 - 18:50 #9
Jeg springer over...
Avatar billede w13 Novice
07. august 2010 - 10:55 #10
Danco får lige en dag og så ryger der point. =)
Avatar billede w13 Novice
19. august 2010 - 10:28 #11
Tak for hjælpen! :)
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