file_exists && include_path
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.
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)
1
2
3
4
5
6
7
8
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';
}
?>
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
Gesponsorde koppelingen:
require??
if(require('file'))
{
doe je ding
}
else
{
echo "bestaat niet";
}
zoiets???
if(require('file'))
{
doe je ding
}
else
{
echo "bestaat niet";
}
zoiets???
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).
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).
Ok duidelijk, kan je die warning niet gebruiken??
met bijv trigger_error() ?? Of zoiets?
met bijv trigger_error() ?? Of zoiets?
Edit:
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
Wat noem jij dan een 'include_path'?
@San ik neem aan dat hij het standaard pad bedoelt? Zoals in je phpinfo staat?
@SanThe
@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
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?
@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
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
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 ;)
Is prima! Hopenlijk helpt het om tot een oplossing te komen :)
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 :)
Heb je hier wat aan misschien?
@Jan, is niet wat ik bedoelde, maar het helpt enigszins.
Ik heb er nu het volgende van gemaakt.
Dit is 100% error vrij, maar de vraag is of dit echt charmanter is dan mijn eerste oplossing?
Ik heb er nu het volgende van gemaakt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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';
}
}
}
?>
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?
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.



