Verilmesi PHP () 'd dosya ana değişken kapsamını

2 Cevap php

Bu olarak adlandırıldı birine bir ana kapsamında kullanılmak üzere dahil bir dosya için yine de var mı? Aşağıdaki örnek basitleştirilmiş, ancak aynı işi yapar edilir.

Özünde, bir dosya bir fonksiyon tarafından dahil edilecek, ancak dahil işlevi çağrıldı nerede kapsamı olması dahil dosya kapsamını istiyorum.

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);

Thanks in advance,
Alexander.

EDIT: Solution

Well, sort of, thanks to the contributions by Chacha102.
Can be called from within a class now too!

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()
  );

Eğer bir yöntem başvurmak istiyorsanız, kamu olmak zorunda, ama beklendiği gibi sonuç:

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

Şimdi, bu gerçekten herhangi bir pratik kullanımı yoktur, ve ben inatçı çünkü ben bunu bilmek istedim tek nedeni budur. Düşünce aklıma geldi ve beni yenmek izin vermedi: D

<rant>
Thanks to all who contributed. Except the person who boo'd me. It was a simple enough question, and have now figured out that (complicated) solution exists.
Screw whether it "conforms to the PHP way of doing things". Ever told a client "Oh no, we shouldn't do that, it's not the correct way to do things!"? Thought not.
</rant>

Tekrar teşekkürler Chacha102 için :)

2 Cevap

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

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

get_defined_vars() içeri denir kapsamında tanımlanan tüm değişkenleri alır extract() bir dizi alır ve yerel değişkenler olarak tanımlar.

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

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

Bu nedenle, istenen sonuç elde edilmektedir. Onları kötü olabilir yazılmadan gibi, ancak değişkenleri superglobal'leri ve malzeme dışında şerit isteyebilirsiniz.

Kötü olanları dışarı sıyırma için bu comment göz atın.

Ters almak için, böyle bir şey yapabilirsiniz:

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();

Bu PHP nasıl inşa edildiği gibi değildi Ama bütün olarak, ben, sen istenen etkiyi almak için gidiyoruz sanmıyorum.

Ben nasıl biliyorum tek yolu superglobal dizi kullanmaktır.

main.php:

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

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

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

included.php:

<?php
  $GLOBALS['myResult'] = strlen($GLOBALS['myVar']);