Php 函数创建以前未定义的新变量

Php 函数创建以前未定义的新变量,php,Php,很抱歉给你这么一个蹩脚的标题,但我只是不知道该写些什么,希望你能理解。另外,我不知道以前是否有人问过类似的问题,因为我不知道合适的关键词,所以不能用谷歌搜索 基本上。。。查看时,他们得到了这个匹配的参数,该参数将创建函数中定义的新数组,并使我们能够在函数执行后访问它 问题是。。我如何在自己的功能中实现这样的功能?但它可以创建单个变量和/或数组 提前谢谢 像这样: $myvariable = runfunction(); function runfunction() { //do some co

很抱歉给你这么一个蹩脚的标题,但我只是不知道该写些什么,希望你能理解。另外,我不知道以前是否有人问过类似的问题,因为我不知道合适的关键词,所以不能用谷歌搜索

基本上。。。查看时,他们得到了这个匹配的参数,该参数将创建函数中定义的新数组,并使我们能够在函数执行后访问它

问题是。。我如何在自己的功能中实现这样的功能?但它可以创建单个变量和/或数组

提前谢谢

像这样:

$myvariable = runfunction();

function runfunction() {
//do some code assign result to variable (ie $result)
return $result;
}


我想你指的是功能,不是吗

function putValInVar(&$myVar, $myVal){
    $myVar = $myVal;
}

$myVar = 1;
putValInVar($myVar, 2);

echo $myVar; // outputs '2', but will output '1' if we remove the '&' //
默认情况下,PHP中的函数参数是按值传递的。这意味着在每次函数调用时都会创建新变量,这些变量只存在于函数内部,不会影响函数外部的任何内容

要指定参数应通过引用使用,语法是在函数头中声明前附加
&
。这将指示PHP在函数中使用传递的变量,而不是创建它的副本

例外:对象总是通过引用传递。(嗯……不是真的,但它很复杂。有关详细信息,请参阅注释线程。)

preg\u match\u all()
接受对数组的引用,该数组在其自身范围内称为
$matches
。如功能原型所示:

array &$matches
如果调用函数并传入变量,如果调用范围中不存在该变量,则将创建该变量。因此,在用户定义的函数中,您可以使用
通过引用接受参数,然后在函数中使用它。只需在函数调用中声明外部作用域变量即可创建外部作用域变量,就像使用
$matches
调用
preg\u match\u all()
一样

例如:

function foo(&$bar) {
    $bar = 'baz';
}

// Declare a variable and pass it to foo()
foo($variable);
echo $variable; // baz

我想你要求的是。preg_match_all在其作用域之外“创建”数组变量的基本功能是:

 function preg_match_all($foo, $bar, & $new_var) {
     $new_var = array(1,2,3);
 }
这里的关键点是函数定义中的
&
。这允许您在传递时覆盖外部作用域中的变量


在风格上,这应该小心使用。尝试返回数组或结果,而不是通过引用传递进行返回。

否,因为
preg\u match\u all()
不返回
$matches
数组。看不出这在很大程度上是一个用结果定义的问题。但是如果不在全局变量中设置它呢?在调用
putValInVar()
@kemp()之前,不需要定义
$myVar
,当然不需要,但我想更好地说明值的变化。不,除非同时使用
&
,否则对象不会通过引用传递。默认情况下,对它们的引用按值传递。这意味着对同一个对象的多个引用,而不是原始对象引用。这确实是我要找的!认可的!但是,但是。。。有没有办法使通过引用传递的参数不必强制?就像你可以使用
函数myFunction($responsive,$notObligate=“somevalue”){}
@Alin:不完全是这样。非对象类型按值传递,写入时复制。对象类型通过引用值传递。如果创建了一个对象和一个函数,该函数通过引用接受该对象并将其转换为非对象,则调用范围中的对象将更改为该非对象值。如果指定参数时不带
&
,则只有对函数所拥有对象的引用才会被该值覆盖。
 function preg_match_all($foo, $bar, & $new_var) {
     $new_var = array(1,2,3);
 }