Доступ к внешней переменной в классе PHP - PullRequest
3 голосов
/ 23 июня 2009

Рассмотрим следующую ситуацию

файл: ./include/functions/table-config.php содержащий: . . $tablePages = 'orweb_pages'; . .

файл: ./include/classes/uri-resolve.php содержащий: class URIResolve { . . $category = null ; . . function process_uri() { ... $this->category = $tablePages; ... } . . }

файл: ./settings.php содержащий: . . require_once(ABSPATH.INC.FUNC.'/table-config.php'); require_once(ABSPATH.INC.CLASS.'/uri-resolve.php'); . . Будет ли это работать. Я имею в виду, будет ли доступ к $ tablePages из process_uri () приемлемым или он даст ошибочные результаты.

Пожалуйста, предложите исправления или обходные пути, если может произойти ошибка.

Ответы [ 3 ]

9 голосов
/ 23 июня 2009

Используйте глобальное ключевое слово :

В файле, в котором вы присваиваете значение.

global $tablePages;
$tablePages = 'orweb_pages';

И в другом файле:

class URIResolve {
  var $category;
  function process_uri() {
    global $tablePages;
    $this->category = $tablePages;
  }
}

Кроме того, все глобальные переменные доступны в массиве $GLOBALS (который сам является суперглобальным), поэтому вы можете получить доступ к глобальной переменной в любом месте, не используя ключевое слово global, выполнив что-то вроде этого:

$my_value = $GLOBALS['tablePages'];

Это также усложняет случайное перезапись значения глобала. В первом примере любые изменения, сделанные вами в $tablePages, будут изменять глобальную переменную. Многие ошибки безопасности были созданы при наличии глобального $user и перезаписи его более мощной информацией пользователя.

Другой, еще более безопасный подход - предоставить переменную в конструкторе для URIResolve:

class URIResolve {
  var $category;

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

  function process_uri() {
    // Now you can access table pages here as an variable instance
  }
}

// This would then be used as:
new URIResolve($tablePages);
3 голосов
/ 23 июня 2009

Используйте глобальный (не рекомендуется), константный или одноэлементный класс конфигурации.

Просто включая

$tablePages = 'orweb_pages';

даст вашей локальной переменной переменную, чтобы она не была видна внутри других классов. Если вы используете константу:

define('TABLE_PAGES', 'orweb_pages');

TABLE_PAGES будет доступен для чтения во всем приложении независимо от области действия.

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

0 голосов
/ 30 июня 2017
<?php
 //Use variable php : $GLOBALS in __construct
 $x = "Example variable outer class";

class ExampleClass{
    public $variables; 
  function __construct()
  {
    $this->variables = $GLOBALS; //get all variables from $GLOBALS
  }
    // example get value var 
  public function UseVar(){
   echo $this->variables['x']; // return Example variable outer class
  }
    // example set value var
  public function setVar(){
    $this->variables['x'] = 100;
  } 
}
echo $x // return Example variable outer class;

$Example = new ExampleClass();
$Example->UseVar(); // return Example variable outer class
$Example->setVar(); // $x = 100;

// or use attr variables 
echo $Example->variables['x']; // 100
$Example->variables['x'] = "Hiii"; 
?>
...