2015-12-17 2 views
1

Я кодирую большой скрипт на 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! 
+0

'самостоятельно :: $ SystemToken' не статический член, и, таким образом, должен быть использован с' $ this-> SystemToken'. – Ian

+0

Его один «ctrl + z» меньше, чем изменяется при отладке;) –

ответ

1

В вашем методе validateToken у вас есть это.

$this -> $SystemToken 

Это должно быть

$this -> SystemToken 
+0

Эта ошибка, скорее всего, вызвана странным форматированием (с пробелами между '$ this->' и 'self ::' и переменными-членами/функциями. – Ian

+0

Да , его просто ошибка при написании кода здесь :) В файлах у меня есть это -> SystemToken. Благодаря :) –