Do require_once within the classes. Is it possible?

Asked

Viewed 231 times

0

I’m trying to create a architecture new based on a need and I’m having some difficulty.

So I decided to create an example minimum, complete and verifiable of the application.

It is a architecture MVC I am trying to modify in order to meet a personal need.

Well, follow the tree

conexao 
        Conexao.php
controle
        CPessoas.php
modelo
        MPessoas.php
visao
        VPessoas.php
erros.php
index.php

Follows the files:

Connexion.php:

<?php

 class Conexao {


    private $host     = "localhost";    
    private $db       = "banco";     
    private $user     = "ususarioBanco";
    private $password = "senhaBanco";

    private $conexao;

    public function abreConexao() {

        if (isset($this->conexao))      {

            return $this->conexao;

        }  else {       

                $this->conexao = new mysqli($this->host, $this->user, $this->password, $this->db);

                $this->conexao->set_charset("utf8");    

                return $this->conexao;
        }

    }

    public function fechaConexao () {

        if ($this->conexao != null) {

            $this->conexao = null;

        }
    }

  }

?>

Cpessoas.php:

<?php

require_once "../conexao/Conexao.php";

class CPessoas {

    private $conexao;

    public function __construct() {
        $connection = new Conexao();
        $conexao = $connection->abreConexao();
        $this->conexao = $conexao;
    }

    public function cadastrar( $_pessoa ) {

        $string = "INSERT INTO (nome, idade) VALUES (" . $_pessoa->getNome() . "," . $_pessoa->getIdade() . " )";

        return $conexao->query( $string );

    }

}

Mpessoas.php:

<?php

class MPessoas {

    private $id;
    private $nome;
    private $idade;

    public function __construct( $_nome, $_idade ) {

        $this->nome = $_nome;
        $this->idade = $_idade;

    }

    public function setId( $_Id )$this->id = $_id;

    public function getId() return $this->id;

    public function getNome() return $this->nome;

    public function getIdade() return $this->idade;


}

Vpessoas.php:

<?php

require_once "../modelo/MPessoas.php";
require_once "../controle/CPessoas.php";

class VPessoas {

    public function __construct() {}

    public function novaPessoa( $_nome, $_idade ) {

        $pessoa = new MPessoa( $_nome, $_idade );

    }

    public function cadastrar( $_pessoa ) {

        return $pessoaComtrole->cadastrar( $_pessoa ) ? "Cadastrado com sucesso" : "Erro no cadastro";

    }


}

php errors.

<?php
ini_set( "display_errors", true );
ini_set( "display_startup_erros", 1 );
error_reporting( E_ALL && E_NOTICE );
error_reporting( E_ALL | E_STRICT ); // PHP 5.3
error_reporting( E_ALL ); // Todas as outras versões 
error_reporting(
    E_ERROR |
    E_WARNING |
    E_PARSE |
    E_NOTICE |
    E_CORE_ERROR |
    E_CORE_WARNING |
    E_COMPILE_ERROR |
    E_COMPILE_WARNING |
    E_USER_ERROR |
    E_USER_WARNING |
    E_USER_NOTICE |
    E_ALL |
    E_STRICT
); // Todas as outras versões 
?>

index php.

<?php

header( "Content-Type: text/html; charset=utf-8" );

require_once "erros.php";
require_once "visao/VPessoas.php";


$vpessoa = new VPessoas();

$pessoa = $vpessoa->novaPessoa( "Carlos", 49 );

$vpessoa->cadastrar( $pessoa );


?>

But, as expected, I would have one error:

Warning: require_once(../modelo/MPessoas.php): failed to open stream: No such file or directory in D:\Trabalhos\host\htdocs\mvc\visao\VPessoas.php on line 3

Fatal error: require_once(): Failed opening required '../modelo/MPessoas.php' (include_path='.;C:\php\pear') in D:\Trabalhos\host\htdocs\mvc\visao\VPessoas.php on line 3

Logo de inicio por ter incluido as classes fora da página index usando require_once.

Doubt: I wonder if we could make it like a import of java in order to avoid importação of all the classes in home page?

  • 1

    Dear Carlos, you probably want this: https://answall.com/q/88023/3635

3 answers

2

One thing you need to be clear about is that include (or require) is different from import.

When you do the include of a file on index.php, for the PHP interpreter it’s like you copy all the code from this file and paste it into the file itself index.php. I mean, if you do require_once "../modelo/MPessoas.php" the way will be relative to index.php, not to the archive itself VPessoas.php, which explains why the file was not found.

If your index.php is the entry point of your application, you 1) must always include the files indicating the path index.php; 2) or include the files indicating the relative path indicating the current directory (__DIR__).

By the way, this is a very common problem in PHP and has already been solved through Psrs 0 and 4, defining standards of nomenclature and directory organization for your files, which allows you to define auto load dependencies structures, as Composer himself does and as described by William in

0

The código final without the use of autoloader was like this: Connexion.php

<?php

class Conexao {


    private $host = "localhost";
    private $db = "banco";
    private $user = "usuarioBanco";
    private $password = "senhaBanco";

    private $conexao;

    public
    function abreConexao() {

        if ( isset( $this->conexao ) ) {

            return $this->conexao;

        } else {

            $this->conexao = new mysqli( $this->host, $this->user, $this->password, $this->db );

            $this->conexao->set_charset( "utf8" );

            return $this->conexao;
        }

    }

    public
    function fechaConexao() {

        if ( $this->conexao != null ) {

            $this->conexao = null;

        }
    }

}

?>

Cpessoas.php

<?php

require_once __DIR__ . "/../conexao/Conexao.php";

class CPessoas {

    private $conexao;

    public
    function __construct() {

        $connection = new Conexao();
        $conexao = $connection->abreConexao();
        $this->conexao = $conexao;

    }

    public
    function cadastrar( $_pessoa ) {

        $string = "INSERT INTO pessoas (nome, idade) VALUES ('" . $_pessoa->getNome() . "'," . $_pessoa->getIdade() . ")";

        return $this->conexao->query( $string );

    }

}

Mpessoas.php

<?
**VPessoas.php**

    <?php

    require_once __DIR__ . "/../modelo/MPessoas.php";
    require_once __DIR__ . "/../controle/CPessoas.php";

    class VPessoas {

        public
        function __construct() {}

        public
        function novaPessoa( $_nome, $_idade ) {

            return new MPessoas( $_nome, $_idade );

        }

        public
        function cadastrar( $_pessoa ) {

            $pessoaControle = new CPessoas();

            return $pessoaControle->cadastrar( $_pessoa ) ? "Cadastrado com sucesso" : "Erro no cadastro";

        }


    }

index php.

<?php

header( "Content-Type: text/html; charset=utf-8" );

require_once __DIR__ . "/erros.php";
require_once __DIR__ . "/visao/VPessoas.php";

$vPessoa = new VPessoas();

$pessoa = $vPessoa->novaPessoa( "Carlos", 49 );

echo $vPessoa->cadastrar( $pessoa );


?>

php errors.

<?php
ini_set( "display_errors", true );
ini_set( "display_startup_erros", 1 );
error_reporting( E_ALL && E_NOTICE );
error_reporting( E_ALL | E_STRICT ); // PHP 5.3
error_reporting( E_ALL ); // Todas as outras versões 
error_reporting(
    E_ERROR |
    E_WARNING |
    E_PARSE |
    E_NOTICE |
    E_CORE_ERROR |
    E_CORE_WARNING |
    E_COMPILE_ERROR |
    E_COMPILE_WARNING |
    E_USER_ERROR |
    E_USER_WARNING |
    E_USER_NOTICE |
    E_ALL |
    E_STRICT
); // Todas as outras versões 
?>

0

Another resolution I got ma now using spl_autoload_register

php connection.

class Conexao {


    private $host     = "localhost";    
    private $db       = "banco";     
    private $user     = "ususarioBanco";
    private $password = "senhaBanco";

    private $conexao;

    public function abreConexao() {

        if (isset($this->conexao))      {

            return $this->conexao;

        }  else {       

                $this->conexao = new mysqli($this->host, $this->user, $this->password, $this->db);

                $this->conexao->set_charset("utf8");    

                return $this->conexao;
        }

    }

    public function fechaConexao () {

        if ($this->conexao != null) {

            $this->conexao = null;

        }
    }

  }

Cpessoas.php

class CPessoas {

    private $conexao;

    public
    function __construct($_conexao) {

        $this->conexao = $_conexao;

    }

    public
    function cadastrar( $_pessoa ) {

        $string = "INSERT INTO pessoas (nome, idade) VALUES ('" . $_pessoa->getNome() . "'," . $_pessoa->getIdade() . ")";

        return $this->conexao->query( $string );

    }

}

Mpessoas.php

class MPessoas {

    private $id;
    private $nome;
    private $idade;

    public
    function __construct( $_nome, $_idade ) {

        $this->nome = $_nome;
        $this->idade = $_idade;

    }

    public
    function setId( $_id ) {
        $this->id = $_id;
    }

    public
    function getId() {
        return $this->id;
    }

    public
    function getNome() {
        return $this->nome;
    }

    public
    function getIdade() {
        return $this->idade;
    }


}

Vpessoas.php

class VPessoas {

    public
    function __construct() {}

    public
    function novaPessoa( $_nome, $_idade ) {

        return new MPessoas( $_nome, $_idade );

    }

    public
    function cadastrar( $_pessoa, $_pessoaControle ) {

        return $_pessoaControle->cadastrar( $_pessoa ) ? "Pessoa cadastrada com sucesso" : "Erro no cadastro da pessoa";

    }


}

php errors.

ini_set( "display_errors", true );
ini_set( "display_startup_erros", 1 );
error_reporting( E_ALL && E_NOTICE );
error_reporting( E_ALL | E_STRICT ); // PHP 5.3
error_reporting( E_ALL ); // Todas as outras versões 
error_reporting(
    E_ERROR |
    E_WARNING |
    E_PARSE |
    E_NOTICE |
    E_CORE_ERROR |
    E_CORE_WARNING |
    E_COMPILE_ERROR |
    E_COMPILE_WARNING |
    E_USER_ERROR |
    E_USER_WARNING |
    E_USER_NOTICE |
    E_ALL |
    E_STRICT
); // Todas as outras versões 

index php.

require_once "erros.php";

function loader( $class ) {

    $paths[] = "conexao/" . $class . ".php";
    $paths[] = "controle/" . $class . ".php";
    $paths[] = "modelo/" . $class . ".php";
    $paths[] = "visao/" . $class . ".php";

    foreach ( $paths as $path ):

        if ( file_exists( $path ) ) require_once $path;

    endforeach;

}

spl_autoload_register( 'loader' );

$conexao = new Conexao();

$connection = new Conexao();
$conexao = $connection->abreConexao();

$cPessoa = new CPessoas( $conexao );

$vPessoa = new VPessoas();
$pessoa = $vPessoa->novaPessoa( "Carlos", 49 );

echo $vPessoa->cadastrar( $pessoa, $cPessoa );

In that version, the index php. got bigger

Browser other questions tagged

You are not signed in. Login or sign up in order to post.