Задать вопрос

Можно ли сделать include в функции php?

Здравствуйте, в общем суть такова, нужно грузить модуль в php файле предварительно проверяя права итд итп.

В простейшем варианте выглядит так
index.php
<?php
$v=4;
function load_mod($name)
{
 include 'PATH'.$name.'.php';
}

load_mod('mod_name');
echo $v;
?>


mod_name.php
<?php
$v=5;
?>


Можно ли без запаковки переменных в массив и обратной распаковки решить проблему с областью видимости? Или только include вне функции?

К тому же, внутри загружаемого модуля нужно иметь доступ к классам.
  • Вопрос задан
  • 713 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 6
Всё что есть в функции исчезает когда она заканчивает работу, если вы делаете include в функции то в конце надо всё это собрать и отдать в return тогда нужные данные можно будет использоваь дальше.
Ответ написан
Комментировать
thewind
@thewind
php программист, front / backend developer
Вам бы паттерн "декоратор" изучить) он помог бы
Ответ написан
Комментировать
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
mod_name.php
<?php
global $v;
$v=5;
?>
Ответ написан
nonlux
@nonlux
Почитай на темы:
- use в функциях (анонимные функции)
- типы данных в частности указатели
работающий пример твоего кода:
<?php
$v=4;
$load_mod=function ($name) use (&$v)
{
 include ''.$name.'.php';
};

$load_mod('mod_name');
echo $v;  // v === 5


Но я не думаю что это решение твоей проблемы. Подумай лучше над более качественной архитектуторой
Ответ написан
Комментировать
@PavelBelyaev Автор вопроса
Проверил только что, подгруженные внутри функции классы могут объявляться вне функции, но вот с переменными такое не пройдет, их надо в глобальную видимость объявлять.
function LLL()
{
include PRIV.DS.'classes_crm.php';
}

LLL();

$crm_cl = new ShopCRM;
Ответ написан
Комментировать
@ZeFearKa
Возникла ситуация, когда нужно сделать красиво, инклюдить файлы сразу с проверкой пути к файлу, что бы сократить код в других местах. Может кому-то пригодится.

Вызывается одним действием _file_include($path) или $this->_file_include($path) для класса

Метод 1. Используется переменная $GLOBALS. Можно задать ключ, например $GLOBALS['custom_variables'] для упрощения доступа к внутренним переменным.
function _file_include($path) {
  if (!file_exists($path)) {
    return false;
  }

  include_once($path);

  unset($path);

  if (!get_defined_vars()) {
    return;
  }

  $GLOBALS[] = array_merge($GLOBALS, get_defined_vars());
}


Метод 2 использует возврат в переменную в которую вызывается функция.
function _file_include($path) {
  if (!file_exists($path)) {
    return false;
  }

  include_once($path);

  unset($path);

  if (!get_defined_vars()) {
    return;
  }

  return get_defined_vars();
}
$variables = _file_include($path);


Метод 3 используется только внутри класса
protected function _file_include($path) {
  if (!file_exists($path)) {
    return false;
  }

  include_once($path);

  unset($path);

  if (!get_defined_vars()) {
    return;
  }

  foreach(get_defined_vars() as $key => $value) {
    $this->{$key} = $value;
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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