1

我有一个带函数的函数,我需要内部函数以使其变量在父函数的范围内可用,例如:

function sayMyName(){
    getName(); // inner function generates $name value

    echo $name; // use $name
}

sayMyName();

我可以很容易地在这两个函数中对事物进行全球化......但是我的情况要复杂得多,并且要处理更多变量,并且对每个变量进行全球化有点乏味。

谢谢。

PS我注意到很多“返回”建议。抱歉,我不清楚,我需要返回更多变量.. 不是简单的返回。多谢你们

4

9 回答 9

8

您可以使用$_GLOBALS,但这是“不好的做法”。所以,


1:使用return

<?php
function getName(){
    $name = 'Smith';

    return $name;
}

function sayMyName(){
    $name = getName();

    echo $name;
}

sayMyName();
?>

显示:

Smith

2:使用references

<?php
function getName(&$name){
    $name = 'Smith';
}

function sayMyName(){
    getName($name);

    echo $name;
}

sayMyName();
?>

显示:

Smith

3:返回array多个变量:

<?php
function getName(){
    $surname = 'Smith';
    $name    = 'John';

    return array($surname, $name);
}

function sayMyName(){
    list($surname, $name) = getName();

    echo $name, ' ', $surname;
}

sayMyName();
?>

显示:

John Smith

4.object为多个变量返回自定义:

<?php
function getName(){
    $surname = 'Smith';
    $name    = 'John';

    $buffer = new stdClass();

    $buffer->name    = $name;
    $buffer->surname = $surname;

    return $buffer;
}

function sayMyName(){
    $obj = getName();

    echo $obj->name, ' ', $obj->surname;
}

sayMyName();
?>

显示:

John Smith

5. 使用anonymous functionwithuse语句 and references

<?php
function sayMyName(){
    $surname = $name = 'Unknown';

    $temp = function() use (&$name, &$surname){
        $surname = 'Smith';
        $name    = 'John';
    };

    $temp();

    echo $name, ' ', $surname;
}

sayMyName();
?>

显示:

John Smith
于 2013-04-17T07:43:53.613 回答
3

做这个

function sayMyName(){
    $name = getName(); // inner function generates $name value

    echo $name; // results will be returned
}

sayMyName();

我希望您的内部函数返回这样的名称

function getName(){
    return $name;
}

然后它会工作

于 2013-04-17T07:42:55.363 回答
3

这就是面向对象编程的目的。如果许多函数应该共享变量,最好将它们封装到这样的类中:

class WhateverDescibestYourViewOfTheWorld {
    protected $name;

    function __construct( $name)
    {
        $this->name = $name;
    }

    function GetName() {
        return $this->name;
    }

    function SayName()
    {
        echo $this->name;
    }
}

// And use it:
$o = new WhateverDescibestYourViewOfTheWorld();
...
$o->SayName();

或者您可以构建仅用作数据容器的类:

class DataContainer {
    public $name;
    public $address;
    // ...
}

// By reference this will modify object previously created
function GetProperties( &$dataContainer) // Note that & isn't necessary since PHP5
{
    $dataContainer->name = "...";
}

$c = new DataContainer();
GetProperties($c);

或者你可以简化它并使用数组:

function GetProperties( array &$dataContainer)
{
     $dataContainer['name'] = '...';
}

$data = array();
GetProperties($data);
于 2013-04-17T07:48:22.933 回答
1

您可以使用参考

    $param = "aaa";
    function f(&$param)
    {
      //dostuff
      inner($param);
      echo $param;
    }
    function inner(&$inner) { //do other stuff }

或使用返回值

 function f() { echo inner(); } 

 function inner($param) {return $param;}

如果您处理引用,则两个函数都将处理同一个变量,而不是副本

http://php.net/manual/en/language.references.php

最好的方法是上课

<?php 
class Person
{
 private $name;

 public function setName($name){ $this->name = $name;}
 public function sayName() {echo $this->name;}
}

$person = new Person();
$person->setName("Robert");
$person->sayName();

这是在 OOP 中实现它的好方法。

于 2013-04-17T07:44:06.860 回答
1

首先将 getName() 的返回值分配给变量怎么样?

$name = getName();
于 2013-04-17T07:44:13.417 回答
1

如果你只需要一个变量,你可以这样做

function getName(){
    // Some code
    return 'my name is XXX';
}
function sayMyName(){
     $name = getName(); // inner function generates $name value
     echo $name; // results to undefined
 }
 sayMyName();

否则你可以考虑使用一个类:http ://www.php.net/manual/en/language.oop5.php

于 2013-04-17T07:44:50.940 回答
1

您的想法是错误的,但是您可以返回一组值。例如:

function sayMyName()
{
    $result = getName(); // inner function creates an array

    echo $result['name']; 
}

或者更好的对象:

class Results
{
    public $name;
}

function sayMyName()
{
    $result = getName(); // inner function creating an object

    echo $result->name;
}
于 2013-04-17T08:14:39.857 回答
0

您也可以按以下方式进行。

$name = "";

function sayMyName(){
    getName(); // inner function generates $name value
    //set $name variable inside getName() function.
    echo $name; // results to undefined
}

sayMyName();
于 2013-04-17T07:45:27.130 回答
0

请使用以下代码,它将解决您的问题

global $var;

您可以在 php 范围内的任何地方使用它。

于 2013-04-17T07:46:33.747 回答