我希望通过rand()
为我班级的每个实例化生成一个随机ID。我希望它是独一无二的。这是我写的,但这不起作用。
class Computer
{
private $id = 0; // placeholder for ID
private $id_list = []; // placeholder to store used IDs
public function __construct()
{
$this->checkID();
}
private function checkID()
{
$this->id = rand(1,3);
if (!in_array($this->id, $this->id_list))
{
array_push($this->id_list, $this->id);
} else {
$this->checkID();
}
}
}
我故意尝试生成低值,例如rand(1,3)
,我有三个ID为2,2,1的对象。所以它不起作用。
我认为这是因为类$id_list
数组的每个新实例都变为空。但我看到人们几乎做同样的事情。声明$counter
变量并将$this->counter++
放入__construct
方法。那有什么区别?
答案 0 :(得分:1)
以这种方式使用的$counter
变量不是随机的,但它是唯一的。它只是在创建对象时对其进行计数,从0或1开始,具体取决于您的偏好。不同之处在于类的所有对象都在访问同一个变量。要实现这一点,必须将变量声明为静态,如下所示:
public static $counter = 0;
function __construct()
self::$counter++;
}
要生成一个也是唯一的随机数,您必须编写一个子程序,将生成的数字与每个实例化对象的id进行比较。这可能会很快变得低效,我不推荐它。但如果你打算这样做,它可能看起来像这样:
class Computer
{
private $id = 0; // placeholder for ID
private static $id_list = []; // placeholder to store used IDs
public function __construct()
{
$this->id = self::checkID();
}
private static function checkID()
{
$newID = rand(1,10000);
if (!in_array($newID, self::$id_list))
{
array_push(self::$id_list, $newID);
return $newID;
} else {
self::checkID();
}
}
}
答案 1 :(得分:1)
您需要将$ id_list设为静态,以便保留存储的值,如下所示:
class Computer
{
private $id = 0; // placeholder for ID
private static $id_list = []; // placeholder to store used IDs
public function __construct()
{
$this->checkID();
print_r(self::$id_list);
}
private function checkID()
{
$this->id = rand(1,3);
if (!in_array($this->id, self::$id_list))
{
array_push(self::$id_list, $this->id);
} else {
$this->checkID();
}
}
}
for($i = 0; $i < 10; $i++){
new Computer();
}
我添加了印刷线来展示结果,但你应该明白这一点。
答案 2 :(得分:0)
使用可以使用spl_object_hash()功能:
此函数返回对象的唯一标识符。这个id可以 用作存储对象或用于识别对象的哈希键 对象,只要对象不被破坏。一旦对象是 销毁后,其散列可以重用于其他对象。
每次构造对象时都可以调用spl_object_hash():
class Computer
{
private $id = ""; // placeholder for a unique random Id
public function __construct()
{
$this->id = spl_object_hash( $this );
}
}
请注意spl_object_hash()返回的值的唯一性有一个“弱”&#39;要点:
一旦对象被销毁,其哈希可以重用于其他对象 对象。
在这种情况下,您可以使用以下代码构建自己的hashing机制:
class Computer
{
private $id = ""; // placeholder for a unique random Id
private static $seed = 0; //placeholder for the seed
public function __construct()
{
self::$seed++;
$this->id = hash('md5', get_class($this) . self::$seed );
}
}
实际上,没有必要检查重复的ID,因为md5哈希在2^128
中的冲突概率为1!