Versio

file_exists && include_path

Overzicht Reageren

Bo az

Bo az

08/10/2007 21:13:00
Quote Anchor link
Ik wil een file includen, maar alleen als deze bestaat, anders moet er een andere geinclude worden of helemaal niets.

Het probleem is dat ik op het moment van includen alleen weet dat de files zich ergens in het include_path van de server bevinden, maar niet de exacte locatie.

Het probleem:
Om te zorgen dat ik geen overbodige includes ga uitvoeren wil ik eigenlijk eerst checken of de file wel bestaat. Normaal doe je dit met file_exists, maar deze checked het include_path niet.

Mijn vraag:
Is er een manier om te kijken of een file ergens in het include_path bestaat?

Mijn huidige code ziet er zo uit, het werkt, maar ik vind het niet de meest charmante oplossing, vandaar mijn vraag.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    
public static function autoLoad($p_sClassName){
        @
include_once strtolower($p_sClassName).'.inc.php';
        @
include_once strtolower(substr($p_sClassName, 3)).'.inc.php';
}


?>
Gewijzigd op 01/01/1970 01:00:00 door Bo az
 
PHP hulp

PHP hulp

24/05/2012 15:38:22
Gesponsorde koppelingen:
 
Klaasjan Boven

Klaasjan Boven

08/10/2007 21:16:00
Quote Anchor link
require??

if(require('file'))
{
doe je ding
}
else
{
echo "bestaat niet";
}


zoiets???
 
Bo az

Bo az

08/10/2007 21:18:00
Quote Anchor link
Require is een statement en geen functie, het heeft dus geen return waarde.

Bovendien geeft require meteen een fatal error als het bestand niet bestaat, vandaar dat ik ookal include ipv require gebruikte. (include geeft slechts een warning die ik met @ onderdruk).
 
Klaasjan Boven

Klaasjan Boven

08/10/2007 21:19:00
Quote Anchor link
Ok duidelijk, kan je die warning niet gebruiken??
met bijv trigger_error() ?? Of zoiets?

Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
 
- SanThe -

- SanThe -

08/10/2007 21:21:00
Quote Anchor link
Wat noem jij dan een 'include_path'?
 
Klaasjan Boven

Klaasjan Boven

08/10/2007 21:22:00
Quote Anchor link
@San ik neem aan dat hij het standaard pad bedoelt? Zoals in je phpinfo staat?
 
Bo az

Bo az

08/10/2007 21:24:00
Quote Anchor link
@SanThe
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    echo ini_get('include_path');
?>


@Klaasjan
Eigenlijk wil ik het liefst van de error af, zodat ie helemaal niet te voorschijn komt. Verder snap ik niet helemaal wat je bedoeld, trigger_error() 'maakt' toch juist een error?
 
Klaasjan Boven

Klaasjan Boven

08/10/2007 21:29:00
Quote Anchor link
@Boaz,

Je hebt gelijk ik ben er niet bij vandaag :(
Zie overigens mijn edit hierboven, het lijkt erop dat je op een bug gestuit bent. Kan je niet fopen() of een van die familie gebruiken en kijken of je een fout terugkrijgt?
Asl je een fout terugkrijgt dan include('standaard') anders (file bestaat) include('specifiek')

??
Ik roep maar wat hoor
 
Bo az

Bo az

08/10/2007 21:35:00
Quote Anchor link
Ik denk persoonlijk dat het niet een bug is, maar iets wat mist.

Als je bijvoorbeeld naar de beschrijving van file() kijkt zie je dat je kan aangeven of er ook in het include path gekeken moet worden. Dit mist helaas bij file_exists() .
Misschien heeft dat een rede die ik nog niet bedacht heb of een simpele oplossing die ik ook nog niet bedacht heb ;)

Klaasjan:
Ik roep maar wat hoor

Is prima! Hopenlijk helpt het om tot een oplossing te komen :)
 
Jan Koehoorn

Jan Koehoorn

08/10/2007 21:41:00
Quote Anchor link
Heb je hier wat aan misschien?
 
Bo az

Bo az

08/10/2007 21:51:00
Quote Anchor link
@Jan, is niet wat ik bedoelde, maar het helpt enigszins.

Ik heb er nu het volgende van gemaakt.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
    public static function autoLoad($p_sClassName){
        foreach(explode(PATH_SEPARATOR, ini_get('include_path')) as $sPath){
            if(file_exists($sPath.DIRECTORY_SEPARATOR.strtolower($p_sClassName).'.inc.php')){
                require_once strtolower($p_sClassName).'.inc.php';
            }
elseif(file_exists($sPath.DIRECTORY_SEPARATOR.strtolower(substr($p_sClassName, 3)).'.inc.php')){
                require_once strtolower(substr($p_sClassName, 3)).'.inc.php';
            }
        }
    }

?>


Dit is 100% error vrij, maar de vraag is of dit echt charmanter is dan mijn eerste oplossing?
 
Jelmer rrrr

Jelmer rrrr

08/10/2007 22:47:00
Quote Anchor link
Stel dat je include-path "/map/a:/map/b" is, en in beide mapjes staat een bestand "klasse.inc.php", dan worden beide bestanden geïnclude. Misschien dat je nog even een 'return true' achter de require_once moet zetten. Scheelt je ook weer het foreach-loopje afmaken waneer het niet langer nodig is.
 



Overzicht Reageren

Get Adobe Flash player