Ile göreli bir yol dahil PHP onay hangi dizinleri içermez (?)

2 Cevap php

Çok tuhaf, hiç kimse henüz bir sonuç ile özetlemek var?

Bazen de, dahil dosyanın dizinini denetler.

Ama bazen değil.

D: \ test \ 1.php

<?php

include('sub\2.php');

D: \ test \ 2.php

<?php

include('3.php');

3.php olarak aynı Dir nerede 2.php.

Yukarıdaki eserler, ama neden? Geçerli dizin D:\test olmalı, ama hala içinde olan, 3.php bulabilirsiniz D:\test\sub

More story (final)

Yaklaşık bir yıl önce ben bu sorunu tanıştım, ve sonra aşağıda gibi kodlanmıştır ile sabit sona erdi:

Common.php:

if (file_exists("../../../Common/PHP/Config.inc"))
    include('../../../Common/PHP/Config.inc');

if (file_exists("../../Common/PHP/Config.inc"))
    include('../../Common/PHP/Config.inc');

if (file_exists("../Common/PHP/Config.inc"))
    include('../Common/PHP/Config.inc');

if (file_exists("Common/PHP/Config.inc"))
    include('Common/PHP/Config.inc');

Config.inc olarak aynı dizinde olduğu Common.php

2 Cevap

Eğer ana / fopen_wrappers.c içinde php için kaynak koduna bir göz atın eğer bulabilirsiniz

/* check in calling scripts' current working directory as a fall back case
     */
    if (zend_is_executing(TSRMLS_C)) {
        char *exec_fname = zend_get_executed_filename(TSRMLS_C);
        int exec_fname_length = strlen(exec_fname);

        while ((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length]));
        if (exec_fname && exec_fname[0] != '[' &&
            exec_fname_length > 0 &&
            exec_fname_length + 1 + filename_length + 1 < MAXPATHLEN) {
            memcpy(trypath, exec_fname, exec_fname_length + 1);
            memcpy(trypath+exec_fname_length + 1, filename, filename_length+1);
            actual_path = trypath;

Bu koşulsuz idam edilecek gibi görünüyor ve bu nedenle her zaman include_path belirtilen tüm olasılıkların sonra son seçenek olarak ... dahil / dosya açma komut erişilebilir aynı yolu bir dosya yapacaktır. Ve siz dahil bir göreli veya mutlak bir yol tanımlamak yok sadece ().