родительский метод возвращается пустым при использовании в дочернем классе в переполнении стека

У меня есть родительский класс (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(),

0

Решение

Вам нужно использовать метод 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 в этом случае являются отдельными объектами. Вы должны сделать это, как я показал выше

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]