Рандом функция на две места

teroristd

Registered
Здравейте, имам следния проблем. Генерирам някакъв рандом стринг примерно с rand(). Трябва ми резултатът от функцията да мога да го предавам между класовете без да се променя. В случая при всяко извикване на функцията резултатът е различен и не мога да сравнявам стринговете. Някаква идея как да стане? Също така трябва да е без да се записва в база данни или сесия.
 
Най-вероятно ще стане, обаче така е все едно да декларирам глобална променлива, което не е добре.
 
Нещо такова ли трябва да бъде:
PHP:
class Rand {
	protected $random = 'random string';
}

class MyClass extends Rand {	
	public function compare() {
		echo $this->random;	
	}	
}
 
Ето примерен код. Трябва в клас One и клас Two стринговете да са еднакви. Проблемът е че, самата функция bin2hex(openssl_random_pseudo_bytes(16)); или каквато и да е друга рандом функция при всяко извикване генерира нов код.

Код:
class Rand {
    
    public function randomString() {

        $string = bin2hex(openssl_random_pseudo_bytes(16));

        return $string;
    }
}

class One {

    private $_rand;

    public function __construct(Rand $rand) {
        
        $this->_rand = $rand;
    }
    
    public function run() {

        $string = $this->_rand->randomString();

        echo $string;
    }
}

class Two {

    private $_rand;

    public function __construct(Rand $rand) {
        
        $this->_rand = $rand;
    }
    
    public function run() {

        $string = $this->_rand->randomString();

        echo $string;
    }
}
 
Принципно с наследяване ще стане, но се чудя има ли по-добър вариант.
 
Там където се създават One и Two не може ли да се създава и този стринг, и сътоветно той да се pass-ва в конструктора?
 
Код:
<?php
class Rand {
    private static $rand;
    public static function randomString() {
        if(is_null(self::$rand)) {
            self::$rand = bin2hex(openssl_random_pseudo_bytes(16));
        }
        return self::$rand;
    }
}

class One {
    public $random;
    public function __construct() {
        $this->random = Rand::randomString();
    }
}

class Two {
    public $random;
    public function __construct() {
        $this->random = Rand::randomString();
    }
}

$one = new One;
$two = new Two;
var_dump($one === $two); //FALSE
var_dump($one->random === $two->random); //TRUE
 
Fakeheal каза:
Код:
<?php
class Rand {
    private static $rand;
    public static function randomString() {
        if(is_null(self::$rand)) {
            self::$rand = bin2hex(openssl_random_pseudo_bytes(16));
        }
        return self::$rand;
    }
}

class One {
    public $random;
    public function __construct() {
        $this->random = Rand::randomString();
    }
}

class Two {
    public $random;
    public function __construct() {
        $this->random = Rand::randomString();
    }
}

$one = new One;
$two = new Two;
var_dump($one === $two); //FALSE
var_dump($one->random === $two->random); //TRUE


Това е същото като сингълтон само дето не връщам класа а самия стринг. Аз до такава степен съм почнал да избягвам сингълтоните че изобщо не ми е хрумнало че може да се напише по този начин :D .
 

Горе