Я хотел бы динамически создать столько объектов, сколько присутствует в моем массиве $ instance (например, domain1_com
а также domain2_com
) и дайте им имя значения массива (например, domain1_com
а также domain2_com
) поэтому я могу получить к нему доступ через эти имена (например, domain1_com->example()
).
Является ли это возможным? Я пробовал что-то подобное, но, очевидно, не работает.
class myClass
{
public static function getInstances()
{
// I connect to the database and execute the query
$sql = "SELECT * FROM my_table";
$core = Core::getInstance();
$stmt = $core->dbh->prepare($sql);
if ($stmt->execute()) {
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Read values in my array
foreach ($results as $instance) {
$obj = $instance["domain"]);
// return 2 values: domain1_com and domain2_com
$obj = new myClass();
}
}
public function example()
{
echo "This is an instance";
}
}
myClass::getInstances();
$domain1_com->example();
$domain2_com->example();
Вы можете использовать переменные переменные.
$name = "foo";
$$name = new bar();
такой же как
$foo = new bar();
Вы не можете получить доступ к переменным, созданным внутри getInstances
вне этого метода. Они локальные, а не глобальные.
Попробуйте этот код:
class myClass
{
public static function getInstances()
{
$results = array('domain1_com', 'domain2_com');
foreach ($results as $instance) {
$$instance = new myClass();
// This is equivalent to "$domainX_com = new myClass();".
// Writing that code here would define a _local_ variable named 'domainX_com'.
// This being a method inside a class any variables you define in here are _local_,
// so you can't access them' _outside_ of this method ('getInstances')
}
// this will work, we are inside 'getInstances'
$domain1_com->example();
$domain2_com->example();
}
public function example()
{
echo "This is an instance";
}
}
myClass::getInstances();
// this won't work. $domainX_com are not accessible here. they only exist _inside_ 'getInstances'
// It's basic OOP.
// so this code will crash
$domain1_com->example();
$domain2_com->example();
Это произведет этот вывод:
Это пример
Это пример
E_NOTICE: тип 8 — неопределенная переменная: domain1_com — в строке 32
E_ERROR: тип 1 — вызов функции-члена example () для необъекта — в строке 32
Вам нужен способ доступа к этим переменным. Я бы использовал это:
class myClass
{
private static $instances = array();
public static function getInstances()
{
$results = array('domain1_com', 'domain2_com');
foreach ($results as $instanceName) {
self::$instances[$instanceName] = new myClass();
}
}
public static function getInstance($instanceName) {
return self::$instances[$instanceName];
}
public function example()
{
echo "This is an instance";
}
}
myClass::getInstances();
// this will work
myClass::getInstance('domain1_com')->example();
myClass::getInstance('domain2_com')->example();
Других решений пока нет …