First you can modify object constructor:
class obj
{
private $id;
function __construct($type, $id) {
$this->id = $id;
}
}
...
$id_generator = new uniqueIDGenerator(); // instanciation of the generator
$obj1 = new obj(type, $id_generator->generateID($type));
$obj2 = new obj(type, $id_generator->generateID($type));
$obj3 = new obj(type, $id_generator->generateID($type));
...
In my projects, I would create a class named ObjectFactory:
class ObjectFactory {
private $id_generator;
public function __construct($id_generator) {
$this->id_generator = $id_generator;
}
public function create_object($type) {
return new obj($this->id_generator->generateID($type));
}
}
...
$id_generator = new uniqueIDGenerator(); // instanciation of the generator
$obj_factory = new ObjectFactory($id_generator);
$obj1 = obj_factory->create_object($type);
$obj2 = obj_factory->create_object($type);
$obj3 = obj_factory->create_object($type);
Finaly, to avoid the use of a global instance of this class, you can do a Singleton (adapted to your situation):
class uniqueIDGenerator
{
private $numberAObjs;
private $numberBObjs;
private $numberCObjs;
public static $instance = null;
public function __construct() {
$numberAObjs = 0;
$numberBObjs = 0;
$numberCObjs = 0;
}
public static function generateID($type) {
if(!self::$instance)
self::$instance = new uniqueIDGenerator();
return self::$instance->generateID2($type);
}
private function generateID2 ($type) {
if($type === "A") {
return 'a' . (int) $this->numberAObjs++;
} else if($type === "B") {
return 'b' . (int) $this->numberBObjs++;
} else if($type === "C") {
return 'c' . (int) $this->numberCObjs++;
}
}
}
uniqueIDGenerator::generateID("A");