NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Nefunkční autoloader

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jirka Musil
Člen
Avatar
Jirka Musil:10.8.2017 20:16

Zdravím, mohli byste mi prosím pomoci s autoloaderem?
Mám projekt a v něm klasicky index.php a složku classes, ve které je Api.php.
Úryvek mého kódu v index.php

use classes\Api;

function loadClass($class){
        require  'classes/' . $class . '.php';
}
spl_autoload_register("loadClass");

$api = new Api();

Při spuštění mi vyskočí error:

Fatal error: require(): Failed opening required 'classes/classes\Api.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\mvc\index.php on line 6

Zkoušel jsem předělat require na

require __DIR__ . '/classes/' . $class . '.php';

, ale taky mi to nepomohlo. Mohli byste mi prosím napsat správný require prosím?

 
Odpovědět
10.8.2017 20:16
Avatar
Odpovídá na Jirka Musil
Petr Štechmüller:10.8.2017 20:28

Ahoj, ve funkci loadClass smaž to 'classes/'. Vždyť ta chyba píše, že nemůže najít soubor na cestě: 'classes/clas­ses\Api.php'.
Funkce tedy bude vypadat takto:

function loadClass($class){
        require $class . '.php';
}

Je to proto, že v proměnné $class je celé jméno třídy, tedy i package.

Nahoru Odpovědět
10.8.2017 20:28
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Jirka Musil
Michal Šmahel:10.8.2017 20:37

Ahoj, tohle není problém v cestě, nýbrž v názvu třídy (a posléze souboru). Jelikož využíváš use, bere se název třídy včetně jmenného prostoru. Nechá se to jednoduše upravit a jmenný prostor odebrat.

use classes\Api;

/**
 * Načte zadanou třídu
 *
 * @param string $name Název třídy (včetně jmenného prostoru)
 */
function loadClass($name) {
        // Rozdělení na pole
        $nameArray = explode("\\", $name);

        // Název třídy je na posledním indexu
        $class = end($nameArray)

        // Načtení třídy
        require  'classes/' . $class . '.php';
}
spl_autoload_register("loadClass");

$api = new Api();
Nahoru Odpovědět
10.8.2017 20:37
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na Michal Šmahel
Michal Šmahel:10.8.2017 20:43

V návaznosti na komentář od Petra to trochu upravuji, aby to bylo univerzálnější. Každopádně jeho řešení bude lepší.

use classes\Api;

/**
 * Načte zadanou třídu
 *
 * @param string $name Název třídy (včetně jmenného prostoru)
 */
function loadClass($name) {
        // Rozdělení na pole
        $nameArray = explode("\\", $name);

        // Cesta k třídě
        $class = implode("/", $nameArray);

        // Načtení třídy
        require  $class . '.php';
}
spl_autoload_register("loadClass");

$api = new Api();
Editováno 10.8.2017 20:43
Nahoru Odpovědět
10.8.2017 20:43
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.