Mutlak bir yol gerektiren PHP dosyalarını nasıl dahil edebilirim?


96

Aşağıdaki gibi bir dizin yapısına sahibim;

script.php

inc / include1.php
inc / include2.php

nesneler / object1.php
nesneler / object2.php

soap / soap.php

Şimdi, bu nesneleri her ikisinde de kullanıyorum script.phpve /soap/soap.phponları taşıyabilirim, ancak bunun gibi dizin yapısının belirli bir nedenle olmasını istiyorum. Yürütürken script.phpyolu dahil inc/include.phpve yürütürken /soap/soap.phpbu kadar ../incmutlak yolları iş, /mnt/webdev/[project name]/inc/include1.php...ama şimdiye kadar farklı bir konuma dizin hareket etmek istiyorsanız çirkin bir çözüm.

Öyleyse, göreli yolları kullanmanın bir yolu var mı, yoksa programlı olarak oluşturmanın bir yolu var "/mnt/webdev/[project name]/"mı?

Yanıtlar:


150

Bu çalışmalı

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Düzenleme: aussieviking tarafından eklenen iyileştirme


2
Dikkatli olun, bu sadece betiği doldurulan bir web sunucusu üzerinden çalıştırırsanız işe yararDOCUMENT_ROOT
Phil

sadece bir soru, neden $ _SERVER ["DOCUMENT_ROOT"] için realpath ()? Bu her zaman kanonik yolu çıkarmaz mı?
João Pimentel Ferreira

44

Göreli yolları kullanabilirsiniz. Deneyin __FILE__. Bu, içinde bulunduğu komut dosyasının her zaman yolunu / dosya adını döndüren bir PHP sabitidir. Yani, içinde soap.phpşunları yapabilirsiniz:

include dirname(__FILE__).'/../inc/include.php';

Dosyanın tam yolu ve dosya adı. Bir içerme içinde kullanılırsa, dahil edilen dosyanın adı döndürülür. PHP 4.0.2'den beri, __FILE__her zaman çözülmüş sembolik bağlarla mutlak bir yol içerirken, eski sürümlerde bazı durumlarda göreli yol içeriyordu. (kaynak)

Başka bir çözüm , httpd.conf veya .htaccess dosyanıza bir dahil etme yolu ayarlamak olabilir .


8
Sana eklemek gerektiğini düşünüyorum /ayırmak için, alıntılanan ifadenin başına ..gelen DOSYA adı.
Dunaril

9
PHP 5.3.0'dan beri sihirli sabiti kullanmak __DIR__yerine kullanabileceğinizi unutmayın dirname(__FILE__). (PHP dokümanları)
Erwin Wessels

3
include dirname(__FILE__).'/../inc/include.php';Göreli yoldan önceki "/" işaretini unutmayın.
Steven Leimberg

6

İçerme ihtiyacını ortadan kaldıran bunu halletmenin başka bir yolu da otomatik yükleme özelliğini kullanmaktır . Komut dosyanızın ihtiyacı olan her şeyi dahil etmek "Tam Durumda" performansı engelleyebilir. İçermelerinizin tümü sınıf veya arabirim tanımlarıysa ve bunları yalnızca gerektiğinde yüklemek istiyorsanız __autoload(), uygun sınıf dosyasını bulmak ve yalnızca çağrıldığında yüklemek için işlevi kendi kodunuzla aşırı yükleyebilirsiniz. İşte kılavuzdan örnek:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

İnclude_path değişkenlerinizi uygun şekilde ayarladığınız sürece, bir daha asla bir sınıf dosyası eklemeniz gerekmez.



5

Projenizin kök dizininin yolu ile bir sabit tanımlayabilir ve ardından bunu yolun başına koyabilirsiniz.


2

Kevin'inki ile ilgili başka bir seçenek de kullanmaktır __FILE__, ancak bunun yerine php dosya adını onun içinden değiştirin:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Bunu bir süredir kullanıyorum. Tek sorun, bazen sahip olmamanızdır $_SERVER['SCRIPT_NAME'], ancak bazen benzer başka bir değişken vardır.


2

Bunu çok iyi çalıştığını buldum!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Kullanım:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

1

Bence en iyi yol, eklentilerinizi PHP içerme yolunuza koymaktır. Kurulumunuza bağlı olarak bunu yapmanın çeşitli yolları vardır.

O zaman basitçe bakabilirsiniz

require_once 'inc1.php';

Web'den erişilebilen dosyalarınızda veya iç içe geçmiş alt dizinlerin herhangi bir düzeyinde nerede olduğuna bakılmaksızın herhangi bir dosyanın içinden.

Bu, içerme dosyalarınızın web sunucusu kökü dışında olmasını sağlar, bu en iyi uygulamadır.

Örneğin

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Ayrıca, sınıf dosyalarının geç yüklenmesi için __autoload'a bakın

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload


1
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

Bu kod satırını kullanıyorum. Site ağacının "üstüne" geri döner, ardından istenen dosyaya gider.

Örneğin, bu dosya ağacına sahip olduğumu varsayalım:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

Functions.php dosyasını nerede olursam olayım, sadece kopyalayıp yapıştırarak ekleyebilirim

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Bu kodu birçok kez kullanmanız gerekirse, str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))parçayı döndüren bir fonksiyon oluşturabilirsiniz . Sonra bu işlevi eklediğiniz ilk dosyaya ekleyin. Her php sayfasının en üstüne dahil ettiğim ve bu işlevi içeren bir "initialize.php" dosyam var. Bir dahaki sefere dosyaları eklemem gerektiğinde, aslında sadece (adlandırılmış path_back) işlevi kullanıyorum :

require(path_back()."/_resources/another_php_file.php");

0

@Flubba, bu dahil etme dizinimde klasörler bulundurmama izin veriyor mu? düz dahil dizinler bana kabuslar veriyor. tüm nesneler dizini inc dizininde olması gerektiği için.

Oh evet, kesinlikle. Örneğin, genellikle tek bir alt klasör katmanı kullanıyoruz:

require_once('library/string.class.php')

Gerçekten yüksek trafikli sitelerde dahil etme yoluna çok fazla güvenirken dikkatli olmalısınız, çünkü php dosyanızın orada olup olmadığını görmek için mevcut dizini ve ardından içerme yolundaki tüm dizinleri araştırmak zorundadır ve bu yavaşlayabilir Eğer dövülüyorsan işler yukarı.

Örneğin, MVC yapıyorsanız, uygulama dizininizin yolunu içerme yoluna koyarsınız ve ardından formdaki şeylere başvurmayı belirtirsiniz

'model/user.class'
'controllers/front.php'

ya da her neyse.

Ancak genel olarak konuşursak, PHP'nizde her yerden çalışacak gerçekten kısa yollarla çalışmanıza izin verir ve okumak, tüm o realpath belge kök malarkeyinden çok daha kolaydır.

Başkalarının önerdiği komut dosyası tabanlı alternatiflerin yararı, paylaşılan kutularda bile her yerde çalışabilmeleridir; Dahil etme yolunu ayarlamak biraz daha fazla düşünce ve çaba gerektirir, ancak bahsettiğim gibi en havalı olan __autoload'ı kullanmaya başlamanızı sağlar.


0

Uygulamanızdaki dosyaların çoğuna belirli bir yol ekleyecekseniz, kök klasörünüz için bir Global değişken oluşturun.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Artık bu Global değişken " APPLICATION_PATH ", her yeni dosya eklediğinizde realpath () işlevini çağırmak yerine tüm dosyaları dahil etmek için kullanılabilir.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Umarım yardımcı olur ;-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.