Nasıl Require_oncenin içinde yol çözünürlükte çalışma içerir?

4 Cevap php

Ben garip bir durumla karşılaştı zaman, PHP bir web uygulaması yazıyordu. , Benim sorunum göstermek bu yapının bir web uygulaması düşünün:

/
    index.php
    f1/
        f1.php
    f2/
        f2.php

Bu dosyaların içerikleri:

index.php:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("../f2/f2.php"); ?>

f2.php: Boş

Benim tarayıcıda index.php açmaya çalışırken şimdi bu hatayı alıyorum:

Warning: require_once(../f2/f2.php) [function.require-once]: 
failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2
Fatal error: require_once() [function.require]: 
Failed opening required '../f2/f2.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/reqtest/f1/f1.php on line 2

Kaçırdığım belirgin bir şey var mı? nasıl yollar PHP işe dahil mi?


Ben bu soruyu sordu önce, deney ve öğrenmek için çalıştı. Öyle gibi, başka bir test kurmak:

/
    index.php
    f1/
        f1.php
        f2.php

index.php:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("f2.php"); ?>

f2.php: Boş

Benim sürpriz (ve mutlak karışıklık) için, bu güzel çalıştı!

Yani, yol çözünürlük arkasındaki sır nedir?

PS I this question gördüm, ama yine de ben burada ifade ettik, ikinci davayı cevap vermez.

4 Cevap

Başka bir dosya eklerseniz dahil olmak üzere dosya nerede, çalışma dizini kalır.

Sizin örnekleri beklendiği gibi çalışıyoruz.

Edit: İkinci örnek çünkü çalışır. (Gerçek) dizini yolu dahil olan (hata iletisi görebilirsiniz).

Edit2: In your second example, the key point of your interest is this line:

<?php require_once("f2.php"); ?>

İlk bakışta geçerli çalışma dir (/var/www/req_path_test) bakacağız, ama f2.php bulmaz.

Son çare olarak, o ile başlayan, ('.:/usr/share/php:/usr/share/pear') sizin include_path f2.php bulmaya çalışacağız. ' (actual dosyası değil, including, bir göre olan).

Yani './f2.php' çalışıyor ve başarısız değil gerektirir.

Eğer index.php açtığınızda, çalışma dir bu dosya in bulunduğu Ve bu çalışma dir değişmez f1.php içindeki insluded klasöre ayarlanır.

Böyle geçerli dahil dosyasına göre mutlak yolları kullanarak dosyaları içerebilir:

require_once(dirname(__FILE__).'/../../test/file.php')

Ama daha bu dosyaları sınıfları içeren eğer bir autoloader kullanmayı düşünün.

Normalde eski yapısı

<?php require_once("f2/f2.php"); ?>

yerine

<?php require_once("../f2/f2.php"); ?>

çalışması gerekir. Bildiğim kadarıyla php başlangıç ​​komut yolları alır

Sunucu open_basedir PHP yapılandırmada etkin ayarı var gibi geliyor. Bu imkansız dizin structur (yani, siz kullanamazsınız .. / klasör yapısında yukarı gitmek için) sizin yukarıdaki klasörlerdeki dosyaları içerir (ve açık) yapar.