Я кодирую большой скрипт на PHP, который должен быть безопасным от будущих пользовательских расширений. я понял, чтобы создать что-то вроде класса разрешений проверки расширению доступ к некоторым основным переменным и т.д.Создание нового экземпляра класса из класса, который он расширяет в PHP
Вот класс запуска:
class SystemStartup
{
private function startClass () {
require (dirname(__FILE__) . '/sys.run.php');
//starting SystemRun with something like core security token
new SystemRun (hash ('sha256' , $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'] . microtime (TRUE)));
}
function __construct () {
//here i have some security stuff like checking class not already running
$this -> startClass ();
}
function __destruct () {
//wywolane na samym koncu
}
};
SystemRun класс:
class SystemRun
{
private $SystemToken;
//static because i want to be callable from other classes extending SystemRun
protected static $SystemUrlControl;
private function startClass () {
//before more code
//loading file with child class
require (dirname(__FILE__) . '/urlcontrol.php');
//starting it with security token
echo $this -> SystemToken; //just for check
self :: $SystemUrlControl = new SystemUrlControl ($this -> SystemToken);
//more more more code (its main class)
}
protected function validateToken ($SystemToken) {
echo $this -> SystemToken; //just for check
//this should check tokens are the same
if ($this -> SystemToken == $SystemToken) return TRUE;
return FALSE;
}
function __construct ($SystemToken) {
//saving token for next classes
$this -> SystemToken = $SystemToken;
$this -> startClass ();
}
};
А теперь SystemUrlControl с расширяет SystemRun
class SystemUrlControl extends SystemRun
{
private $SystemToken;
//functions
//more functions
//more more more
function __construct ($SystemToken) {
if (!parent :: validateToken ($SystemToken)) echo 'somebody else called me!';
$this -> SystemToken = $SystemToken;
}
};
Проблема в том, что вызов validateToken из SystemUrlControl
, возвращающий FALSE
- SystemRun видит его собственный SystemToken как NULL.
выхода (от эха) является:
> 5b6a09d8f03dd7e6229a5... (valid token) (here NULL value) somebody else called me!
'самостоятельно :: $ SystemToken' не статический член, и, таким образом, должен быть использован с' $ this-> SystemToken'. – Ian
Его один «ctrl + z» меньше, чем изменяется при отладке;) –