php

2011-08-11 12 views
9

में संदर्भ द्वारा असीमित तर्क कैसे पारित करें मेरे पास php फ़ंक्शन है जिसमें असीमित संख्या में तर्क हैं जो मुझे func_get_args() से प्राप्त हो रहा है। मेरे पास तर्क के साथ कुछ संचालन हैं (स्ट्रिंग बदलना या कुछ करना) और मैं चाहता हूं कि यह संदर्भ द्वारा गुजरने वाले तर्क की तरह हो। क्या यह संभव है?php

उदाहरण:

$test = 'foo'; 
$test2 = 'bar'; 

function test(){ 
    $args = func_get_args(); 
    foreach($args as $arg) 
     $arg .= 'baz'; 
} 

test($test, $test2); 
+0

[पीएचपी?: संदर्भ द्वारा चर लंबाई तर्क सूची] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1925253/php-variable-length-argument-list-by-reference) –

उत्तर

4

मैं अत्यधिक शक नहीं है कि संभव है, लेकिन मैं एक तरह से आप मिल सकता है पता है तुम क्या चाहते हो:

function test(&$args) { 
    foreach ($args as $arg) { 
     $arg .= 'baz'; 
    } 
} 

test(array(&$test, &$test2)); 
+0

यह ऐसा लगता है कि हम जल्द ही PHP 5.6 में नए '... 'ऑपरेटर का उपयोग करके ऐसा करने में सक्षम होंगे। –

1

यह काम करता है:

$test = 'foo'; 
$test2 = 'bar'; 

function test(){ 
    $backtrace = debug_backtrace(); 
    foreach($backtrace[0]['args'] as &$arg) 
     $arg .= 'baz'; 
} 

test(&$test, &$test2); 

हालांकि , यह संदर्भ द्वारा कॉल-टाइम पास का उपयोग करता है जिसे बहिष्कृत किया जाता है।

+0

PHP 5.4+ –

12

जैसा कि PHP: variable-length argument list by reference? में उत्तर दिया गया है, PHP में चर-लंबाई को संयोजित करने और संदर्भ फ़ंक्शन तर्कों से गुजरने का कोई तरीका नहीं है। इसके बजाए, लिंक किए गए उत्तर में 100 &argx एस घोषित करने के एक हैक का उपयोग किया जाता है, फिर यह पता लगाने के लिए get_num_args() का उपयोग करके वास्तव में कितने उपयोग किए जाते थे। बधाई हो, आपको PHP में विशेष रूप से कठिन कोने मिला;)

0

मुझे इस कार्यक्षमता की भी आवश्यकता है, मैं एक समाधान के साथ आया था।

function sayhello($params) { 
    //params hold an unlimited amount of references 
} 

sayhello([&$one, &$two]); 

यह php> = 5.4 पर निर्भर करता है। यदि आप < = 5.4 पर हैं, तो [] के बजाय सरणी() वाक्यविन्यास का उपयोग करें।

मैं प्यार करता हूँ [] यद्यपि, बहुत बेहतर :)

+1

में बिल्कुल भी अनुमति नहीं है आप एक तर्क है जो एक सरणी है (और उस वाक्यविन्यास के बगल में

0

का उपयोग वस्तुओं समाधान

class O { 
    public $v; 
    public function __construct(&$p){ 
     $this->v = &$p; 
    } 
} 

function append_baz_to_all(){ 
    foreach(func_get_args() as &$arg){ 
     $arg->v .= 'baz'; 
    } 
} 

function test1(){ 
    echo "test1\n"; 
    $a='A';$b='B';$c='C';$d='D';$e='E';$f='F';$g='G'; 
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n"); 
    append_baz_to_all(new O($a), new O($b)); 
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n\n"); 
} 

//shortcutting 
function o(&$v){return new O($v);} 

function test2(){ 
    echo "test2\n"; 
    $a='A';$b='B';$c='C';$d='D';$e='E';$f='F';$g='G'; 
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n"); 
    append_baz_to_all(o($c), o($d), o($e)); 
    echo("\$a=$a \$b=$b \$c=$c \$d=$d \$e=$e \$f=$f \$g=$g\n\n"); 
} 


test1(); 
test2(); 
7

है के बाद से पीएचपी-5.6 आप एक variadic संदर्भ का उपयोग कर सकते हैं:

function test(&...$args) { 
    foreach ($args as &$arg) { 
     $arg .= 'baz'; 
    } 
} 
+0

निर्दोष और 5.6 समर्थन, इस उत्तर को और अधिक पसंद नहीं कर सकता, अपडेट करने के लिए धन्यवाद! –

0
function byref_alias() 
{ 
//$argz=func_get_args(); //byval, not what you want 
$argz=debug_backtrace()[0]['args']; //byref hack 
$argz[0]++; works 
} 
+0

याद रखें कि यद्यपि ये तर्क बाध्यता हैं, वे फ़ंक्शन पर भेजे गए मूल तर्क को संशोधित नहीं करते हैं, लेकिन उन्हें उपेक्षा भेजा जाएगा। – AbiusX

0

नीचे दिए गए उदाहरण की तरह कुछ करने पर मेरे लिए ठीक काम करता है। मुझे लगता है कि कुंजी foreach में संदर्भ स्थापित कर रहा है।

$var1 = '%DIR%/test'; 

replaceParameters(
    $var1, 
    $var2, 
    $var3 
); 

function replaceParameters(&$variables) { 

    $variables = array_filter(func_get_args()); 

    $parameters = [ 
     '%DIR%' => __DIR__, 
     '%FILE%' => __FILE__, 
    ]; 

    foreach($variables as &$variable) { 
     $variable = str_replace(array_keys($parameters), array_values($parameters), $variable); 
    } 

}