Могу ли я делить переменные между различными функциями в PHP? - PullRequest
21 голосов
/ 10 октября 2010

Я попробую объяснить на примере ...

Допустим, у меня есть две разные функции, и у одной из них есть определенная переменная. Во второй функции я не хочу снова писать ту же переменную, могу ли я просто использовать переменную из первой функции во второй, БЕЗ переопределения ее во второй функции?

Что-то вроде:

function a()
{
  $var = "my variable";
}

function b()
{
 echo $var;
}

Извините, если эти вопросы немного глупы, но я все еще начинающий =).

Ответы [ 6 ]

16 голосов
/ 10 октября 2010

Самое чистое решение - создать методы класса A и B и иметь общие переменные в качестве частных статических переменных. Это устраняет беспорядок глобалов и позволяет обеим функциям быть глобально доступными.

class SomeClass
{
    private static $a = 1;

    public static function a() {
        self::$a = 2;
    }

    public static function b() {
        echo self::$a;
    }
}

Затем вы можете вызвать функции:

SomeClass::a();
SomeClass::b();
9 голосов
/ 10 октября 2010

Конечно, вы можете делать глобальные переменные, но в PHP 5.3.0+ есть анонимные функции , поэтому вы также можете делать замыкания:

<?php

function a(){
  $a = 1;  
  echo "First: $a, ";
  ++$a;

    // This is a closure. It can gain access to the variables of a() with the 
    // use option.
  $b = function() use ($a) {
      echo "second: $a";  
  };  
  $b();
};
a(); // Outputs: First: 1, second: 2
?>

Попробуйте на этом примере Codepad

или, возможно, более полезный:

<?php

function a(){
  $a = 1;  
  echo "First: $a, ";
  ++$a;
  $b = function() use ($a) {
      echo "second: $a";  
  };        
  return $b;
};
$fun = a();     // $fun is now $b & $b has access to $a!
$fun();
// Outputs: First: 1, second: 2
?>

Попробуйте на этом примере Codepad

Из документов:

Замыкания также могут наследовать переменные из родительской области.Любые такие переменные должны быть объявлены в заголовке функции.Наследование переменных из родительской области - это не то же самое, что использование глобальных переменных.Глобальные переменные существуют в глобальной области видимости, которая является одинаковой независимо от того, какую функцию выполняет.Родительская область действия замыкания - это функция, в которой было объявлено замыкание (не обязательно функция, из которой оно было вызвано).

7 голосов
/ 10 октября 2010
$a = 1;
function a(){
  global $a;
  $a = 2;
  }
function b(){
  global $a;
  echo $a;
  }

a();
b();

выход:

2
4 голосов
/ 03 апреля 2015

Вот так.Вы можете использовать

function a()
{
  global $var; 
  $var = "my variable";
}

function b()
{
 global $var; 
 echo $var;
}
2 голосов
/ 10 октября 2010

Я бы сделал это так. Это более распространенная реализация. Помните, что функциям могут передаваться параметры и они могут возвращать значения.

// Main
$a = a();
b($a);

function a()
{
  return "my variable";
}

function b($a)
{
 echo $a;
}

У вас есть основная часть программы, и переменная $a остается там в области видимости. Глобалы используются редко и технически не нужны.

0 голосов
/ 04 апреля 2017
<?php

class A
{
    private $p;
    private $q;
    private $ans;
    public  function hello()
    {
        echo "Hello PratikPatel";
    }
    public function getdata($a,$b)
    {

        $this->p=$a;
        $this->q=$b;
        $ans=$this ->p/$this->q;
        $this->ans=$ans;

    }
    public function div1()
    {
        echo "your division answer is:=".$this->ans."<br/>";
    }
}
class B extends A
{
    function hello()
    {
        echo "Hello "."<br/>";
    }

}

$p=new B();
$p1=new B();
$p2=new B();
$p -> getdata(20,10);
echo $p1 -> hello();
$p2 -> div1();

?>

этот код в проблеме, которая не может распечатать результат деления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...