w3schools - ماذا يعني المشغلان "= &" و "&=" في PHP؟




w3school php (2)

= &

يتحول $a =& $b $a إلى اسم مستعار $b . إذا تم تغيير قيمة $a أو مرجع $a ، فستتغير قيمة $b مرجعه وفقًا لذلك.

يختلف هذا عن "الإشارة إلى نفس المكان" عندما يتعلق الأمر بالكائنات: يمكنني القيام به $c = $d = new AnObject( ) ، ويشير كلا المتغيرين إلى نفس المكان. ومع ذلك ، تغيير حيث لن تتغير نقطة واحدة حيث النقاط الأخرى. أي $c = null لن يجعل $d = null . في حالة $a =& $b ، ومع ذلك ، فإن $a = null ستجعل $b = null .

ملاحظة: رسميًا ، تسمى الأسماء المستعارة فعليًا المراجع. المصطلحات الرسمية هي تسمية خاطئة ، وهي بالتأكيد غامضة ، لذا اخترت استخدام مصطلح "alias" بدلاً من ذلك. للحصول على الوثائق ، راجع php.net .

الاستخدامات والآثار

مع القيم العددية ، =& هو نوع من مثل التفاف القيمة في كائن ، بحيث يمكنك تغيير القيمة عالميا بين عدة متغيرات. مع الأنواع التي يتم تمريرها عادةً بالمراجع (الكائنات) ، =& يوفر مرجع إلى مرجع.

أميل إلى استخدام =& عندما أعمل مع الصفيفات المرافقة. بدلاً من إعادة كتابة $foo['bar']['foobar'] عدة مرات ، يمكنني إنشاء اسم مستعار: $foobar =& $foo['bar']['foobar'] . هذه حتى تعمل إذا كان المؤشر غير موجود حتى الآن. إذا كان $foo['bar']['foobar'] غير موجود ، فإن isset($foobar) سيكون غير صحيح. إنه أفضل من استخدام متغير قديم بسيط ، لأنه يمكنني إنشاء الاسم المستعار قبل الاختبار لوجود المفتاح دون تشغيل خطأ.

فقط تأكد من عدم تعيين ( unset($foobar) ) الاسم المستعار عند الانتهاء من ذلك. وإلا ، إذا أعدت استخدام اسم المتغير لاحقًا ، فستنتهي في الكتابة فوق ما كان يشير إليه الاسم المستعار.

يمكنك استخدام الأسماء المستعارة بطرق أخرى أيضًا - فهي لا تقتصر على المهام. انهم يعملون مع:

  • foreach loops: foreach ($a as &$b) الكتابة إلى $b ستستبدل القيمة المقابلة في $a . ألغ تحديد $b عند الانتهاء ، أو ستواجه مشكلات غريبة!
  • وظيفة / طريقة المعلمات: function foobar(&$a) تخصيص إلى $a داخل foobar سيغيّر أيّ متغيّر المتّجولين مرّ ك $a .
  • وظيفة / طريقة إرجاع القيم: function &foobar() يمكن تعديل ما يتم إرجاعه من قبل المتصل. هذا مفيد لتمرير حول الأسماء المستعارة. من السهل أيضًا إساءة الاستخدام.
  • المصفوفات: $a = array(&$b) أي تغييرات على $a[0] ستؤثر الآن على $b ، بما في ذلك التعيينات.
  • call_user_func_array: call_user_func('foobar', array(&$a)) افتراض أن foobar يأخذ معلمة foobar واحدة ، يمكن الآن foobar تعديل $a . هذا يسمح لك باستدعاء وظائف / طرق مع معلمات call_user_func_array باستخدام call_user_func_array .

أمثلة

سكالارس

$original = 1;
$copy = $original;
$reference =& $original;
// All three variables == 1.

$reference = 2;
// $original == 2, $reference == 2, $copy == 1

$original = 3;
// $original == 3, $reference == 3, $copy == 1

$copy = 4;
// $original == 3, $reference == 3, $copy == 4

شاء

#!/usr/bin/env php
<?php
class Object
{
        private $properties;

        public function __construct(array $properties = array())
        {
                $this->properties = $properties;
        }

        public function __isset($key)
        {
                return isset($this->properties[$key]);
        }

        public function __unset($key)
        {
                unset($this->properties[$key]);
        }

        public function __get($key)
        {
                return isset($this->$key) ? $this->properties[$key] : null;
        }

        public function __set($key, $value)
        {
                $this->properties[$key] = $value;
        }

        public function __toString()
        {
                return print_r($this->properties, true);
        }
}

function print_vars()
{
        global $original, $ref, $refref;

        echo
                '$original: ', $original,
                '$ref: ', $ref,
                '$refref: ', $refref,
                PHP_EOL;
}

$original = new Object(array('a' => 1, 'b' => 2, 'c' => 3));
$ref = $original;
$refref =& $original;
print_vars();
/*
$original: Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
$ref: Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
$refref: Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
*/

$original->a = 'duck';
$ref->b = 'moose';
$refref->c = 'cow';
print_vars();
/*
$original: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
$ref: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
$refref: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
*/

// This carries over to $refref, but not $ref.
$original = new Object(array('x' => 1, 'y' => 2, 'z' => 3));
print_vars();
/*
$original: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
$ref: Array
(
    [a] => duck
    [b] => moose
    [c] => cow
)
$refref: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
 */

// This does *not* carry over to $original or $ref.
$ref = new Object(array('o' => 42, 'm' => 123, 'n' => 1337));
print_vars();
/*
$original: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
$ref: Array
(
    [o] => 42
    [m] => 123
    [n] => 1337
)
$refref: Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
*/

// This *does* carry over to $original, but not $ref.
$refref = new Object(array('alpha' => 10, 'beta' => 20, 'gamma' => 30));
print_vars();
/*
$original: Array
(
    [alpha] => 10
    [beta] => 20
    [gamma] => 30
)
$ref: Array
(
    [o] => 42
    [m] => 123
    [n] => 1337
)
$refref: Array
(
    [alpha] => 10
    [beta] => 20
    [gamma] => 30
)
*/
?>

& =

&= غير مرتبط بـ =& . انها تأتي من مجموعة من عمليات الاحالة. إليك بعض ما يلي:

  • +=
  • -=
  • *=
  • /=

انظر الاتجاه هنا؟

لدى مشغلي الحساب الثنائي بشكل عام نظراء مهام. لنفترض أن @ عامل تشغيل حسابي (ليس كما هو الحال في الكتابة) ، حيث أن $a @ $b عادة ما ينتج عنه رقم عندما يكون $a و $b أرقامًا. (فكر: الإضافة ، الضرب ، القسمة ، إلخ). كم مرة تحتاج إلى القيام بشيء كهذا؟

$a = $a @ $b;

كثيرا جدا. ألا يبدو من غير الضروري أن نكرر $a ؟ العديد من اللغات ، بما في ذلك لغة PHP ، تحل هذه المشكلة مع مجموعة من مشغلي المهام:

$a @= $b;

أبسط من ذلك بكثير ، وإلى مبرمج اعتاد على هذا الترميز ، ربما أكثر إيجازية وصفي في لمحة. (بالتأكيد أجد أنه من الأسهل للقراءة ، بما أنني معتاد على ذلك). لذلك ، مضاعفة متغير:

$a *= 2;

وصف سريع وسهل وصوري نسبيًا. تقوم بعض اللغات ، بما في ذلك لغة PHP ، بتمديد هذه الميزة خارج الحساب لإجراء عملية إضافية أو اثنين. ومن أبرزها:

$a = $a . 'Appended text';
// Is the same as:
$a .= 'Appended text';

مفيد جدا.

&= يقع بين عوامل التشغيل هذه ، لأن & يمثل حسابية AND العملية . هناك عدد قليل من الآخرين مدرجين في وثائق PHP (انظر الرابط المذكور آنفاً) ، وكلها مشتركة بين العديد من لغات البرمجة.

وهذا يعني أن $a &= $b هي نفس $a = $a & $b .

ماذا تعني "= &" / "& =" عوامل التشغيل في PHP؟ أين يمكنني قراءة المعلومات عنهم؟

البحث عن Google لا يساعد.


$a &= $b قصير بـ $a = $a & $b وهو عامل bitwise-and .

$a =& $b يعين $ a reference لـ $ b.







operators