Avatar billede steven_ Nybegynder
05. marts 2006 - 00:20 Der er 18 kommentarer og
1 løsning

Åbne klasserne automatisk

Jeg ønsker et script som henter alle filer fra en mappe vha. php.net/glob - herefter skal den åbne disse filer, som indeholder en masse klasser.

Filerne i mappen hedder class.{name}.php. Scriptet skal så automatisk udføre følgende:

${name} = new ucfirst( {name} );

Sig til hvis det ikke er forståligt :-D
Avatar billede schaefner Juniormester
05. marts 2006 - 00:28 #1
I dit eksempel hedder klassen "ucfirst" - så det er vel det filen også hedder? Jeg forstår ikke rigtig dit {name} som parameter?

Skal den søge filen igennem og "åbne" de klasser der er brug for?

Så det må vel være "Ikke forstået" :)
Avatar billede jakobdo Ekspert
05. marts 2006 - 00:31 #2
Jeg har ikke testet, men måske noget i denne stil:

<?php
foreach (glob("*.php") as $filename)
{
    if (preg_match('/class\\.(.+?)\\.php/', $filename, $name))
    {
        require($filename);
        ${$name[1]} = new ucfirst({$name[1]});
    }
}
?>
Avatar billede steven_ Nybegynder
05. marts 2006 - 00:37 #3
Jeg prøvede lige lidt selv :)

foreach( glob( $_SERVER['DOCUMENT_ROOT'] . /classes/class.*.php ) as $file )
{
    if( !eregi( $_SERVER['SCRIPT_NAME'], $file ) )
    {
        if( preg_match_all ("/<h1>(.+?)<\/h1>/is", $file, $classNames ) )
        {
            foreach( $classNames[1] as $className )
            {
                $className = new ucfirst( $className );
            }
        }
    }
}
Avatar billede steven_ Nybegynder
05. marts 2006 - 00:44 #4
jakobdo -> din melder fejl.

jeg har prøvet lidt mere - men det virker stadig ikke :P

foreach( glob( $_SERVER['DOCUMENT_ROOT'] . "/classes/class.*.inc" ) as $file )
{
    if( !eregi( $_SERVER['SCRIPT_NAME'], $file ) )
    {
        if( preg_match_all( "/class\ (?)/", $file, $classNames ) )
        {
            foreach( $classNames[1] as $className )
            {
                ${$className} = new ucfirst( {$className} )";
            }
        }
        else
        {
            echo "indeholder ikke nogle klasser";
        }
    }
}
Avatar billede steven_ Nybegynder
05. marts 2006 - 00:49 #5
foreach( glob( $_SERVER['DOCUMENT_ROOT'] . "/classes/class.*.inc" ) as $file )
{
    if( preg_match_all( "/class\\.(.+?)\\.inc/", $file, $classNames ) )
    {
        foreach( $classNames[1] as $className )
        {
            echo '${$className} = new ' . ucfirst( $className ) . ";<br />";
        }
    }
}


den udskriver følgende:

${$className} = new Database;
${$className} = new Failure;
${$className} = new Users;

--
så det er tæt på :D
Avatar billede jakobdo Ekspert
05. marts 2006 - 00:50 #6
Prøv at ret: ' til "
Avatar billede jakobdo Ekspert
05. marts 2006 - 00:51 #7
Og du skal vel også have:
echo "${$className} = new " . ucfirst( $className ) . "();<br />";
Avatar billede steven_ Nybegynder
05. marts 2006 - 00:52 #8
jeg kan virkelig ikke regne ud hvordan man definerer de variabler ordentligt :S

foreach( glob( $_SERVER['DOCUMENT_ROOT'] . "/classes/class.*.inc" ) as $file )
{
    if( preg_match_all( "/class\\.(.+?)\\.inc/", $file, $classNames ) )
    {
        foreach( $classNames[1] as $className )
        {
            ${$className} = new ucfirst( $className );
        }
    }
}
Avatar billede steven_ Nybegynder
05. marts 2006 - 00:59 #9
foreach( glob( $_SERVER['DOCUMENT_ROOT'] . "/classes/class.*.inc" ) as $file )
{
    if( preg_match_all( "/class\\.(.+?)\\.inc/", $file, $classNames ) )
    {
        foreach( $classNames[1] as $className )
        {
            echo "$$className = new " . ucfirst( $className ) . ";<br />";
        }
    }
}

det script udskriver:

$database = new Database;
$failure = new Failure;
$users = new Users;

--
det er præcist det jeg ønsker, men det skal blot ekserveres som php-kode - så jeg kan bruge variablerne :]
Avatar billede jakobdo Ekspert
05. marts 2006 - 01:01 #10
Ved ikke om du kan lave:
eval("$$className = new " . ucfirst( $className ) . "()");
Avatar billede steven_ Nybegynder
05. marts 2006 - 01:03 #11
jeg tror at eval gør præcist det modsatte.

at den forhindrer serveren i at ekservere det som php-kode.. men er ikke sikker.

-- det virker i hvert fald ikke :D
Avatar billede jakobdo Ekspert
05. marts 2006 - 01:07 #12
eval() evaluates the string given in code_str as PHP code. Among other things, this can be useful for storing code in a database text field for later execution.
Avatar billede steven_ Nybegynder
05. marts 2006 - 10:21 #13
nå ok :]

jeg er kommet frem til følgende:

$already_defined = get_declared_classes();
foreach( glob( "classes/class.*.inc" ) as $file ) include( $file );

$defined_afterwards = get_declared_classes();
foreach(array_diff($defined_afterwards, $already_defined ) as $className )
{
    echo "$", $className, " = new ", ucfirst( $className ), ";";
}
Avatar billede jakobdo Ekspert
05. marts 2006 - 16:55 #14
Det her virker hos mig:

<?php
//http://www.eksperten.dk/spm/692675
foreach (glob("*.php") as $filename)
{
    if (preg_match('/class\\.(.+?)\\.php/', $filename, $name))
    {
        require($filename);
        $str = '$var' . $name[1] . ' = new ' . ucfirst($name[1]) . '();';
        eval($str);
        echo $str . "<br>";
    }
}

?>

og jeg har lavet 2 filer med class'er i:

class.class1.php
<?php

class Class1
{
    function Class1($text="CLASS1")
    {
        echo $text;
    }
}

?>

class.class2.php
<?php

class Class2
{
    function Class2($text="CLASS2")
    {
        echo $text;
    }
}

?>
Avatar billede lakana Nybegynder
05. marts 2006 - 17:43 #15
kanon. smid et svar jakobdo
Avatar billede lakana Nybegynder
05. marts 2006 - 18:06 #16
hov. ikke den tråd. skulle have været til coderdk

undskyld forstyrrelsen
Avatar billede steven_ Nybegynder
07. marts 2006 - 22:07 #17
øh. >_<

jakobdo -> læg et svar
Avatar billede jakobdo Ekspert
08. marts 2006 - 07:29 #18
Svar!
Avatar billede jakobdo Ekspert
15. marts 2006 - 15:07 #19
Takker for point!
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