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

  • Автор темы Автор темы Hamster
  • Дата начала Дата начала

Hamster

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

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

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

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

test();

echo $a;
?>

PHP:
<?php
# preload.php

$a = 1;
?>

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

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

Дык как же можно извернуться, что бы на выходи получить что то подобное?
 
Мои 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');
 
c0dex
Спасибо, не плохой вариант. Правда немного не то, что мне нужно. Я же хотел просто объявить переменные в подключенных файлах и использовать их в других. Так получается использовать придется массивы, вместо строковой переменной. Но тоже выход ;)

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

include вставляет содержимое файла как есть, без изменений. Тут дело, в том, что include находится в области fuction и не виден из другой области кода.
 
Hamster
extract() тебе в помощь, но это верный способ прострелить себе ногу)
 
не, 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(); то я соглашусь и буду делать именно так. Но если есть еще идеи, выслушаю.
 
Проверить $script не забудь, а то вдруг там окажется что-то типа ../../../../../../../etc/passwd
 
Тем более, если еще добавлять проверки различные в данную функцию, то разумнее её и использовать. Но она не подходит, из-за того, что из этой функции не передаются переменные в основной скрипт.

P.S. пока предложили только один вариант, возвращать массив данных.
 
Если бы include внутри функции затрагивал бы область видимости за пределами этой функции, это был бы АД, которого ты хочешь. Подумай о спонтанно перетирающихся переменных. Вверху файла, до вызова функции ты задефайнил переменную, а ниже вызова уже творится архизвездец, а ты не можешь понять, из-за чего у тебя переменная не того типа/значения...
 
Да, понимаю. Это логично, но все же если нужно...
Кажется придумал, примерно так:
PHP:
function pickup($script) {
    $fileScript = ROOT.$script;
    if(is_file($fileScript)) {
       return $fileScript;
    }else{
        exit('Не найден скрипт '.ROOT.$fileScript);
    }
}

require(pickup('script.php'));

Тогда все переменные будут доступны. И в данной функции можно делать уже любые проверки.
Спасибо за поддержку.
 
Сверху