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
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.
Nasıl bir dize C / birden fazla satır ...
Birden fazla rol denetleyicisi eylem e...
Bağlanma Birden fazla veritabanı ile 3...
Birden çok durumda, maç scala sınıflar...
hazırlamak ve birden çok "kullanı...