Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Autoload PHP

Boa noite,

Estou tendo dificuldade para carregar o meu arquivo 'autoload.php'.

Entendi o mecanismo de funcionamento do autoload mas, pelo que consigo entender, meu arquivo não está apontando para o arquivo correto. Acho que estou fazendo as referências de forma errada.

Como não dá para colar imagens, vou tentar expor de outra forma.

O caminho da minha classe é esse:

/Users/juliobarreto/Documents/sistemaLarco/php/modelo/S10.php

O caminho da meu autoload:

/Users/juliobarreto/Documents/sistemaLarco/php/autoload.php

O conteúdo do meu autoload:

<?php

spl_autoload_register(function(string $nomeCompletoDaClasse){

    $caminhoDaClasse = str_replace('/Users/juliobarreto/Documents/sistemaLarco/','SistemaLarco', $nomeCompletoDaClasse);
    $caminhoDaClasse = str_replace('\\',DIRECTORY_SEPARATOR, $caminhoDaClasse);
    $caminhoDaClasse .= '.php';

    if(file_exists($caminhoDaClasse)){
        require_once $caminhoDaClasse;
    }
});

E por último, o código da minha classe:

<?php

namespace Sistema\Larco\php\modelo;

use Sistema\Larco\php\modelo\Produto;

class S10 extends Produto
{
    private $composto;

    public function __construct($estoque, $percentualComposicao, Produto $composto)
    {
        parent::__construct($estoque, $percentualComposicao);
        $this->composto = $composto;
    }

    public function venda (float $volume) : float
    {
        $this->estoque = $this->estoque - ($volume * $this->percentualComposicao);
    }
}
1 resposta
solução!

Julio, tudo bem contigo? Vou tentar te ajudar aqui!

Primeiramente veja como deixei a estrutura de diretórios:

Pasta php: index.php autoload.php Dentro da pasta /php foi criada a pasta /src , de 'source' para criar teu namespace SistemaLarco.

Dentro desta estrutura foi criada a pasta /modelos. Assim em /php/src/modelos ficaram: S10.php Produto.php (Tive de criar esta classe para rodar teu programa).

A ideia do namespace é substituir um caminho fisico por um alias (ou apelido) que você prefira usar. Assim todo o código do sistema ficaria dentro da pasta /src e ao chamar o namespace pode usar SistemaLarco, porém tem de fazer esta substituição no teu autoloader o código esta abaixo.

No código abaixo, a grande dica que eu te daria, que me ajudou muito é usar as funções: echo die()

..dentro do Autoload para você ver como o autoload vai montando o caminho para o carregamento da classe.

Dai veja que mudei o teu autoload e mudei o namespace. Veja se isto te ajuda, se sim, pode marcar este tópico como solucionado, se não poste aqui ainda suas dúvidas especificas ainda sobre o que foi feito.

Um abraço e bons estudos.

Segue os códigos fonte:

index.php: (Para testar com > php index.php na tua linha de comando).

<?php 
use SistemaLarco\modelos\S10;
require 'autoload.php';
    $auto = new S10(10, 15, 100);
    var_dump($auto);

autoload.php:

<?php

spl_autoload_register(function(string $nomeCompletoDaClasse){

    echo $nomeCompletoDaClasse;
    echo PHP_EOL;

    $caminhoDaClasse = str_replace('SistemaLarco','\src', $nomeCompletoDaClasse);
    $caminhoDaClasse = str_replace('\\',DIRECTORY_SEPARATOR, $caminhoDaClasse);

    echo $caminhoDaClasse;
    echo PHP_EOL;

    $caminhoDaClasse = getcwd() . $caminhoDaClasse . '.php';

    echo $caminhoDaClasse;
    echo PHP_EOL;
    //die();

    if(file_exists($caminhoDaClasse)){
        require_once $caminhoDaClasse;
    }
});

S10.php: Aqui basicamente alterei o nome do diretório para "modelos" e alterei o namespace.

<?php
namespace SistemaLarco\modelos;
class S10 extends Produto
{
    private $composto;

    public function __construct($estoque, $percentualComposicao, $composto)
    {
        parent::__construct($estoque, $percentualComposicao);
        $this->composto = $composto;
    }

    public function venda (float $volume)
    {
        $this->estoque = $this->estoque - ($volume * $this->percentualComposicao);
    }
}

Produto.php: Montei esta classe somente para poder testar teu código.

<?php

namespace SistemaLarco\modelos;

class Produto {

    public $estoque;

    public function __construct($estoque, $percentualComposicao)
    {
        $this->estoque = $estoque;
        $this->percentualComposicao = $percentualComposicao;
    }


}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software