2013-04-17 17 views
1

我有一個函數w /在一個功能,我需要內部功能,使這是可用的變量在父功能的範圍,如:在PHP中將變量傳遞給它的父函數?

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

    echo $name; // use $name 
} 

sayMyName(); 

我可以很容易地只是全球化的東西瓦特/兩種功能......但是,我的情況要複雜得多,而且處理更多的變量和全球化每一個變得有點乏味。

謝謝。

PS 我注意到了很多「返回」的建議。對不起,我不清楚,我需要返回更多的變量..不是一個簡單的回報。謝謝你們

+4

如果你需要以這樣的方式來訪問一個變量,最有可能的,你的設計是有缺陷的。如果確實存在這樣的需求,可以考慮使用參考參數從函數返回該變量或(更糟的解決方案)。 –

+0

你爲什麼不用面向類的工作對象? – silkfire

+2

Fudging hell,真的很難看出這個人很可能仍在學習PHP的工作原理嗎?不要用設計和麪向對象的東西給他洗澡 - 你不會留下任何印象或幫助任何人。 –

回答

8

您可以使用$_GLOBALS,但it`sa「不好的做法「。所以,


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 functionuse聲明和references

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

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

    $temp(); 

    echo $name, ' ', $surname; 
} 

sayMyName(); 
?> 

表演:

John Smith 
+0

哇謝謝人..一堆想法那裏..我認爲生病需要返回數組路線,只是解析父函數 – BrownChiLD

+1

** @ BrownChiLD **,可能永遠不會想到自己。 :)感謝你。是的,我分享你上面寫的概念。 – BlitZ

3

做到這一點

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

    echo $name; // results will be returned 
} 

sayMyName(); 

我希望你內心功能這樣

function getName(){ 
    return $name; 
} 

返回名字,那麼它會工作

+0

感謝的人,這工作,但我需要發送多個變量回父功能,不只是1 ..除非返回$名稱,$年齡,$等可以工作洛爾茲。 – BrownChiLD

+1

在這種情況下,創建一個數組並放置鍵值對。返回數組,然後使用返回的數組訪問這些值。 –

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中。

1

首先將getName()的返回值賦值給一個變量呢?

$name = getName(); 
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

0

你也可以做到這一點,如下。

$name = ""; 

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

sayMyName(); 
0

請使用婁代碼,它會解決你的問題

global $var; 

您可以將PHP的範圍內的任何地方使用它。

3

這就是object oriented programming的設計目的。如果許多功能應共享變量,它可能是最好將它們封裝類是這樣的:

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); 
+0

查看問題的第三條評論。 –

+0

@ArnoSluismans是的,你是對的......我太冒犯了,我已經添加了更多有用的筆記和例子,如何做到這一點(除非常罕見的情況,OOP仍然是最好的解決方案)。 – Vyktor

+0

tbh在PHP中OOP很少是最好的解決方案,但各自爲政;) – Dave

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; 
}