Tüm değişkenler küresel yapmak için bir yolu var mı?
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
a> ile parametre değişken isimleri olsun.
Bu, aynı zamanda tam tersi daha az zor nedeni var get_defined_vars
a>, 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.
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