2009-11-10 3 views
2

Le problème est que j'utilise la méthode file _ get _ contents("body.html") dans une classe qui est dans le même dossier que body.html. Le problème est que j'obtiens une erreur en disant que le fichier n'a pas pu être trouvé. C'est parce que je d'une autre classe exige le fichier qui utilise la méthode file _ get _ contents("body.html"), et soudainement je dois utiliser "../body/body.html" comme filepath ..!Comment fonctionnent les chemins de fichiers en php?

N'est-ce pas un peu étrange? La classe qui appelle la méthode file _ get _ contents("body.html") se trouve dans le même dossier que body.html, mais comme la classe est requise d'une autre classe ailleurs, j'ai besoin d'un nouveau chemin de fichier ?!

Voici une courte liste sur les répertoires et fichiers:

lib/main/main.php
lib/body/body.php
lib/body/body.html

Ce corps est .php:

class Body { 

public function getOutput(){ 
    return file_get_contents("body.html"); 
} 
} 

Ceci est main.php:

require '../body/body.php'; 

class Main { 

private $title; 
private $body; 

function __construct() { 

    $this->body = new Body(); 
} 

public function setTitle($title) { 
    $this->title = $title; 
} 

public function getOutput(){ 
    //prints html with the body and other stuff.. 
} 
} 

$class = new Main(); 
$class->setTitle("Tittel"); 
echo $class->getOutput(); 

La chose que je demande est une solution sur l'erreur que body.php est dans le même dossier que body.html mais je dois changer le chemin quand une autre classe nécessite body.php d'ailleurs dans la méthode file _ get _ contents("body.html")

Merci!

Répondre

8

La portée des fonctions basées sur les fichiers de PHP commence toujours au point du premier fichier dans la pile d'exécution.

Si index.php est demandé, et inclut classes/Foo.php qui à son tour doit inclure 'body/body.php', la portée du fichier sera celle de index.php. En général, le current working directory.

Vous avez cependant quelques options.Si vous souhaitez inclure/ouvrir un fichier dans le même répertoire que le fichier en cours, vous pouvez faire quelque chose comme ça

file_get_contents(dirname(__FILE__) . '/body.html'); 

Ou, vous pouvez définir un répertoire de base dans une constante et l'utiliser pour votre inclusion

define('APP_ROOT', '/path/to/app/root/'); 
file_get_contents(APP_ROOT . 'lib/body/body.html'); 
+0

cela m'a aidé aussi, merci! – ItsMeDom

1

Non, ce n'est pas étrange.

PHP est exécuté avec un répertoire de travail. C'est généralement le répertoire dans lequel réside le script "entry". Ce répertoire de travail ne change pas lorsque vous exécutez un script inclus.

Si vous voulez lire quelque chose dans le répertoire du fichier en cours d'exécution, essayez quelque chose comme

$path = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."body.php"; 
1

Si vous voulez savoir quel répertoire du fichier en cours est, essayez dirname(__FILE__). Vous devriez être capable de travailler à partir de là.

1

Vous devez définir une constante BASEPATH dans le script d'entrée ... et puis faire référence à tous les fichiers requis par file_get_contents() par rapport au BASEPATH

Il pourrait être quelque chose comme:

define("BASEPATH","/var/www/htdocs/"); 

//and then somewhere else 
file_get_contents(BASEPATH."body/body.html"); 
3

en complément de celui qui a répondu avec dirname (FICHIER):

PHP 5.3 ajoute un DIR constante magique. Donc en PHP 5.3

file_get_contents(__DIR__."/body.html"); 

Devrait faire l'affaire pour vous.

Questions connexes