[php]Relatieve include met include_path toch fout

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik zit met een raar include probleempje. Ik wil graag onafhankelijk van het aangeroepen bestand verder een include kunnen doen. Daarvoor gebruik ik include_path met ini_set().

Mijn directory structuur (het geheel staat in /var/www/framework/:
controller.php
modules/
modules/access/
modules/access/access.php
modules/db/
modules/db/db.php

Ik include controller.php. Hiermee kan ik verschillende modules aanroepen. Dit gebeurt met:
PHP:
1
include_once 'modules/' . $modulesnaam . '/' . $bestand;

Om te zorgen dat php de bestanden goed kan vinden stel ik in de controller een include_path aan:
PHP:
1
ini_set( 'include_path', dirname(__FILE__) . ':' . ini_get( 'include_path' ) );
Hierop ziet mijn include_path er alsvolgt uit:
/var/www/framework:.:/usr/share/php:/usr/share/pear
Als ik nu een bestand 'test.php' aanmaak en deze 'controller.php' laat includen, kan 'controller.php' vervolgens de db module niet vinden. Toch heb ik een correct include pad toegevoegd.

Het werkt alleen als test.php in dezelfde currect working directory staat als controller.php (/var/www/framework dus eigenlijk). Maar ik begin mijn include_path vanaf root (/), dus wordt dit dan niet gecorrigeerd door php? Of moet ik nu serieus het verschil in pad tussen test.php en controller.php gaan meenemen in include_path?

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Staat de include path goed ingesteld vóórdat je daadwerkelijk de include doet?
Klopt $modulesnaam en $bestand met wat je verwacht?

Zoja; installeer XDebug, en je krijgt mooi een error welk bestand PHP probeert te includen, en wat op dat moment het include path is.

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Wat is de foutmelding die je krijgt? Normaal geeft een include een warning als hij niet gevonden wordt.

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik heb had deze code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if( file_exists( 'modules/' . $module . '/qwik.' . $module . '.php') ){
  include_once( 'modules/' . $module . '/qwik.' . $module . '.php');
            
  if( class_exists( 'qwik' . $module ) ){
    $interface = class_implements( 'qwik' . $module );
      if( in_array( 'qwikModule', $interface ) ){
        return call_user_func( array( 'Qwik' . $module , "getDefault" ) );
      }else{
        throw new Exception( 'Qwik: Module ' . $module . ' does not implements the interface qwikModule' );
      }
  }else
    throw new Exception( 'Qwik: Module class ' . $module . ' not found in file modules/' . $module . '/qwik.' .$module . '.php!' );
}else
  throw new Exception( 'Qwik: File for module ' . $module . ' not found!' );
Ik was een reply aan het schrijven en dacht, laat ik de check met file_exists even weg. Kijken wat er dan gebeurt. En het werkt 8)7

Ik zie dat nu include() en alle afgeleiden wél kijken naar include_path, maar file_exists() doet dat niet. Ik zal dus de check moeten herschrijven om fouten hiermee af te vangen. Of kan ik een dergelijke file_exists() ook afhankelijk laten worden van include_path?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dat is ook gedrag zoals het hoort gewoon. In de comments van php.net over de file_exists functie staat ook iemand die dezelfde fout maakt. Waarom gebruik je geen try/catch constructie voor t includen ipv. if/else ?

Acties:
  • 0 Henk 'm!

  • 2playgames
  • Registratie: Februari 2005
  • Laatst online: 01-06 15:19
try/catch? include gooit toch geen excepties? (helaas).

het zou dan zoiets worden als
PHP:
1
2
3
4
$res = @include('bestand');
if ($res === false) {
  echo 'oeps';
}

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ohja, das waar idd... kan me herinneren dat ik wel zoiets wilde maar datt niet kon. De methode die jij beschrijft kan wel idd.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Cartman! schreef op dinsdag 07 oktober 2008 @ 21:20:
Dat is ook gedrag zoals het hoort gewoon. In de comments van php.net over de file_exists functie staat ook iemand die dezelfde fout maakt. Waarom gebruik je geen try/catch constructie voor t includen ipv. if/else ?
Tja, dat zag ik dus ook pas toen ik bezig was met mijn tweede post ;)

Toch is het wel vreemd dat er niet op een uniforme manier wordt gekeken naar IO. Fopen kent een bool parameter waarin je het zoeken naar include_path kan aanzetten. Include() werkt alleen met include_path en file_exists() werkt daar weer helemaal niet mee. Zucht, php :+
2playgames schreef op dinsdag 07 oktober 2008 @ 21:29:
try/catch? include gooit toch geen excepties? (helaas).

het zou dan zoiets worden als
PHP:
1
2
3
4
$res = @include('bestand');
if ($res === false) {
  echo 'oeps';
}
Is op zich wel een goede zo inderdaad. Ik maak er dan wel gelijk dit van:
PHP:
1
2
3
4
if( @include_once( $bestand ) ){
  //continue
}else
  throw new Exception( 'Bla' );

* mithras is voorstander van efficiënt programmeren :)

Acties:
  • 0 Henk 'm!

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Beetje rare constructie.. ik zou er dit van maken
PHP:
1
2
3
4
5
6
7
8
9
10
11
try
{
    if ( !@include_once( $bestand ) )
        throw new Exception( 'Bla' );
  
    // continue
}
catch (Exception $e)
{
    // handel fout af
}


Je else-block is in dat geval overbodig, want dat is de normale flow. Dat maakt try-catch blokken zo handig. Error mikken als je het niet meer ziet zitten en anders gewoon door hobbelen.
Pagina: 1