Как включать файлы PHP, которые требуют полного пути?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
92
задан Rahul 4 June 2019 в 09:29
поделиться

8 ответов

Это должно работать

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

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

Править: добавленное улучшение aussieviking

147
ответ дан Community 24 November 2019 в 06:27
поделиться

Можно использовать относительные пути. Попробуйте __FILE__. Это - константа PHP, которая всегда возвращает путь/имя файла сценария, в котором это находится. Так, в soap.php, Вы могли сделать:

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

полный путь и имя файла файла. Если используется в том, чтобы включать, название включенного файла возвращается. Так как PHP 4.0.2, __FILE__ всегда содержит полный путь с символьными ссылками, разрешенными, тогда как в более старых версиях он содержал относительный путь при некоторых обстоятельствах. (источник)

Другое решение состояло бы в том, чтобы установить , включают путь в Ваш httpd.conf или .htaccess файл.

43
ответ дан Ivan Akulov 24 November 2019 в 06:27
поделиться

Вы могли определить константу с путем к корневому каталогу Вашего проекта, и затем помещать это в начале пути.

5
ответ дан Ryan Fox 24 November 2019 в 06:27
поделиться

взгляните на http://au.php.net/reserved.variables

Я думаю переменная, которую Вы ищете: $_SERVER["DOCUMENT_ROOT"]

6
ответ дан Andy 24 November 2019 в 06:27
поделиться

Другой способ обработать это, которое устраняет любую необходимость, включает, вообще должен использовать автозагрузка функция. Включая все Ваши потребности сценария "На всякий случай" могут препятствовать производительности. Если Ваш включает, весь класс или интерфейсные определения, и Вы хотите загрузить их только при необходимости, можно перегрузиться эти __autoload() функция с собственным кодом, чтобы найти соответствующий файл класса и загрузить его только, когда это называют. Вот пример из руководства:

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

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

, пока Вы устанавливаете свои include_path переменные соответственно, Вы никогда не должны включать файл класса снова.

5
ответ дан Sam McAfee 24 November 2019 в 06:27
поделиться

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

Тогда можно просто обратиться к

require_once 'inc1.php';

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

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

, например,

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

кроме того, проверьте __ автозагрузка для ленивой загрузки файлов класса

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

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

1
ответ дан Polsonby 24 November 2019 в 06:27
поделиться

@Flubba, это позволяет мне иметь папки в моем включает каталог? плоский включают каталоги, дают мне кошмары. поскольку целый каталог объектов должен быть в inc каталоге.

Ах да, абсолютно. Так, например, мы используем единственный слой подпапок, обычно:

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

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

Так, например, при выполнении MVC Вы поместили путь к своему приложению directoy во включать пути и затем определяете, относятся к вещам в форме

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

или что бы то ни было.

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

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

0
ответ дан Polsonby 24 November 2019 в 06:27
поделиться

Другая опция, связанная с Kevin, является использованием __FILE__, но вместо этого замените php имя файла из него:

<?php

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

?>

Я использовал это некоторое время. Единственная проблема иногда, Вы не имеете $_SERVER['SCRIPT_NAME'], но иногда существует другая подобная переменная.

2
ответ дан HamZa 24 November 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: