Include в функции и данные из него

Hamster

Новичок
Добрый день!

Зная, что все переменные создаются локально, следовательно пример приведенный ниже работать не будет!

PHP:
<?php
# index.php
echo "hello";

function test() {
	include("preload.php");
}

test();

echo $a;
?>
PHP:
<?php
# preload.php

$a = 1;
?>
Если include вынести за приделы функции, то работать будет - это понятно. Но вопрос в другом, есть какие либо решения?

Что мне нужно?
Есть десяток, другой файлов с функциями и классами, мне нужно подключать только некоторые, написав функцию по подключению данных файлов (с проверкой на существование файлов), я допустим одной строкой (типо: pick('имяфайла.php');) упрощаю код, да и задачу. Но дело в том, что тогда не будут видны объявленные (не глобальные) переменные из подключенных файлов :(
 

Hamster

Новичок
Я эту тему читал, перед тем, как создать свою. Там немного о другом.
Я же хочу узнать:
Есть десяток, другой файлов с функциями и классами, мне нужно подключать только некоторые, написав функцию по подключению данных файлов (с проверкой на существование файлов), я допустим одной строкой (типо: pick('имяфайла.php') упрощаю код, да и задачу. Но дело в том, что тогда не будут видны объявленные (не глобальные) переменные из подключенных файлов
Дык как же можно извернуться, что бы на выходи получить что то подобное?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Мои 5 рублей говнокода:
index.php
PHP:
<?php

echo "hello";

function test() {
    return include("vars.php");
}

$a = test();

var_dump($a);
vars.php
PHP:
return array('test_key' => 'test_variable');
 

Hamster

Новичок
c0dex
Спасибо, не плохой вариант. Правда немного не то, что мне нужно. Я же хотел просто объявить переменные в подключенных файлах и использовать их в других. Так получается использовать придется массивы, вместо строковой переменной. Но тоже выход ;)

haxyn
Я пытаюсь минимизировать код, а именно не выполнять одни и те же действия по сто раз. И причем тут разница между include и require. При require происходит exit(), а при include просто выдает ошибку.

include вставляет содержимое файла как есть, без изменений. Тут дело, в том, что include находится в области fuction и не виден из другой области кода.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Hamster
extract() тебе в помощь, но это верный способ прострелить себе ногу)
 

Hamster

Новичок
не, extract() это точно слишком много лишних манипуляций.
Я вот что хочу сделать, допустим у меня следующая функция
PHP:
function pickup($script) {
    $fileScript = ROOT.$script;
    if(is_file($fileScript)) {
        require_once $fileScript;
    }else{
        exit('Не найден скрипт '.ROOT.$fileScript);
    }
}
это же лучше, чем
PHP:
is_file('/scripts/header/header.php') ? require_once('/scripts/header/header.php') : exit('Не найден скрипт /scripts/header/header.php');
и таких может быть десяток в разных местах кода и в разных файлах, т.е. цикл не подходит.
А мой велосипед в виде функции pickup() не передаст всех переменных.

Конечно, если вы скажите, что намного лучше использовать вариант без моего велосипеда, а is_file('file') ? require('file') : exit(); то я соглашусь и буду делать именно так. Но если есть еще идеи, выслушаю.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Проверить $script не забудь, а то вдруг там окажется что-то типа ../../../../../../../etc/passwd
 

Hamster

Новичок
Тем более, если еще добавлять проверки различные в данную функцию, то разумнее её и использовать. Но она не подходит, из-за того, что из этой функции не передаются переменные в основной скрипт.

P.S. пока предложили только один вариант, возвращать массив данных.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Если бы include внутри функции затрагивал бы область видимости за пределами этой функции, это был бы АД, которого ты хочешь. Подумай о спонтанно перетирающихся переменных. Вверху файла, до вызова функции ты задефайнил переменную, а ниже вызова уже творится архизвездец, а ты не можешь понять, из-за чего у тебя переменная не того типа/значения...
 

Hamster

Новичок
Да, понимаю. Это логично, но все же если нужно...
Кажется придумал, примерно так:
PHP:
function pickup($script) {
    $fileScript = ROOT.$script;
    if(is_file($fileScript)) {
       return $fileScript;
    }else{
        exit('Не найден скрипт '.ROOT.$fileScript);
    }
}

require(pickup('script.php'));
Тогда все переменные будут доступны. И в данной функции можно делать уже любые проверки.
Спасибо за поддержку.
 
Сверху