Tüm değişkenler yapmak, PHP

5 Cevap php

Tüm değişkenler küresel yapmak için bir yolu var mı?

5 Cevap

Tüm global değişkenler dahil ithal etmek. superglobals ve işlevleri kapsamı içine parametrelerin adlarını çatışan:

extract($GLOBALS, EXTR_REFS | EXTR_SKIP);

Sorun superglobals ile burada olduğunu. Onları dışlamak isteyebilirsiniz, burada bir liste (PHP 5.2) olan:

/**
 * PHP Superglobals
 */
array (
  1 => 'GLOBALS',
  2 => '_ENV',
  3 => 'HTTP_ENV_VARS',
  4 => '_POST',
  5 => 'HTTP_POST_VARS',
  6 => '_GET',
  7 => 'HTTP_GET_VARS',
  8 => '_COOKIE',
  9 => 'HTTP_COOKIE_VARS',
  10 => '_SERVER',
  11 => 'HTTP_SERVER_VARS',
  12 => '_FILES',
  13 => 'HTTP_POST_FILES',
  14 => '_REQUEST',
)

Sen get_defined_vars ile parametre değişken isimleri olsun.

Bu, aynı zamanda tam tersi daha az zor nedeni var get_defined_vars , yalnızca yerel değişkenler superglobal'leri dönmez.

global küresel kapsamı değişken bir referans oluşturur, bu yüzden aslında aynı adı taşıyan global değişken için bir takma ad, bir yerel değişken bulunuyor. Ayrıca bazı yerel değişkenler ihracat çatışan, bu nedenle ezoterik değişken isimleri gibi bazı önceden önlemler alınmalıdır:

foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"})
{
    $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"};
}

Gibi unutmayın globals $GLOBALS superglobal dizi de global değişkenler için referanslar içerir, bu nedenle bu burada da referans oluşturur. Bu özellikle gereklidir Eğer global veya &$GLOBALS[...] veya extract Yukarıdaki gibi yoluyla alırsanız. Yoksa özel sınıf üyelerine rumuzudur yerel değişkenleri (ki ;) yapmazsanız) varsa:

Örnek / Demo:

<?php
/**
 * Make all variables global, PHP
 * @link http://stackoverflow.com/q/1909647/367456
 */
error_reporting(~0);

function bar($goo = 1)
{
    global $foo;

    $foo++;
    $baz = 3;

    foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"})
    {
        $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"};
    }
}

$foo = 1;
bar();
echo '$goo: ', var_dump($goo); # int(1)
echo '$foo: ', var_dump($foo); # int(2)
echo '$baz: ', var_dump($baz); # int(3)

Bu yapmanız için çalışıyoruz ne olduğu önemli değil, ama bu konuda giderek kötü bir yoldur. Sadece fonksiyonlara argüman olarak değişkenleri geçen kapalı ya da orada onları küresel ilan ederek çok daha iyi olacak.

ancak kısaca, küresel tabloların bir sürü olmadan bunu yapmak için basit bir yolu yoktur.

Hızlı ve kirli bir şekilde:

$GLOBALS += get_defined_vars();

Bu kesmek taşınabilir olup olmadığını bilmiyorum (PHP 5.3.1 üzerinde çalışır) ve nesneler klonlanmış şüpheli.

Ben bu foreach($GLOBALS as $name => $value) global $$name; fonksiyonu içine koymak ve tüm tanımlı değişkenler Visibles gerekir yardımcı olabilir düşünüyorum

Onları $ GLOBALS bir referans basit yapabilir miyim

foreach($GLOBALS as $k => $v)
   $$k=&$GLOBALS[$k];

Kodun açıklaması:

$ GLOBLAS (her yerde görülebilir) bir süper küresel değişkendir. Temelde tüm değişkenleri içerir


$ $ Yazdığın değişkenin değerinin adı ile değişken demektir

Yabancı dilde açıklamak biraz garip işte bir örnek:

$color='blue';
$blue='foo';

echo $$color;

çıktısı

foo

$k=& $v;

$ k $ v için bir referans olduğu anlamına gelir