У меня есть функция w / в функции, и мне нужна внутренняя функция, чтобы сделать ее переменными доступными в области родительской функции, например:
function sayMyName(){ getName(); // inner function generates $name value echo $name; // use $name } sayMyName();
Я мог бы просто просто глобализовать вещи в обеих функциях … Но моя ситуация намного сложнее и обрабатывает больше переменных и глобализация каждого из них немного утомительна.
Благодарю.
PS Я заметил много предложений «возвращения». извините, я wasnt ясно, мне нужно вернуть больше переменных .. не простой возврат. Спасибо, парни
Вы можете использовать $_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 function
с use
инструкции и references
:
<?php function sayMyName(){ $surname = $name = 'Unknown'; $temp = function() use (&$name, &$surname){ $surname = 'Smith'; $name = 'John'; }; $temp(); echo $name, ' ', $surname; } sayMyName(); ?>
Показывает:
John Smith
сделай это
function sayMyName(){ $name = getName(); // inner function generates $name value echo $name; // results will be returned } sayMyName();
Я надеюсь, что ваша внутренняя функция возвращает имя, подобное этому
function getName(){ return $name; }
то он будет работать
Это то, для чего предназначалось объектно-ориентированное программирование . Если многие функции должны совместно использовать переменные, лучше всего их инкапсулировать в класс следующим образом:
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);
Как сначала назначить возвращаемое значение getName () переменной?
$name = getName();
Если вам нужна только одна переменная, вы можете сделать это
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
Вы можете использовать ссылки
$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();
Это хороший способ сделать это в ООП.
То, что вы думаете, неверно, однако вы можете вернуть массив значений. Например:
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; }
Вы также можете сделать это, как показано ниже.
$name = ""; function sayMyName(){ getName(); // inner function generates $name value //set $name variable inside getName() function. echo $name; // results to undefined } sayMyName();
Пожалуйста, используйте следующий код, он решит вашу проблему
global $var;
Вы можете использовать его в любом месте вашего php-диапазона.