PHP 5.x Referans Passing

4 Cevap php

Ben Zend PHP5 Sertifikasyon için çalışıyorum, her şey iyi görünüyor ama benim başvuru geçirmeden veya değişkenleri dönen gerçek dünya örnekleri bulamıyorum.

Bunu kullanmak için birisi bir örnek vardır eğer, çok güzel olurdu?

4 Cevap

Diyelim ki bir diziden belli değerleri çıkaran bir fonksiyon yazmak istiyorum diyelim.

function remove_elements($array, $item1, $item2, ...) {
  ...
}

Sen diziyi kopyalamak ve geri dönebilirler. Ama ne bir şey çıkarıldı olmadığını bilmek istiyorum? Bunun yerine dizi in-place değiştirmek ve kaldırıldı elemanların sayısını döndürür. Yani:

function remove_elements(&$array) {
  // remove elements
  return $number_removed;
}

Eğer fonksiyon içinde karmaşık bir yapı oluşturmak Eğer doğrusu bunun bir kopyasını daha kendisine bir başvuru döndürmek isteyebilirsiniz. Ancak PHP üzerine kopyalama-yazma kullandığı için bu oldukça marjinal bir durumdur (modifiye olana kadar yani onun kopyalanmış değil) ama bazı geçerli kullanım durumlar vardır.

Bir sınıfın bir üye işlevi yazarken referans dönen daha mantıklı. Sen bir veri üyesi bir başvuru döndürmek olabilir ama bu aynı zamanda kapsüllemeyi kırabilir.

Son olarak, tüm nesneleri geçti ve varsayılan referans ile döndürülen fazlalaştı. Her şey geçti ve değerine göre döndürülür.

Referans olarak geçmek gibi: fonksiyonlar asort()

$array = array(3, 2, 1);
asort($array);

PHP5 nesneler varsayılan olarak başvuruya göre iletilir. (Doğru bir açıklama için bakınız http://docs.php.net/language.oop5.references)

Referans geçen argümanlar zaten cevap olmuştur ...

Herhangi bir fluent interface bir yöntem kendi arama-bağlamında (bu $) gibi aynı nesneye bir başvuru döndürür nerede almak referans tarafından bir dönüş değeri için (gerçek dünya) örnek olarak. Dönüş değeri bir kopyasını / klon olsaydı bu (beklendiği gibi) işe yaramaz.

Örneğin

class MyClass {  
  protected $foo = 'n/a';
  protected $bar = 'n/a';

  function foo($val) {
    $this->foo = (int)$val;
    return $this;
  }

  function bar($val) {
    $this->bar = (int)$val;
    return $this;
  }

  function __toString() {
    return 'foo='.$this->foo.' bar='.$this->bar;
  }
}

$o = new MyClass;
$o->foo(1)
  ->bar(2);
echo $o;

This prints foo=1 bar=2 and I think that's the result one would expect, no surprises here. If the method returned $this by value, it wouldn't work anymore. You can test that by forcing php to return a copy. Instead of the return $this lines use

return clone $this;

ve çıkış olacaktır

foo=1 bar=n/a

(Ve ben ;-) bu sezgisel arayüzü demezdim)

Bu yararlı olabilir, sen chainig çalışmak eğer, gibi:

    public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}

....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();

... Sry. Volkers aynı: ben biliyorum gibi ((ana dil Interface) zincirleme edilir.

Görüntü bir yük yöntemi ile bir akıcı arayüzüne sahiptir. Yük arayüzü bazı verileri değiştirmek veya ekler. Burada yük başarılı olduğunu belirlemek için referans değeri $ başarı ile bir çağrı ile hareket etmek yararlı olabilir.

Return by reference: Take some database-objects having a list of rows. The Nr. of rows points to right data of all objects (parallesl). If you return the nr. and pass it to the next object, you can skip the row in one object and skip in the others too. Always having a valide bunch of objects.