Использование функции класса внутри другого класса 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;

    }
}
Author: Maniero, 2014-05-22

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
 10
Author: Bacco, 2017-04-13 12:59:43

Я 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 и Соединение каждого с его ответственность.

Артикул:

 4
Author: , 2014-05-23 01:30:09