SORU
10 AĞUSTOS 2010, Salı


Birden çok işlevini verir

Böyle 2 döner ile: bir işlev için kullanmak mümkün

function test($testvar)
{
  // do something

  return $var1;
  return $var2;
}

Eğer öyleyse, nasıl her dönüş ayrı ayrı alabilir miyim?

CEVAP
26 AĞUSTOS 2010, PERŞEMBE


Teknik olarak, birden fazla değer döndürebilir. Ancak, bu kısıtlamaya bir geçici çözüm bulmak için birden fazla yolu vardır. Çoğu birden çok değer döndürmek gibi davranan, list anahtar kelime ile

function getXYZ()
{
    return array(4,5,6);
}

list($x,$y,$z) = getXYZ();

// Afterwards: $x == 4 && $y == 5 && $z == 6
// (This will hold for all samples unless otherwise noted)

Teknik olarak, bir dizi dönen ve list gerçek dizi depolamak yerine başka değerler de bu dizinin öğeleri saklamak için kullanıyorsun. Bu tekniği kullanarak yapacakhissediyorumbirden çok değer döndürmek gibi çoğu.

list çözüm php özgü bir tercih. Benzer yapılar, ama yok daha fazla dil ile az dil vardır. Genelde "çok yönlü ve hemen hemen her dili (bir şekilde) mevcut değerleri iade etmek için kullanılır. başka bir yolu yok Ancak bu yöntem biraz alışmak gerekebilir bu yüzden oldukça farklı görünecek.

// note that I named the arguments $a, $b and $c to show that
// they don't need to be named $x, $y and $z
function getXYZ(&$a, &$b, &$c)
{
    $a = 4;
    $b = 5;
    $c = 6; 
}

getXYZ($x, $y, $z);

Bu teknik aynı zamanda bazı fonksiyonları php kendisi ($count örneğin preg_match 29*,* 16*) tarafından tanımlanmış kullanılır. Bu birden çok değer döndürmek oldukça farklı hissedebilirsiniz, ama en azından hakkında bilinmesi gerekenler.

Üçüncü bir yöntem gerekir farklı değerleri tutmak için bir nesne kullanmaktır. Bu oldukça sık olarak yukarıdaki iki yöntem olarak kullanılan bu yüzden daha fazla yazmaya. Olabilir mantıklı kullanmak bu olsa da, kullanırken aynı değişkenleri bir sayı şehirler (veya tabii ki, çalışan bir dil bilmeyen destek yukarıdaki yöntemleri veya sağlar mı bu olmadan fazladan yazarak).

class MyXYZ
{
    public $x;
    public $y;
    public $z;
}

function getXYZ()
{
    $out = new MyXYZ();

    $out->x = 4;
    $out->y = 5;
    $out->z = 6;

    return $out;
}

$xyz = getXYZ();

$x = $xyz->x;
$y = $xyz->y;
$z = $xyz->z;

Yöntemlerin bir işlevi dönen birden fazla değeri ana yollar özetle. Ancak, bu yöntemler üzerinde varyasyonları vardır. Bak en ilginç varyasyonlar, aslında sadece PHP dizileri ile yapabileceğiniz çok şey var, çünkü bir dizi dönen sensin.

Öncelikle, sadece bir dizi dönmek ve hiçbir şey ama bir dizi olarak kabul etmemiz mümkün değildir:

function getXYZ()
{
    return array(1,2,3);
}

$array = getXYZ();

$x = $array[1];
$y = $array[2];
$z = $array[3];

Kod hakkında en ilginç kısmı yukarıdaki işlev içinde kod ilk örnekte sağlanan aynıdır; tek kod işlevi çağırmadan değişti. Bu işlev sonucu nasıl tedavi işlevi çağırmadan kalmış demektir.

Alternatif olarak, bir ilişkilendirilebilir bir dizi kullanır:

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

Php daha az kod yazarken aynı yukarıdaki gibi ama yapmanızı sağlar compact işlevi var. (Evet, bir örnek daha az kod yok, ama gerçek bir uygulama olduğunu söylerdim.) Ancak, yazarak tasarruf miktarı çok az olduğunu düşünüyorum ve kod okumak için daha zor hale getirir, kendim yapmazdım. Bununla birlikte, burada bir örnek:

function getXYZ()
{
    $x = 4;
    $y = 5;
    $z = 6;

    return compact('x', 'y', 'z');
}

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

Unutulmamalıdır süre compact var ' extract kullanılabilecek arama kodu burada, ama beri kötü bir fikir kullanın (özellikle gibi basit bir şey bu) ben bile bir örnek vermek için. Sorun" ve hangi değişkenler kodu diğer bölgelerine gitmeden oluşturulur. göremiyorsun süre için değişkenleri oluşturmak, "büyü yapacak bunu.

Son olarak, list olmadığını belirtmek isterimgerçekteniyi bir ilişkisel dizi ile oynamak. Aşağıdaki ne bekliyorsun ki

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

Ancak, aşağıdaki farklı bir şey yapacağız:

function getXYZ()
{
    return array('x' => 4,
                 'z' => 6,
                 'y' => 5);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

// Pay attention: $y == 6 && $z == 5

Eğer kullanılan list ile ilişkilendirilebilir bir dizi, ve başka birinin değişmesi kod adı işlevi geleceği (Mayıs başına herhangi bir durum) olabilir aniden kırmak, çok isterdim karşıyım birleştirerek list ile ilişkilendirilebilir diziler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
Php

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Air_Fooj

    Air_Fooj

    24 NİSAN 2009
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007
  • FusioNGamiing

    FusioNGamiin

    10 Temmuz 2007