Acceso variable externo en clase PHP
-
06-07-2019 - |
Pregunta
Considere la siguiente situación
archivo: ./include/functions/table-config.php
que contiene:
.
.
$tablePages = 'orweb_pages';
.
.
archivo: ./include/classes/uri-resolve.php
que contiene:
class URIResolve {
.
.
$category = null ;
.
.
function process_uri() {
...
$this->category = $tablePages;
...
}
.
.
}
archivo: ./settings.php
que contiene:
.
.
require_once(ABSPATH.INC.FUNC.'/table-config.php');
require_once(ABSPATH.INC.CLASS.'/uri-resolve.php');
.
.
Esto funcionara. Quiero decir, ¿será aceptable el acceso a $ tablePages desde process_uri () o dará resultados erróneos.
Sugiera correcciones o soluciones alternativas si se puede producir un error.
Solución
Utilice una clase de configuración global (no recomendada), una constante o una única.
Simplemente incluyendo
$tablePages = 'orweb_pages';
le dará a su alcance local variable para que no sea visible dentro de otras clases. Si usa una constante:
define('TABLE_PAGES', 'orweb_pages');
TABLE_PAGES estará disponible para acceso de lectura en toda la aplicación, independientemente del alcance.
La ventaja de una constante sobre una variable global es que no tiene que preocuparse de que se anule en otras áreas de la aplicación.
Otros consejos
Utilice la palabra clave global :
En el archivo donde está asignando el valor.
global $tablePages;
$tablePages = 'orweb_pages';
Y en el otro archivo:
class URIResolve {
var $category;
function process_uri() {
global $tablePages;
$this->category = $tablePages;
}
}
Además, todas las variables globales están disponibles en la matriz $ GLOBALS
(que en sí es una superglobal), por lo que puede acceder a la variable global en cualquier lugar sin usar la palabra clave global haciendo algo como esto:
$my_value = $GLOBALS['tablePages'];
Esto también sirve para dificultar la sobrescritura accidental del valor global. En el ejemplo anterior, cualquier cambio que haya realizado en $ tablePages
cambiaría la variable global. Se han creado muchos errores de seguridad al tener un $ user
global y sobrescribirlo con la información de un usuario más potente.
Otro enfoque aún más seguro es proporcionar la variable en el constructor para 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);
<?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";
?>