Возникли проблемы при использовании PHP-оператора include - PullRequest
0 голосов
/ 27 сентября 2019

Я не могу на всю жизнь заставить оператор PHP «включить» работать с любыми файлами, кроме файлов в том же каталоге, что и файл, используя оператор «включить».Когда я пытаюсь включить какой-либо файл из другого каталога, приложение разрывается и ничего не загружается.

Я выгружаю этот скрипт, скажем:

/ var / www / html / fooA /testClass.php

и попробуйте включить его, используя:

/ var / www / html / different_than_fooA / include_testClass.php

иприложение ломается.Однако, если я включу:

/ html / foo_1.php

in:

/ html / foo_2.php

все работает нормально ...

Обещаю, это не простая проблема синтаксиса, я пытался написать ее всеми возможными способами, используя косую черту впереди или без косой черты впереди, целикомкаталоги и частичные каталоги, IP-адреса, даже попытался загрузить с других серверов.Я думаю, это связано с тем, как настроен PHP или Apache.В этом вопросе почти ничего не происходит, что я могу найти в интернете, любой совет был бы отличным.

<?php
    // THIS FILE IS TEST/TEST02.php

    require 'TEST01.php';
    $V = new X();
    $V->Z();
?>

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

По умолчанию PHP устанавливает include_path следующим образом:

On * nix систем

include_path=".:/php/includes"

В системах Widows

include_path=".;c:\php\includes"

Вы можете и должны переопределить эти значения по умолчанию, чтобы они соответствовали вашей среде, поскольку маловероятно, что вы разместите все соответствующие файлы в этих местах.

Использование.в пути включения допускаются относительные включения, так как это означает текущий каталог.Однако более эффективно явно использовать include «./file», чем когда PHP всегда проверяет текущий каталог для каждого include.

Для переопределения местоположений по умолчанию используйте set_include_path("/path/to/includes/") и т. Д., Которые затемпозволяет простым вызовом включать файлы следующим образом:

set_include_path("/path/to/includes/");
include 'class.foobar.php';
require 'functions.php'; // etc

Если вам нужно загрузить файлы классов, можно использовать эквивалентный метод __autoload и написать собственный обратный вызов для обработки загрузки файлов.Исходный метод __autoload устарел, но для этого существует улучшенный класс spl_autoload.

Следующие ссылки ALIASED_SITE_ROOT и ROOT_PATH, которые являются глобально определенными константами в моей системе, указывают на определенные каталоги, поэтомуне будет иметь отношения к вам и будет нуждаться в редактировании, если вы решите принять этот подход к загрузке классов.

Подробнее о "spl_autoload_register"

function autoloader( $classname=false ){

    $included=get_included_files();
    $classname=rtrim( $classname, '.php' );

    $dirs = array(
        '/path/to/includes/',
        ALIASED_SITE_ROOT . '/inc/',
        ALIASED_SITE_ROOT . '/inc/forms/',
        ALIASED_SITE_ROOT . '/inc/lib/',
        ROOT_PATH . '/inc/',
        ROOT_PATH . '/'
    );
    /* add other locations to the above array */
    foreach( $dirs as $dir ) {
        $fullpath = $dir . $classname . '.php';

        if ( file_exists( $fullpath ) ) {
            if( !in_array( $fullpath, $included ) ) {
                require_once( $fullpath );
                clearstatcache();
                break;
            }
        }
    }
    set_include_path( $dirs[ 0 ] );
}
spl_autoload_register( 'autoloader' );

С помощьювыше, зарегистрированный в общем включаемом файле, когда вам нужно загрузить класс, вам больше не нужно делать require '/path/to/includes/foobar.php';, когда вам нужно работать с файлом, который вы можете просто сделать:

$foo=new foobar(); // no need to use `require` or `include` as it has been autoloaded

Так что вышеприведенное работает хорошос классами - последовательная стратегия именования очень поможет, если вы примете этот подход!Например, я стремлюсь найти все классы в том, что показано выше как ALIASED_SITE_ROOT . '/inc/', и использую соглашение об именах class.foobar.php, поэтому в функции автозагрузки

$fullpath = $dir . $classname . '.php';

фактически

$fullpath = $dir . 'class.' . $classname . '.php';

Из этого следует, что имя класса должно соответствовать имени, данному $classname, например:

class foobar{
    public function __construct(){
       /* etc */
    }
}
1 голос
/ 27 сентября 2019

Вы всегда можете использовать магические константы PHP, и таким образом вы можете быть уверены, что он определит правильный путь для вас.

/* lets say we have a folder structure like below
 *
 * - FolderA
 *  -- fileA.php
 * - FolderB
 *  -- fileB.php
 */

 // We require fileA.php in fileB.php, here is how we can do it

 require __DIR__.'/../FolderA/fileA.php';

Вот ссылка на документацию.https://www.php.net/manual/en/language.constants.predefined.php

...