У меня есть родительский класс (DB
) с открытым методом с именем con()
,
Этот метод должен возвращать все, что находится внутри private $con
— что он делает как внутри самого класса, так и извне.
class DB
{
private $con = array();
public function add($alias, $db, $un, $pw, $desc)
{
try {
$options = array(/*PDO OPTIONS*/)
$this->con[$alias] = array(
'alias' => $alias,
'db' => $db,
'dbh' => new PDO('mysql:host=localhost;dbname='.$db.';charset=utf8', $un, $pw, $options), 'desc'=>$desc);
} catch(PDOException $e) {
/* return error message */
}
}
public function con()
{
return $this->con;
}
}
Я добавляю такие соединения:
$db = new DB();
$db->add('alias1','databasename','username','password','an optional short description');
$db->add('alias2','databasename2','username2','password2','');
Теперь private $con
должно быть заполнено двумя связями — что это такое.
И con()
Метод должен теперь вернуть эти соединения — что он также делает:
Я поднял эту функцию теста внутри KD
-учебный класс:
public function aliases()
{
foreach($this->con() as $con){ // this should returns an array with the aliases.
$aliases[] = $con['alias'];
}
return $aliases;
}
Следующий код возвращает: array(2) { [0]=> string(4) "alias1" [1]=> string(4) "alias2" }
<?=var_dump($db->aliases())?>
Теперь я также создал useAliases()
в качестве метода тестирования внутри дочернего класса, который расширяет DB
учебный класс:
class SQL extends DB
{
public function useAliases()
{
var_dump($this->aliases());
}
}
Следующий код возвращает: NULL NULL
$sql = new SQL();
var_dump($sql->useAliases());
Почему это происходит? Я ожидал, что useAliases()
вернул бы так же, как aliases()
,
Вам нужно использовать метод add()
из родительского класса, чтобы установить соединение. Теперь значение по умолчанию $con
атрибут array()
потому что вы определили это так:
private $con = array();
так что вы получите то, что ожидается.
Если вы хотите, чтобы это работало, вам нужно выполнить это следующим образом:
$sql = new Sql();
$sql->add('alias','db','un','pw','desc');
$sql->showTables();
РЕДАКТИРОВАТЬ
Так нельзя:
$db = new DB();
$db->add('alias1','databasename','username','password','an optional short description');
$db->add('alias2','databasename2','username2','password2','');
$sql = new Sql();
$sql->showTables();
потому что $ db и $ sql в этом случае являются отдельными объектами. Вы должны сделать это, как я показал выше
Других решений пока нет …