Использование функции класса внутри другого класса PHP
у Меня есть два класса, какой правильный способ вызвать функцию из другого класса, как показано ниже возвращает ошибку
class DB {
public function __construct($user, $password, $database, $host) {
$this->user = $user;
$this->password = $password;
$this->database = $database;
$this->host = $host;
$this->ConectarBanco();
}
protected function ConectarBanco() {
$this->mysqli = new mysqli($this->user, $this->password, $this->database, $this->host);
if (mysqli_connect_errno()) {
die('Não foi possível conectar-se ao banco de dados');
exit();
}
}
public function FecharBanco() {
$this->mysqli->close();
}
public function ExecutarSQL($sql) {
$this->result = $mysqli->query($sql);
return $this->result;
}
public function Consultar($dados) {
$this->newRow = array();
while($row = $mysqli->fetch_array($dados)) {
array_push($this->newRow,$this->row);
}
return $this->newRow;
}
}
class Acao{
public function fnAcao(){
$query = "SELECT * FROM tabela";
$result = DB::ConsultarSQL($query);
return $result;
}
}
2 answers
Одним из вариантов было бы создать новый объект внутри класса, например:
class MinhaClasseDois
{
public function minhaFuncaoDaClasseDois()
{
$objeto = new MinhaClasseUm();
$banana = $objeto->minhaFuncaoDaClasseUm();
}
}
Без создания нового объекта, он мог бы использовать global
PHP для ссылки на экземпляр уже существующего, но не является подходящим решением для повторного использования кода -
$instanciaDaClasseUm = new MinhaClasseUm();
class MinhaClasseDois
{
public function minhaFuncaoDaClasseDois()
{
global $instanciaDaClasseUm;
$banana = $instanciaDaClasseUm->minhaFuncaoDaClasseUm();
}
}
Как прокомментировал, лучший вариант для вашего случая конкретно, было бы сделать проход по параметру, который не нужно менять почти ничего в своем классе оригинал, требуя всего несколько коррективы в fnAcao
:
class Acao{
public function fnAcao($db) {
$query = "SELECT * FROM tabela";
$result = $db->ExecutarSQL($query);
return $result;
}
}
// Usando a passagem por parâmetro:
$db = new DB( 'Usuario', 'senha123', 'minhaBaseDeDados', 'exemplo.com' );
$db->ConectarBanco(); //Esta linha pode ir para a ação se desejar
$acao = new Acao();
$resultado = $acao->fnAcao($db); //Passando por parâmetro
$db->FecharBanco(); //Esta linha tambem pode ir para a ação se desejar
Я usuaria инъекции зависимостей в классе, который получит класс базы данных, строителя, загрузив связи.
class DBInterface {
public function ConectarBanco();
public function FecharBanco();
public function ExecutarSQL($sql);
public function Consultar($dados);
}
class DB implements DBInterface{
private $user;
private $password;
private $database;
private $host;
public function __construct($user, $password, $database, $host) {
$this->user = $user;
$this->password = $password;
$this->database = $database;
$this->host = $host;
$this->ConectarBanco();
}
public function ConectarBanco() {
$this->mysqli = new mysqli($this->user, $this->password, $this->database, $this->host);
if (mysqli_connect_errno()) {
die('Não foi possível conectar-se ao banco de dados');
exit();
}
}
public function FecharBanco() {
$this->mysqli->close();
}
public function ExecutarSQL($sql) {
$this->result = $mysqli->query($sql);
return $this->result;
}
public function Consultar($dados) {
$this->newRow = array();
while($row = $mysqli->fetch_array($dados)) {
array_push($this->newRow,$this->row);
}
return $this->newRow;
}
}
class Acao
{
//INJEÇÃO PELO CONSTRUTOR DA CLASSE
private $db;
public function __construct(DBInterface $db){
$this->db = $db;
}
public function fnAcao()
{
$query = "SELECT * FROM tabela";
$result = $this->db->ConsultarSQL($query);
return $result;
}
}
, Используя:
$db = new DB();
$acao = new Acao($db); //aqui com injeção
$resultado = $acao->fnAcao();
Несмотря на то, что указало бы лучшей модели для вас, чтобы слой DAL, POCO/DTO и Соединение каждого с его ответственность.
Артикул: