Bir PHP işlevini ve işaretiyle başlatmak ne anlama gelir?


129

Facebook kitaplığını içinde şu kodla kullanıyorum:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

İşlev tanımının başındaki & ne anlama geliyor ve böyle bir kitaplığı nasıl kullanabilirim (basit bir örnekte)

Yanıtlar:


157

Bir işlev adından önce gelen ve işareti, işlevin değer yerine değişkene bir başvuru döndüreceği anlamına gelir.

Başvuruya göre döndürme, bir başvurunun hangi değişkene bağlanması gerektiğini bulmak için bir işlev kullanmak istediğinizde kullanışlıdır. Performansı artırmak için referansa göre iade kullanmayın. Motor bunu otomatik olarak kendi kendine optimize edecektir. Referansları yalnızca bunu yapmak için geçerli bir teknik nedeniniz olduğunda gönderin.

Geri Dönen Referanslara bakın .


1
Yani, fazla ayrıntıya girmeden, (sınıfın somutlaştırıldığı) $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2) gibi bir şey çağırırsınız; ? Sanırım buradaki nüanstan emin değilim, yine de yardım için teşekkürler.
Alex Mcp

2
Evet - ben buna öyle derim.
Dominic Rodger

16

Daha önce de belirtildiği gibi, bir referans döndürüyor. PHP 4'te nesneler, diğer herhangi bir değer gibi, değere göre atanırdı. Bu oldukça sezgisel değildir ve diğer dillerin çoğunun çalışma şekline aykırıdır.

Problemi aşmak için nesnelere işaret eden değişkenler için referanslar kullanıldı. PHP 5'te referanslar çok nadiren kullanılır. Bunun eski kod veya PHP 4 ile geriye dönük uyumluluğu korumaya çalışan kod olduğunu tahmin ediyorum.


Resmi Facebook PHP kitaplığı, FWIW.
Alex Mcp

4
@Alex: Bu durumda, muhtemelen bunu php4 kullanan sıradan bilgisayar korsanlarını kendilerinden korumak için yapıyorlar. Bunu kendi kodunuzda yapmamalısınız - Kullanımdan kaldırılmıştır.
troelskn

3
"Bu son derece mantıksız ve diğer dillerin çoğunun nasıl çalıştığına aykırı." Daha fazla katılamazdım.
Orbit'te Hafiflik Yarışları

5
@WildlyInaccurate: Varsayılan olarak nesneleri referans olarak atamak, ki bu .NET ve Java'da (bence) olan şey, son derece mantıksız. Diğer dillerin çoğunda, atama, ister bir "nesneniz", ister ilkel ya da her neyse, kopya yoluyla yapılır ve zamanın başlangıcından beri durum bu olduğundan, dünyanın bağlı kalması gereken şey budur.
Orbit'te Hafiflik Yarışları

4
Bir şeyin sezgisel olup olmadığı muhtemelen özneldir. Ancak PHP'ye başka şekilde benzeyen diller için kural, nesneleri referans olarak iletmektir. OOP ile ilgili olarak, bunun en sezgisel yol olduğunu söyleyebilirim, çünkü OOP durumu kapsüllemekle ilgilidir, bu nedenle programlar genellikle onu klonlamak yerine bu duruma başvurur.
troelskn

4

Bu genellikle PHP'de Dönen referans veya Referansla dönen olarak bilinir .

Başvuruya göre döndürme, bir başvurunun hangi değişkene bağlanması gerektiğini bulmak için bir işlev kullanmak istediğinizde yararlıdır. Performansı artırmak için referansa göre iade kullanmayın. Motor bunu otomatik olarak kendi kendine optimize edecektir. Referansları yalnızca bunu yapmak için geçerli bir teknik nedeniniz olduğunda gönderin.

Dönen referansla ilgili PHP belgeleri

Bir referans PHP'de basit bir değişkenin içeriği atanan başka adıdır. PHP referansları C programlamadaki işaretçiler gibi değildir, gerçek bellek adresleri değildir, bu nedenle işaretçi aritmetiği için kullanılamazlar.

Referansları geri verme kavramı, özellikle yeni başlayanlar için çok kafa karıştırıcı olabilir, bu nedenle bir örnek yardımcı olacaktır.

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

Önceden getPopulationCount()tanımlanan işlev &, içeriğine veya değerine başvuruyu döndürür $populationCount. Yani, artırma $countryPopulation, aynı zamanda artışlar $populationCount.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.