PHP diziden bir nesne dönen referans sorun olduğunda

4 Cevap php

Ben bir referans sorun var; örnek benden daha açıklayıcı olmalıdır: P

Ben bir nesneler dizisi ve bir ilişkisel dizi gibi, bir anahtar (dize) yoluyla almak olan bir sınıf vardır:

class Collection {

    public $elements;

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

    public function get_element($key) {

        foreach($this->elements as $element) {
            if ($element->key == $key) {

                return $element;
                break;
            }
        }
        return null;

    }

    public function add_element ($element) {
        $this->elements[] = $element;
    }

}

Sonra ben bir anahtar ve bazı değişkenler ile, (jenerik) bir nesne var:

class Element {

    public $key;
    public $another_var;

    public function __construct($key) {
        $this->key = $key;
        $this->another_var = "default";
    }
}

Şimdi, benim bir koleksiyon oluşturmak:

$collection = new Collection();

$collection->add_element(new Element("test1"));
$collection->add_element(new Element("test2"));

Ve sonra benim "dizisindeki" bulunan bir elementin değişkeni değiştirmeye çalışın:

$element = $collection->get_element("test1");
$element->another_var = "random_string";
echo $collection->get_element("test1")->another_var;

Tamam, çıktı

random_string

bu yüzden benim nesne başvuru modunda $ elemanına geçirilmektedir biliyoruz.

Ama eğer, bunun yerine:

$element = $collection->get_element("test1");
$element = null; //or $element = new GenericObject();
$element->another_var = "bla";
echo $collection->get_element("test1")->another_var;

çıktıdır

default

gibi referans kaybederse.

Peki, sorun ne? Ben elemanın değişkenlere değil elemanın kendisi için başvuruları var?

Herhangi bir fikir?

edit: açıklığa kavuşturmak için, ben başka "değişim" nesne öğesi, ancak dizideki konumunu tutmak istiyorum.

(: Şimdi ben bu şekilde mümkün değil anlamak

4 Cevap

Your changing the another_var variable on an element which is pointing to null. This means your not changing the collection element at all. That's why you get the value "default"...

Eğer referansları ile çalışıyorsanız bile, referanslar kendileri değer geçirilir. Bu net yapmak gerekir:

$a = new Object();
$b = $a;
$a = null;

$b Bu durumda new Object() hala.

Edit:

O pozisyonda nesneyi değiştirmek istiyorsanız, size Koleksiyon (belki bir ilişkisel dizi) erişmek ve o konumda nesneyi değiştirmek zorunda. Bir set_element ($ key, $ değer) sağlayarak bunu yapabilirdi.

<? 

class Collection
{
  private $elements;

  public set_element($key, $value)
  {
     $elements[$key] = $value;
  }

  public get_element($key)
  {
     return $elements[$key];
  }
}

?>

$element nesnesine referans var, bu doğru, ama eğer

$element = null; //or $element = new GenericObject();

Eğer $element için yeni bir değer atamak ve önceki nesneye başvuru gevşek.

Eğer bunu yaparsam:

$element = new A();

ve daha sonra

$element = new B();
$element->foo();

Yeni bir değer $element atandı gibi foo class B bir nesne olup A erişim yöntemi.

Eğer bir referans alınma ve değişkene atanan $element. Sonra yerine eski nesneyi manipüle yeni bir nesneye başvurmak için değişken geçti.

Bunu ne zaman:

$element = null;
$element->another_var = "bla";

you are setting the value of another_var to a null object, because $element is now null. If you try this

$element->another_var = "bla";    
$element = null;

sonra çalışması gerekir