سؤال

هي متغيرات PHP تمريرها حسب القيمة أو مرجع ؟

هل كانت مفيدة؟

المحلول

انه من حيث القيمة وفقا PHP الوثائق.

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

أن يكون حجة على وظيفة دائما مرت الإشارة وإرفاق العطف (&) إلى الحجة الاسم في تعريف الدالة.

<?php
function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}

$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'
?>

نصائح أخرى

يبدو الكثير من الناس الحصول على الخلط من جانب الطريق الكائنات التي تم تمريرها إلى وظائف و ما تمر بالرجوع يعني.متغيرات الكائنات لا تزال تمريرها حسب القيمة فقط القيمة التي يتم تمريرها في PHP5 هو إشارة التعامل معها.كدليل:

<?php
class Holder {
    private $value;

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

    public function getValue() {
        return $this->value;
    }
}

function swap($x, $y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

النواتج:

a, b

إلى تمر الإشارة يعني يمكننا تعديل المتغيرات التي ينظر إليها من قبل المتصل.التي من الواضح رمز أعلاه لا تفعل.نحن بحاجة إلى تغيير مبادلة وظيفة:

<?php
function swap(&$x, &$y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

النواتج:

b, a

من أجل تمرير من خلال الإشارة.

في PHP, بشكل افتراضي يتم تمرير كائنات كمرجع نسخ إلى كائن جديد.

انظر هذا المثال.............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue($obj)
  {
   $obj->abc = 30;
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 30

الآن نرى هذا..............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue($obj)
  {
    $obj = new Y();
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 10 not 20 same as java does.

الآن نرى هذا ..............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue(&$obj)
  {
    $obj = new Y();
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 20 not possible in java.

آمل أن تتمكن من فهم هذا.

http://www.php.net/manual/en/migration5.oop.php

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

متغيرات PHP يتم تعيين من حيث القيمة ، تمريرها إلى وظائف من حيث القيمة ، و عندما تحتوي/تمثل الكائنات مرت الإشارة.يمكنك فرض المتغيرات التي تمر بها المرجعية باستخدام &

تعيين قيمة/مرجعية على سبيل المثال:

$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";

print ("var1: $var1, var2: $var2, var3: $var3);

سيكون الناتج

var1:الاختبار ، var2:الاختبار النهائي, var3:الاختبار النهائي

مرت القيمة/مرجع exampe:

$var1 = "foo";
$var2 = "bar";

changeThem($var1, $var2);

print "var1: $var1, var2: $var2";

function changeThem($var1, &$var2){
    $var1 = "FOO";
    $var2 = "BAR";
}

سيكون الناتج:

var1:فو, var2 بار

متغيرات الكائنات مرت الإشارة exampe:

class Foo{
    public $var1;

    function __construct(){
        $this->var1 = "foo";
    }

    public function printFoo(){
        print $this->var1;
    }
}


$foo = new Foo();

changeFoo($foo);

$foo->printFoo();

function changeFoo($foo){
    $foo->var1 = "FOO";
}

سيكون الناتج:

فو

(هذا المثال الأخير يمكن أن يكون أفضل من المحتمل...)

يمكنك تمرير متغير الوظيفة المرجعية.هذه الوظيفة سوف تكون قادرا على تعديل المتغير الأصلي.

يمكنك تحديد المقطع عن طريق الإشارة في تعريف الدالة:

<?php
function changeValue(&$var)
{
    $var++;
}

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>

يمكنك أن تفعل ذلك في أي من الحالتين.

وضع '&' الرمز في الجبهة متغير يتم تمرير يصبح واحد و نفس أصله.أي:يمكنك تمرير من قبل المرجعية ، بدلا من جعل نسخة منه.

لذلك

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.

المتغيرات التي تحتوي على أنواع بدائية يتم تمريرها حسب القيمة في PHP5.المتغيرات التي تحتوي على الكائنات مرت الإشارة.هناك مادة مثيرة للاهتمام من مجلة لينكس من 2006 الذي يذكر هذه وغيرها OO الخلافات بين 4 و 5.

http://www.linuxjournal.com/article/9170

الكائنات مرت الإشارة في PHP 5 و من حيث القيمة في PHP 4.المتغيرات يتم تمريرها حسب القيمة بشكل افتراضي!

اقرأ هنا: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

class Holder
{
    private $value;

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

    public function getValue()
    {
        return $this->value;
    }

    public function setValue( $value )
    {
        return $this->value = $value;
    }
}

class Swap
{       
    public function SwapObjects( Holder $x, Holder $y )
    {
        $tmp = $x;

        $x = $y;

        $y = $tmp;
    }

    public function SwapValues( Holder $x, Holder $y )
    {
        $tmp = $x->getValue();

        $x->setValue($y->getValue());

        $y->setValue($tmp);
    }
}


$a1 = new Holder('a');

$b1 = new Holder('b');



$a2 = new Holder('a');

$b2 = new Holder('b');


Swap::SwapValues($a1, $b1);

Swap::SwapObjects($a2, $b2);



echo 'SwapValues: ' . $a2->getValue() . ", " . $b2->getValue() . "<br>";

echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "<br>";

سمات لا تزال للتعديل عندما لا مرت الإشارة لذلك حذار.

الإخراج:

SwapObjects:ب ، SwapValues:a, b

فعلا كل الطرق صالحة ولكن ذلك يعتمد على الاحتياجات الخاصة بك.تمرير القيم بالرجوع غالبا ما يجعل السيناريو الخاص بك بطيئة.لذلك من الأفضل تمرير المتغيرات من حيث القيمة خلال النظر في وقت التنفيذ.أيضا رمز تدفق أكثر اتساقا عند تمرير المتغيرات من حيث القيمة.

استخدام هذه الوظائف عندما كنت ترغب ببساطة تغيير المتغير الأصلي وإعادته مرة أخرى إلى نفس اسم المتغير مع القيمة الجديدة المخصصة.

function add(&$var){ // The &amp; is before the argument $var
   $var++;
}
$a = 1;
$b = 10;
add($a);
echo "a is $a,";
add($b);
echo " a is $a, and b is $b"; // Note: $a and $b are NOT referenced

يعتمد على الإصدار 4 من حيث القيمة ، 5 من قبل المرجعية.

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