Error Class not found with Composer

Asked

Viewed 802 times

1

Good people, next, I’m doing a project here and giving me some problems, I think I’m mixing things up.

I installed Composer to use autoload and other dependencies, but now I have a problem:

The mistake you make is this::

Fatal error: Uncaught Error: Class 'Base' not found in C:\Apache24\htdocs\cadUsuario.php:8 Stack trace: #0 {main} thrown in C:\Apache24\htdocs\cadUsuario.php on line 8

The files are like this:

Composer.json

"require": {
    "php": ">=7.1",
    "phpmailer/phpmailer": "~5.2"
},
"autoload": {
  "psr-4": {"Photobooker\\": "class/"}
}

My classes are Base and Connected:

Groundwork:

<?php
namespace Photobooker;
require_once "vendor/autoload.php";
$db = Conexao::getInstance();

Connection:

namespace Photobooker;

class Conexao
{

    private static $pdo;

    private function __construct() {}

    public static function getInstance() {
        $conn = require(__DIR__ . '/../dbconfig.php');
        if (!isset(self::$pdo)) {
            try {
                self::$pdo = new PDO("pgsql:host=$conn[host]; dbname=$conn[dbname]", $conn['user'], $conn['pass']);
                self::$pdo = new PDO("pgsql:host=$conn[host]; dbname=$conn[dbname]", $conn['user'], $conn['pass']);
            } catch (PDOException $e) {
                print "Erro: " . $e->getMessage();
            }
        }

        return self::$pdo;
    }
}

the file that calls it all is called cadUsuario.php and is thus initiated:

<?php

require "vendor/autoload.php";

$pdo = Base::getInstance($db, "usuario");

The autoload there should not call the class Base?


I amended the following:

in cadUsuario:

require "vendor/autoload.php";
$pdo = Photobooker\Base::getInstance($db, "usuario");

in connection:

namespace Photobooker;
class Conexao
{
 private static $pdo;
 private function __construct()
{
}

public static function getInstance() {
    $conn = require(__DIR__ . '/../dbconfig.php');
    if (!isset(self::$pdo)) {
        try {
            self::$pdo = new PDO("pgsql:host=$conn[host]; dbname=$conn[dbname]", $conn['user'], $conn['pass']);
            self::$pdo = new PDO("pgsql:host=$conn[host]; dbname=$conn[dbname]", $conn['user'], $conn['pass']);
        } catch (PDOException $e) {
            print "Erro: " . $e->getMessage();
        }
    }
    return self::$pdo;
 }
 }

and on Basis:

include_once "Conexao.php";

$db = Photobooker\Conexao::getInstance();
class Base {

private $pdo = null;  // Atributo para guardar uma conexão PDO
private $tabela = null;  // Atributo onde será guardado o nome da tabela
private static $crud = null;  // Atributo estático que contém uma instância da própria classe
public $nRows = null;

And now the error that returns is:

Fatal error: Uncaught Error: Class 'Photobooker\PDO' not found in C:\Apache24\htdocs\class\Conexao.php:19 Stack trace: #0 C:\Apache24\htdocs\class\Base.php(6): Photobooker\Conexao::getInstance() #1 C:\Apache24\htdocs\vendor\composer\ClassLoader.php(440): include('C:\\Apache24\\htd...') #2 C:\Apache24\htdocs\vendor\composer\ClassLoader.php(322): Composer\Autoload\includeFile('C:\\Apache24\\htd...') #3 [internal function]: Composer\Autoload\ClassLoader->loadClass('Photobooker\\Bas...') #4 C:\Apache24\htdocs\cadUsuario.php(8): spl_autoload_call('Photobooker\\Bas...') #5 {main} thrown in C:\Apache24\htdocs\class\Conexao.php on line 19

If I add in Connection:

use PDO;

The error changes to:

Fatal error: Uncaught Error: Class 'Photobooker\Base' not found in C:\Apache24\htdocs\cadUsuario.php:8 Stack trace: #0 {main} thrown in C:\Apache24\htdocs\cadUsuario.php on line 8
  • Is calling the autoload 2 times?

  • But there’s no class Base. The method getInstance is stated in Conexao. Base is in fact a class? And don’t forget the namespaces, if your file cadUsuario do not belong to the same namespace, classes shall be instantiated with Photobooker\Base.

  • @Maurivan Autoload within the Base class, because it uses a method from another class, it is better to import this class directly?

  • @Andersoncarloswoss the Base class exists yes, it is that I did not put it all there, I put soh the "header". cadUsuario in this case is the controller for users registration. But I will make the changes here.

  • 1

    The autoload is there precisely to prevent the import of classes at all times. Watch the link video for better understanding and use of autoload and namespace. https://youtu.be/UeCVTtRmGE

  • @Maurivan great, clarified me enough. Thanks for the help!

Show 1 more comment
No answers

Browser other questions tagged

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