Οι PHP μεταβλητές που ψηφίστηκε από την αξία ή με αναφορά;

ψήφοι
174

Οι μεταβλητές της PHP που ψηφίστηκε από την αξία ή με αναφορά;

Δημοσιεύθηκε 03/08/2008 στις 23:51
πηγή χρήστη
Σε άλλες γλώσσες...                            


13 απαντήσεις

ψήφοι
215

Είναι με βάση την αξία, σύμφωνα με την τεκμηρίωση της 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.'
?>
Απαντήθηκε 04/08/2008 στις 00:06
πηγή χρήστη

ψήφοι
52

Φαίνεται ότι πολλοί άνθρωποι μπερδεύονται με τον τρόπο που τα αντικείμενα περάσει λειτουργίες και ποιες πάσα από τον μέσο αναφοράς. μεταβλητές αντικειμένου εξακολουθούν να περάσει από την αξία του μόνο την αξία που έχει περάσει σε 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

προκειμένου να περάσει δι 'αναφοράς.

Απαντήθηκε 11/08/2008 στις 03:09
πηγή χρήστη

ψήφοι
37

Στην 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.

Ελπίζω ότι μπορείτε να καταλάβετε αυτό.

Απαντήθηκε 14/03/2012 στις 07:09
πηγή χρήστη

ψήφοι
24

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

Στην PHP 5 υπάρχει ένα νέο μοντέλο αντικειμένου. PHP χειρισμό των αντικειμένων έχει εντελώς ξαναγραφεί, επιτρέποντας την καλύτερη απόδοση και περισσότερα χαρακτηριστικά. Σε προηγούμενες εκδόσεις της PHP, αντικείμενα αντιμετωπίζονται σαν πρωτόγονα είδη (π.χ. ακέραιοι και έγχορδα). Το μειονέκτημα αυτής της μεθόδου ήταν ότι σημασιολογικά το σύνολο του αντικειμένου αντιγράφηκε όταν ανατέθηκε μια μεταβλητή, ή έχει περάσει ως παράμετρος σε μια μέθοδο. Στη νέα προσέγγιση, τα αντικείμενα που αναφέρονται από τη λαβή, και όχι με βάση την αξία (μπορεί κανείς να σκεφτεί μια λαβή ως αναγνωριστικό ενός αντικειμένου).

Απαντήθηκε 04/08/2008 στις 00:57
πηγή χρήστη

ψήφοι
19

Οι μεταβλητές 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: foo, ΜΠΑΡ 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";
}

Θα εξόδου:

FOO

(Αυτό το τελευταίο παράδειγμα θα μπορούσε να είναι καλύτερη ίσως ...)

Απαντήθηκε 03/08/2008 στις 23:52
πηγή χρήστη

ψήφοι
7

Μπορείτε να περάσετε μια μεταβλητή σε συνάρτηση με αναφορά. Η λειτουργία αυτή θα είναι σε θέση να τροποποιήσει την αρχική μεταβλητή.

Μπορείτε να ορίσετε το πέρασμα με αναφορά στον ορισμό της συνάρτησης:

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Απαντήθηκε 21/12/2014 στις 09:27
πηγή χρήστη

ψήφοι
5

Μπορείτε να το κάνετε είτε τρόπο.

βάλετε ένα σύμβολο «&» μπροστά και η μεταβλητή που περνά γίνεται ένα και το ίδιο με την προέλευσή του. δηλαδή: μπορείτε να περάσετε με αναφορά, αντί να κάνει ένα αντίγραφό του.

Έτσι

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Απαντήθηκε 22/02/2009 στις 10:17
πηγή χρήστη

ψήφοι
4

Οι μεταβλητές που περιέχουν πρωτόγονα είδη που ψηφίστηκε από αξία σε PHP5. Οι μεταβλητές που περιέχουν αντικείμενα πέρασε δια αναφοράς. Υπάρχει μια αρκετά ενδιαφέρον άρθρο από το Linux Εφημερίδα από το 2006 που αναφέρεται σε αυτό και άλλες διαφορές OO μεταξύ 4 και 5.

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

Απαντήθηκε 04/08/2008 στις 01:05
πηγή χρήστη

ψήφοι
1
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: B, A SwapValues: α, β

Απαντήθηκε 11/05/2010 στις 16:51
πηγή χρήστη

ψήφοι
1

Τα αντικείμενα που ψηφίστηκε από αναφορά σε PHP 5 και σε αξία σε PHP 4. Οι μεταβλητές που ψηφίστηκε από την αξία από προεπιλογή!

Διαβάστε εδώ: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

Απαντήθηκε 09/01/2010 στις 17:34
πηγή χρήστη

ψήφοι
0

Χρησιμοποιήστε αυτό για τις λειτουργίες όταν θέλετε να αλλάξετε απλά την αρχική μεταβλητή και να επιστρέψει ξανά στο ίδιο όνομα μεταβλητής με τη νέα αξία του έχουν ανατεθεί.

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
Απαντήθηκε 31/03/2018 στις 12:34
πηγή χρήστη

ψήφοι
0

Στην πραγματικότητα και οι δύο μέθοδοι είναι έγκυρες, αλλά αυτό εξαρτάται από τις τιμές requirement.Pass σας με αναφορά κάνει συχνά το σενάριο σας αργή. Έτσι, καλύτερα να περάσει μεταβλητές με βάση την αξία λαμβάνοντας υπόψη το χρόνο εκτέλεσης. Επίσης, η ροή του κώδικα είναι πιο συνεπείς όταν περνάτε μεταβλητές με βάση την αξία.

Απαντήθηκε 15/07/2015 στις 11:25
πηγή χρήστη

ψήφοι
-6

Εξαρτάται από την έκδοση 4 είναι με βάση την αξία, 5 είναι με αναφορά.

Απαντήθηκε 03/08/2008 στις 23:52
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more