Bunun gibi iki dönüşlü bir fonksiyona sahip olmak mümkün müdür:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
Öyleyse, her dönüşü ayrı olarak nasıl alabilirim?
Bunun gibi iki dönüşlü bir fonksiyona sahip olmak mümkün müdür:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
Öyleyse, her dönüşü ayrı olarak nasıl alabilirim?
Yanıtlar:
2 değişken döndürmenin bir yolu yoktur. Olsa da, olabilir bir dizi yaymak ve geri; Dinamik bir değişken döndürmek için bir koşul oluşturun.
Örneğin, bu işlev geri dönecektir $var2
function wtf($blahblah = true) {
$var1 = "ONe";
$var2 = "tWo";
if($blahblah === true) {
return $var2;
}
return $var1;
}
Uygulamada:
echo wtf();
//would echo: tWo
echo wtf("not true, this is false");
//would echo: ONe
Her ikisini de istiyorsanız, işlevi biraz değiştirebilirsiniz
function wtf($blahblah = true) {
$var1 = "ONe";
$var2 = "tWo";
if($blahblah === true) {
return $var2;
}
if($blahblah == "both") {
return array($var1, $var2);
}
return $var1;
}
echo wtf("both")[0]
//would echo: ONe
echo wtf("both")[1]
//would echo: tWo
list($first, $second) = wtf("both")
// value of $first would be $var1, value of $second would be $var2
wantarray()
Teknik olarak, birden fazla değer döndüremezsiniz. Ancak, bu sınırlamaya geçici bir çözüm bulmak için birden çok yol vardır. Birden çok değer döndürmek gibi davranma biçimi listanahtar kelimedir:
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öndürüyorsunuz ve listbu dizinin öğelerini gerçek diziyi saklamak yerine farklı değerlerde saklamak için kullanıyorsunuz. Bu tekniği kullanmak, en çok birden çok değer döndürmek gibi hissettirecektir .
listSolüsyon yerine php özgü biridir. Benzer yapılara sahip birkaç dil vardır, ancak daha fazla dil yoktur. Birden çok değeri "döndürmek" için yaygın olarak kullanılan başka bir yol vardır ve hemen hemen her dilde (bir şekilde) kullanılabilir. Ancak, bu yöntem oldukça farklı görünecektir, bu yüzden alışmak gerekebilir.
// 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 (örneğin, php kendisi tarafından belirlenen bazı fonksiyonları kullanılır $countolarak str_replace , $matchesiçinde preg_match'in ). Bu, birden fazla değer döndürmekten oldukça farklı olabilir, ancak en azından bilmeye değer.
Üçüncü yöntem, ihtiyacınız olan farklı değerleri tutmak için bir nesne kullanmaktır. Bu daha fazla yazımdır, bu nedenle yukarıdaki iki yöntem kadar sık kullanılmaz. Bununla birlikte, bir dizi yerde aynı değişken kümesini kullanırken (veya elbette, yukarıdaki yöntemleri desteklemeyen veya ekstra yazmadan bunu yapmanıza izin veren bir dilde çalışırken) bunu kullanmak mantıklı olabilir.
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;
Yukarıdaki yöntemler, bir işlevden birden çok değer döndürmenin ana yollarını özetler. Ancak, bu yöntemlerde farklılıklar vardır. Bakılması gereken en ilginç varyasyonlar, aslında bir dizi döndürdüğünüzdür, çünkü PHP'de dizilerle yapabileceğiniz çok şey vardır.
İlk olarak, bir diziyi döndürüp diziden başka bir şey olarak değerlendiremeyiz:
function getXYZ()
{
return array(1,2,3);
}
$array = getXYZ();
$x = $array[1];
$y = $array[2];
$z = $array[3];
Yukarıdaki kodla ilgili en ilginç kısım, fonksiyonun içindeki kodun sağladığım ilk örnekte olduğu gibidir; sadece işlevi çağıran kod değişti. Bu, işlevin döndürdüğü sonucun nasıl ele alınacağını işleve çağıran kişiye bağlıdır.
Alternatif olarak, ilişkilendirilebilir bir dizi kullanılabilir:
function getXYZ()
{
return array('x' => 4,
'y' => 5,
'z' => 6);
}
$array = getXYZ();
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Php compactyukarıdaki ile aynı yapmanızı sağlar ancak daha az kod yazarken işlevi var. (Peki, örnek daha az kod olmayacak, ama gerçek bir dünya uygulaması muhtemelen olurdu.) Ancak, yazarak tasarruf miktarı minimum olduğunu düşünüyorum ve kodu okumak zorlaştırır, bu yüzden kendim yapmazdım. Yine de, bir örnek:
function getXYZ()
{
$x = 4;
$y = 5;
$z = 6;
return compact('x', 'y', 'z');
}
$array = getXYZ();
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Bu unutulmamalıdır ki sırasında compactbir meslektaşı var extractburada arama kodu kullanılabileceği, ancak (özellikle bu kadar basit olarak bir şey için) kullanmak için kötü bir fikir beri Hatta bunun için bir örnek vermek olmaz. Sorun, kodun diğer bölümlerine gitmeden hangi değişkenlerin oluşturulduğunu göremezken, "sihirli" yapacak ve sizin için değişkenler yaratacaktır.
Son olarak, söz etmek istiyorum listgelmez gerçekten ilişkisel dizi ile iyi oynamak. Aşağıdakiler beklediğinizi yapacak:
function getXYZ()
{
return array('x' => 4,
'y' => 5,
'z' => 6);
}
$array = getXYZ();
list($x, $y, $z) = getXYZ();
Ancak, aşağıdakiler farklı bir şey yapacaktır:
function getXYZ()
{
return array('x' => 4,
'z' => 6,
'y' => 5);
}
$array = getXYZ();
list($x, $y, $z) = getXYZ();
// Pay attention: $y == 6 && $z == 5
listİlişkilendirilebilir bir dizi ile kullandıysanız ve başka biri gelecekte çağrılan işlevdeki kodu değiştirmek zorunda kalırsa (ki bu hemen hemen her durumda olabilir) aniden kırılabilir, bu yüzden listilişkilendirilebilir dizilerle birleşmeye karşı öneriyorum .
return array('x' => $x, 'y' => $y, 'z' => $z)temiz bulurdum , ama kendim yazacağım noktaya, başkalarından bu formatı kullanmasını isteyeceğim noktaya değil.
Örneğinizde, ikinci getiri asla olmayacaktır - ilk getiri PHP'nin çalışacağı son şeydir. Birden fazla değer döndürmeniz gerekiyorsa, bir dizi döndürün:
function test($testvar) {
return array($var1, $var2);
}
$result = test($testvar);
echo $result[0]; // $var1
echo $result[1]; // $var2
list($result_1, result_2) = test($testvar);
result_2veya $result_2?
$result_2
PHP 7.1'den beri listeler için uygun yıkımımız var . Böylece böyle şeyler yapabilirsiniz:
$test = [1, 2, 3, 4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4
Bir işlevde bu şöyle görünecektir:
function multiple_return() {
return ['this', 'is', 'a', 'test'];
}
[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test
Yıkım çok güçlü bir araçtır. Anahtar => değer çiftlerini de yok edebilir:
["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];
PHP 7.1 için yeni özellik sayfasına göz atın:
Oldukça geç kaldığımı biliyorum, ama bu problem için güzel ve basit bir çözüm var.
Yıkımı kullanarak aynı anda birden fazla değer döndürmek mümkündür.
function test()
{
return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}
Şimdi bunu kullanabilirsiniz
$result = test();
extract($result);
extractdizideki her üye için o üyeden sonra adlandırılmış bir değişken oluşturur. Böylece şimdi erişebilir $modelve$data
modelve data) tuşlarının değişken olarak mevcut olmadığına dikkat edin . Varsa, çakışmaları önlemek için prefixparametresini kullanın extract.
İki iade beyanı mümkün değil. Ancak hata atmaz, ancak işlev çağrıldığında yalnızca ilk dönüş deyimi değerini alırsınız. Bunun karşılığında birden çok değer elde etmek için dizi dönüşünü kullanabiliriz. Örneğin:
function test($testvar)
{
// do something
//just assigning a string for example, we can assign any operation result
$var1 = "result1";
$var2 = "result2";
return array('value1' => $var1, 'value2' => $var2);
}
İşlevler, tanım gereği, yalnızca bir değer döndürür.
Ancak, varsaydığınız gibi, bu değer bir dizi olabilir.
Böylece kesinlikle şöyle bir şey yapabilirsiniz:
<?PHP
function myfunc($a,$b){
return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));
Bununla birlikte, biraz zaman ayırmaya ve çözmeye çalıştığınız her şeyi düşünmeye değer. Karmaşık bir sonuç değeri döndürmek (dizi veya nesne gibi) mükemmel bir şekilde geçerli olsa da, "İki değeri döndürmek istiyorum" diye düşünürseniz, kötü tasarım yapıyor olabilirsiniz. Sorunuzda daha fazla ayrıntı olmadan söylemek zor, ama durmak ve iki kez düşünmek asla acıyor.
En İyi Uygulama, döndürülen değişkenleri diziye koymak ve sonra list()değişkenlere dizi değerleri atamaktır.
<?php
function add_subt($val1, $val2) {
$add = $val1 + $val2;
$subt = $val1 - $val2;
return array($add, $subt);
}
list($add_result, $subt_result) = add_subt(20, 7);
echo "Add: " . $add_result . '<br />';
echo "Subtract: " . $subt_result . '<br />';
?>
PHP 7.1 <= için yeni sözdizimi kullanabilirsiniz ( liste işlevi yerine ):
/**
* @return array [foo, bar]
*/
function getFooAndBar(): array {
return ['foo', 'bar'];
}
[$foo, $bar] = getFooAndBar();
print 'Hello '. $foo . ' and ' . $bar;
2-3 değişken döndürmek istiyorsanız benim için sorun değil, aksi takdirde istenen özelliklere sahip bir nesne kullanmalısınız.
Birden fazla dönüş değeri PHP işlevi için böyle uygulamak var. kodunuzla iyi olun. teşekkür ederim.
<?php
function multi_retun($aa)
{
return array(1,3,$aa);
}
list($one,$two,$three)=multi_retun(55);
echo $one;
echo $two;
echo $three;
?>
Yukarıdaki yeşil onay işaretinin cevabı aslında yanlıştır. Bir dizi döndürürseniz PHP'de birden çok değer döndürebilirsiniz. Örnek için aşağıdaki koda bakın:
<?php
function small_numbers()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
Bu kod aslında PHP'nin web sitesinde aşağıdaki sayfadan kopyalanır: http://php.net/manual/en/functions.returning-values.php Ben de aynı kodu birçok kez kullandım, bu yüzden onaylayabilirsiniz iyi ve işe yarıyor.
PHP'deki işlevler yalnızca bir değişken döndürebilir. global kapsamdaki değişkenleri kullanabilir, dizi döndürebilir veya işleve referans olarak ve değeri değiştirmeden değişken iletebilirsiniz, ancak bunların tümü kodunuzun okunabilirliğini azaltacaktır. Sınıflara bakmanızı öneririm.
Yukarıdaki tepkiler birkaç genişletmek düşündüm ....
class nameCheck{
public $name;
public function __construct(){
$this->name = $name;
}
function firstName(){
// If a name has been entered..
if(!empty($this->name)){
$name = $this->name;
$errflag = false;
// Return a array with both the name and errflag
return array($name, $errflag);
// If its empty..
}else if(empty($this->name)){
$errmsg = 'Please enter a name.';
$errflag = true;
// Return both the Error message and Flag
return array($errmsg, $errflag);
}
}
}
if($_POST['submit']){
$a = new nameCheck;
$a->name = $_POST['name'];
// Assign a list of variables from the firstName function
list($name, $err) = $a->firstName();
// Display the values..
echo 'Name: ' . $name;
echo 'Errflag: ' . $err;
}
?>
<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>" >
<input name="name" />
<input type="submit" name="submit" value="submit" />
</form>
Bu size bir giriş alanı ve gönderildikten sonra bir gönderme düğmesi verir, ad giriş alanı boşsa, hata bayrağını ve bir mesajı döndürür. Ad alanı bir değere sahipse, false / no hatası için değeri / adı ve 0 hata işaretini döndürür. Bu yardımcı olur umarım!
Cevap hayır. Ayrıştırıcı ilk dönüş ifadesine ulaştığında, kontrolü çağrı işlevine geri yönlendirir - ikinci dönüş ifadeniz asla yürütülmez.
Bir dizideki tüm değişkenleri ekleyin ve son olarak array.
function test($testvar)
{
// do something
return array("var1" => $var1, "var2" => @var2);
}
Ve sonra
$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable
Sanırım eliego cevabı açık bir şekilde açıkladı. Ancak her iki değeri de döndürmek istiyorsanız, bunları bir diziye koyun ve döndürün.
function test($testvar)
{
// do something
return array('var1'=>$var1,'var2'=>$var2);
//defining a key would be better some times
}
// dönüş değerlerine erişmek için
$returned_values = test($testvar);
echo $returned_values['var1'];
echo $returned_values['var2'];
$thisAnahtar kelimeyi kullanıyorsunuz ancak bahsi geçen bir sınıf veya nesne yok. 2) Değişkeninize değerler döndürdüyseniz $returned_values, bu değişkenten yankılanmanız gerekir:echo $returned_values['var1'];
<?php
function foo(){
$you = 5;
$me = 10;
return $you;
return $me;
}
echo foo();
//output is just 5 alone so we cant get second one it only retuns first one so better go with array
function goo(){
$you = 5;
$me = 10;
return $you_and_me = array($you,$me);
}
var_dump(goo()); // var_dump result is array(2) { [0]=> int(5) [1]=> int(10) } i think thats fine enough
?>
Birden çok geri dönüşe izin veren diller genellikle birden çok değeri bir veri yapısına dönüştürür.
Örneğin, Python'da birden çok değer döndürebilirsiniz. Ancak, aslında sadece bir demet olarak geri dönüyorlar.
Böylece basit bir dizi oluşturarak ve bunu döndürerek PHP'de birden çok değer döndürebilirsiniz.
İki veya daha fazla değişkenin değerini referans olarak ayarlayarak alabilirsiniz:
function t(&$a, &$b) {
$a = 1;
$b = 2;
}
t($a, $b);
echo $a . ' ' . $b;
Çıktı:
1 2
Bunu yapmanın en kolay yolu:
public function selectAllUsersByRole($userRole, $selector) {
$this->userRole = $userLevel;
$this->selector = $selector;
$sql = "SELECT * FROM users WHERE role <= ? AND del_stat = 0";
$stm = $this->connect()->prepare($sql); // Connect function in Dbh connect to database file
$stm->execute([$this->userRole]); // This is PHP 7. Use array($this->userRole) for PHP 5
$usersIdArray = array();
$usersFNameArray = array();
$usersLNameArray = array();
if($stm->rowCount()) {
while($row = $stm->fetch()) {
array_push($usersIdArray, $row['id']);
array_push($usersFNameArray, $row['f_name']);
array_push($usersLNameArray, $row['l_name']);
// You can return only $row['id'] or f_name or ...
// I used the array because it's most used.
}
}
if($this->selector == 1) {
return $usersIdArray;
}elseif($this->selector == 2) {
return $usersFNameArray;
}elseif($this->selector == 3) {
return $usersLNameArray;
}
}
Bu işlevi nasıl adlandırabiliriz?
$idData = $selectAllUsers->selectAllUsersByLevel($userRole, 0);
print_r($idData);
$idFName = $selectAllUsers->selectAllUsersByLevel($userRole, 1);
print_r($idFname);
Bu kadar. Çok kolay.
Ben benzer bir sorun vardı - bu yüzden denedim ve biraz googled (bu konu bulma). 5 dakika deneme yanılma sonra ben sadece bir satırda iki (belki daha - henüz test değil) dönmek için "VE" kullanabilirsiniz öğrendim.
Kodum:
function get_id(){
global $b_id, $f_id;
// stuff happens
return $b_id AND $f_id;
}
//later in the code:
get_id();
var_dump($b_id);
var_dump($f_id); // tested output by var_dump
işe yarıyor. Almam / almam gereken değerleri aldım. Umarım bu konuyu okuyan herkese yardımcı olabilirim :)