Предоставление PHP включают () 'd файлы, порождает переменный объем

Существует ли так или иначе к тому, чтобы включенный файл привык в родительском объеме к тому, который он был призван? Следующий пример упрощен, но делает то же задание.

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

main.php:

<?php
  if(!function_exists('myPlugin'))
  {
    function myPlugin($file)
      {
        if(file_exists($file)
        {
          require $file;
          return true;
        }
        return false;
      }
  }

  $myVar = 'something bar foo';

  $success = myPlugin('included.php');

  if($success)
  {
    echo $myResult;
  }

included.php:

<?php
  $myResult = strlen($myVar);

Заранее спасибо,
Alexander.

Править: Решение

Ну, вид, благодаря вкладам Chacha102.
Может быть назван из класса теперь также!

main.php

<?php
  class front_controller extends controller
  {
    public function index_page()
    {
      $myVar = 'hello!';

      // This is the bit that makes it work.
      // I know, wrapping it in an extract() is ugly,
      // and the amount of parameters that you can't change...
      extract(load_file('included.php', get_defined_vars(), $this));

      var_dump($myResult);
    }
    public function get_something()
    {
      return 'foo bar';
    }
  }

  function load_file($_file, $vars = array(), &$c = null)
  {
    if(!file_exists($_file))
    {
      return false;
    }
    if(is_array($vars))
    {
      unset($vars['c'], $vars['_file']);
      extract($vars);
    }
    require $_file;
    return get_defined_vars();
  }

included.php:

<?php
  $myResult = array(
    $myVar,
    $c->get_something()
  );

Если Вы хотите сослаться на метод, это должно быть общедоступно, но результат как ожидалось:

array(2) {
  [0]=>
  string(6) "hello!"
  [1]=>
  string(7) "foo bar"
}

Теперь, это действительно не имеет никакого практического применения и единственной причины, которую я хотел знать, как сделать, это вызвано тем, что я упрям. Мысль пришла в мою голову и не позволит ему победить меня: D

<rant>
Благодаря всем, кто способствовал. Кроме человека, кто boo'd меня. Это было достаточно простым вопросом и теперь выяснило, что (сложное) решение существует.
Винт, соответствует ли это "способу PHP сделать вещи". Никогда сказанный клиент "О нет, мы не должны делать этого, это не корректный способ сделать вещи!"? Мысль нет.
</rant>

Еще раз спасибо к Chacha102:)

9
задан zanbaldwin 5 February 2010 в 18:20
поделиться

2 ответа

Я бы создал стандартную (не COM/управляемую) динамическую библиотеку ссылок, как описано здесь , а затем использовал атрибут StartImport (вызов платформы) в коде c # для доступа к экспортируемым функциям.

Ключевой пункт этой статьи:

Обратите внимание на __ declspec (dllexport) модификатор в объявлениях метода в этот код. Эти модификаторы включают метод, экспортируемый библиотекой DLL, что он может быть использован другими приложения. Для получения дополнительной информации, см. dllexport, dllimport.

Это более легкая весовая альтернатива фактической оболочке COM-взаимодействия и позволяет избежать таких проблем, как регистрация и т.д. (DLL можно просто поместить в каталог приложения) .

Другой альтернативой является Он просто работает (IJW). Возможно, это лучший выбор, если вы управляете кодом C++ и должны получить к нему доступ с других языков .NET. Но это только вариант, если вы можете/рады конвертировать ваш неуправляемый C++ в управляемый C++, хотя.

-121--922063-

Единственный способ использовать сверхглобальный массив.

main.php:

  $GLOBALS['myVar'] = 'something bar foo';

  $success = myPlugin('included.php');

  if($success)
  {
    echo $GLOBALS['myResult'];
  }

included.php:

<?php
  $GLOBALS['myResult'] = strlen($GLOBALS['myVar']);
-121--3414205-
function include_use_scope($file, $defined_variables)
{
    extract($defined_variables);
    include($file);
}

include_use_scope("file.php", get_defined_vars());

get _ defined _ vars () получает ВСЕ переменные, определенные в области, в которой он вызывается. extract () принимает массив и определяет их как локальные переменные.

extract(array("test"=>"hello"));
echo $test; // hello

$vars = get_defined_vars();
echo $vars['test']; //hello

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

Проверьте комментарий для удаления плохих.

Для того, чтобы получить обратное, вы могли бы сделать что-то подобное:

function include_use_scope($file, $defined_variables)
{
    extract($defined_variables);
    return include($file);
}

extract(include_use_scope("file.php", get_defined_vars()));

include.php

// do stuff
return get_defined_vars();

Но в целом, я не думаю, что вы получите желаемый эффект, так как не так был построен PHP.

4
ответ дан 3 November 2019 в 08:20
поделиться

Единственный способ, который я знаю, - это использовать суперглобальный массив.

main.php:

  $GLOBALS['myVar'] = 'something bar foo';

  $success = myPlugin('included.php');

  if($success)
  {
    echo $GLOBALS['myResult'];
  }

included.php:

<?php
  $GLOBALS['myResult'] = strlen($GLOBALS['myVar']);
-1
ответ дан 3 November 2019 в 08:20
поделиться
Другие вопросы по тегам:

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