(PHP 4, PHP 5)
extract — Bir dizideki değişkenleri simge tablosuna dahil eder
$dizi
[, int $çıkarım_türü
= EXTR_OVERWRITE
[, string $önek
]] )Bir dizideki değişkenleri simge tablosuna dahil eder.
Her anahtarın geçerli bir değişken adı olup olmadığına bakmaktan başka bu değişkenlerin simge tablosundakilerle çakışıp çakışmadığına da bakar.
dizi
Bir ilişkisel dizi. Bu işlev anahtarları değişken ismi, değerleri de
değişkenin değeri olarak değerlendirir. Her anahtar/değer çifti için
simge tablosunda çıkarım_türü
ve
önek
'e uygun bir değişken oluşturulur.
EXTR_PREFIX_ALL
veya
EXTR_PREFIX_INVALID
kullanmadıkça bir sayısal
indisli dizi sonuç üretmeyeceğinden bir ilişkisel dizi kullanmanız
gerekir.
çıkarım_türü
Geçersiz veya sayısal anahtarların ve çakışmaların ele alınma yöntemini belirtmek için kullanılır. Aşağıdaki değerlerden biri olmalıdır:
EXTR_OVERWRITE
EXTR_SKIP
EXTR_PREFIX_SAME
önek
konur.
EXTR_PREFIX_ALL
önek
konur.
EXTR_PREFIX_INVALID
önek
konur.
EXTR_IF_EXISTS
EXTR_PREFIX_IF_EXISTS
EXTR_REFS
dizi
değerlerine gönderimli iseler bu
anlamlıdır. Bu seçeneği tek başına ya da VEYAlamak suretiyle başka
bir seçenekle birlikte kullanabilirsiniz.
çıkarım_türü
belirtilmezse
EXTR_OVERWRITE
belirtilmiş sayılır.
önek
Bu değiştirge sadece çıkarım_türü
olarak
EXTR_PREFIX_SAME
,
EXTR_PREFIX_ALL
,
EXTR_PREFIX_INVALID
veya EXTR_PREFIX_IF_EXISTS
belirtilmişse
anlamlıdır. Önekli bir sonuç geçerli bir değişken ismi oluşturmuyorsa
simge tablosuna dahil edilmez. Önekler dizi anahtarlarından özdevinimli
olarak bir altçizgi karakteri ile ayrılırlar.
Simge tablosuna başarıyla eklenen değişkenlerin sayısı.
Sürüm: | Açıklama |
---|---|
4.3.0 |
EXTR_REFS seçeneği eklendi.
|
4.2.0 |
EXTR_IF_EXISTS ve
EXTR_PREFIX_IF_EXISTS
eklendi.
|
4.0.5 |
Dahil edilen değişken sayısını döndürür oldu.
EXTR_PREFIX_INVALID eklendi.
EXTR_PREFIX_ALL sayısal isimli değişkenleri
de içerir oldu.
|
Örnek 1 - extract() örneği
extract() işlevinin olası kullanımlarınadn biri de wddx_deserialize() tarafından döndürülen ilişkisel dizi içeriğinin simge tablosuna dahil edilmesidir.
<?php
/* Dizinin wddx_deserialize tarafından döndürülen
bir dizi olduğunu varsayalım */
$boyut = "büyük";
$dizi = array("renk" => "mavi",
"boyut" => "orta",
"şekil" => "küre");
extract($dizi, EXTR_PREFIX_SAME, "wddx");
echo "$renk, $boyut, $şekil, $wddx_boyut\n";
?>
Yukarıdaki örneğin çıktısı:
mavi, büyük, küre, orta
$wddx_boyut değişkeninin oluşturulmasını sağlayan
EXTR_PREFIX_SAME
seçeneğini belirttiğimizden
$boyut değişkeninin üzerine yazılmaz. Eğer seçenek
olarak EXTR_SKIP
belirtmiş olsaydık
$wddx_boyut değişkeni oluşturulmazdı.
EXTR_OVERWRITE
belirtseydik,
$size "orta" değerine sahip olacaktı. Eğer
EXTR_PREFIX_ALL
belirtmiş olsaydık
$wddx_renk,
$wddx_boyut ve
$wddx_şekil değişkenlerini oluşturmuş olurduk.
extract() işlevini kullanıcı girdisi
($_GET, $_FILES, vb.) gibi güvenilmez
veriler üzerinde kullanmayın. Aksi takdirde, örneğin, register_globals yönergesinin 'On'
olmasını gerektiren eski kodları geçici olarak çalıştırmak isterseniz
EXTR_SKIP
gibi üste yazmayan
çıkarım_türü
değerlerini kullanmaya ve php.ini dosyasındaki variables_order yönergesinde tanımlı
sırada çıkartmaya çalışın.
Bilginize:
Eğer register_globals yönergesini etkin kılar ve $_FILES üzerinde extract() kullanıp
EXTR_SKIP
belirtirseniz hiç beklenmedik bir sonuç alabilirsiniz.UyarıUygulamada bu önerilmez ve bir şeyleri eksik bırakmamak için burada belgelendirmekle yetinilmiştir. Yukarıda belirtildiği gibi, register_globals kullanımı artık önerilmemekte ve $_FILES gibi güvenilir olmayan veriler üzerinde extract() kullanımı olası bir güvenlik riskini beraberinde getirebilir. Böyle bir durumla karşılaşırsanız en azından bu iki kötü kodlama uygulamasından birini kullanıyorsunuz demektir.
Sonuç olarak şöyle bir şeyler umabiliriz:<?php
/* Yüklenecek dosyanın ismi $testfile ve
'register_globals on' olsun. */
var_dump($testfile);
extract($_FILES, EXTR_SKIP);
var_dump($testfile);
var_dump($testfile['tmp_name']);
?>Ancak, bunun yerine aşağıdaki gibi bir şeylaer görürüz:string(14) "/tmp/phpgCCPX8" array(5) { ["name"]=> string(10) "somefile.txt" ["type"]=> string(24) "application/octet-stream" ["tmp_name"]=> string(14) "/tmp/phpgCCPX8" ["error"]=> int(0) ["size"]=> int(4208) } string(14) "/tmp/phpgCCPX8"string(14) "/tmp/phpgCCPX8" string(14) "/tmp/phpgCCPX8" string(1) "/"Bunun sebebi, register_globals 'on' olduğundan dolayı extract() çağrısı yapıldığında $testfile değişkeninin küresel etki alanında mevcut olması ve
EXTR_SKIP
belirtilmesi nedeniyle$_FILES
dizisinin içeriğinin $testfile üzerine yazılmaması, dolayısıyla $testfile'ın bir dizge olarak kalmasıdır. Dizgelere dizi sözdizimi kullanılarak erişilebildiğinden ve sayısal olmayan tmp_name dizgesi 0 olarak yorumlandığından, PHP, $testfile['tmp_name'] ifadesini $testfile[0] olarak görür.