PHP - استخراج () نوع
سؤال
PHP's extract()
وظيفة يمكن أن تأخذ على واحد من عدة extract_types
. وبعد ولكن ما هو الفرق بين extr_prefix_same
و extr_prefix_if_exists
ب يجعل الدليل يبدو أنه يبدو، في كلتا الحالتين، سيتم بادئة المتغيرات الجديدة إذا كان اسم المتغير موجودا بالفعل.
شكرا!
المحلول
عند استخدام EXTR_PREFIX_IF_EXISTS
, إذا لم يكن المتغير موجودا بالفعل، فلن يتم إنشاء الإصدار البادئين أيضا. في هذا المثال:
function test() {
$a = 12345;
extract(array('a' => 1, 'b' => 2, 'c' => 3), EXTR_PREFIX_IF_EXISTS, 'my_');
var_export(get_defined_vars());
}
test();
$my_b
و $my_c
لم يتم إنشاؤها بسبب $b
و $c
لا وجود لها.
نصائح أخرى
EXTR_PREFIX_SAME
سوف استخراج الكل المتغيرات، والبادئة فقط تلك الموجودة في النطاق الحالي.
EXTR_PREFIX_IF_EXISTS
إرادة فقط استخراج المتغيرات الموجودة في النطاق الحالي، وادعمها بادئة المرغوبة.
لذلك، على سبيل المثال:
$foo = 'foo';
$bar = 'bar';
extract(array('foo' => 'moo', 'bar' => 'mar', 'baz' => 'maz'), EXTR_PREFIX_IF_EXISTS, 'prefix');
isset($prefix_foo); // true
isset($prefix_baz); // false
isset($baz); // false
في حين....
$foo = 'foo';
$bar = 'bar';
extract(array('foo' => 'moo', 'bar' => 'mar', 'baz' => 'maz'), EXTR_PREFIX_SAME, 'prefix');
isset($prefix_foo); // true
isset($prefix_baz); // false
isset($baz); // true
بناء على التعريفات اليدوية، EXTR_PREFIX_SAME
سينشئ المتغيرات بناء على اسم المفتاح، وإذا كان متغير في المساحة المحلية موجودة بالفعل، فسيتم إضافة بادئة إلى اسم المتغير.
على نقيض ذلك، EXTR_PREFIX_IF_EXISTS
سوف يبدو أن يرث سلوك EXTR_IF_EXISTS
(فقط الكتابة فوقها إذا كانت المتغيرات موجودة بالفعل)، ولكن بدلا من الكتابة فوق المتغيرات المحلية، سيتم إنشاء إصدار مسبق.
النظر فيما يلي
$array = Array();
$array['foo'] = 'foo';
$array['bar'] = 'bar';
$array['baz'] = 'baz';
$foo = 'local foo';
$bar = 'local bar';
extract($array, EXTR_PREFIX_SAME, 'pre');
print_r(get_defined_vars());
//partial output
//Array
//(
// [array] => Array
// (
// [foo] => foo
// [bar] => bar
// [baz] => baz
// )
//
// [foo] => local foo
// [bar] => local bar
// [pre_foo] => foo
// [pre_bar] => bar
// [baz] => baz
//)
حتى مع EXTR_PREFIX_SAME
, ، ستبقى قيم FOO $ وشرار $ هي نفسها، وسيتم تعريف ثلاثة متغيرات محلية جديدة ($ pre_foo، pre.bar $، $ baz). ومع ذلك إذا نستخدمنا EXTR_PREFIX_IF_EXISTS
$array = Array();
$array['foo'] = 'foo';
$array['bar'] = 'bar';
$array['baz'] = 'baz';
$foo = 'local foo';
$bar = 'local bar';
extract($array, EXTR_PREFIX_IF_EXISTS, 'pre');
print_r(get_defined_vars());
//partial output
//Array
//(
// [array] => Array
// (
// [foo] => foo
// [bar] => bar
// [baz] => baz
// )
//
// [foo] => local foo
// [bar] => local bar
// [pre_foo] => foo
// [pre_bar] => bar
//)
لا تزال قيم FOO $ وشرار $ محفوظة، ولكن يتم استيراد اثنين فقط من المتغيرات الجديدة في المساحة المحلية. منذ $ BAZ ليس متغيرا موجود بالفعل EXTR_PREFIX_IF_EXISTS
يخبر PHP بتجاهل مفتاح "Baz" في الصفيف.