سؤال

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" في الصفيف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top