korzytanie z przestrzeni nazw

0

Cześć wszystkim!

Problem wygląda następująco. Uczę się korzystać z przestrzeni nazw. Mam dwa pliki. index.php oraz class.MySQLDriver.php (ten plik w podfolderze "service").

Pokażę kody obu plików:

  1. class.MySQLDriver.php
<?php

namespace Service;

/**
 * Driver for DB connections, queries, etc.
 */
class MySQLDriver {
    
    private $pdo = null;
    
    function __construct(PDO $pdo)
    {
        if(!isset($this->pdo)){
            $this->pdo = $pdo;
            echo'New $pdo has been set.';
        }
    }
}
  1. index.php
<!DOCTYPE html>
<?php
    use \Service\MySQLDriver;
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    require_once 'config.php';
    
    $pdo = new PDO(
            $config['db_dsn'], 
            $config['db_user'], 
            $config['db_pass'],
            null
            );
    $dbdriver = new MySQLDriver($pdo); //to jest linia 21
?>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php
            echo $config['db_dsn'];
        ?>
    </body>
</html>

Cały czas otrzymuję taki błąd:
Fatal error: Class 'service\MySQLDriver' not found in /var/www/html/phpLibrary/index.php on line 21

Kombinuję na różne sposoby już pół godziny i nie mogę nic wymyślić. Ktoś naprowadzi?

z góry dzięki i pozdrawiam!

1

Takie głupie pytanie - a czy ładujesz gdzieś class.MySQLDriver.php ? Przykład tego nie pokazuje, a czasem robi się takie głupie błędy:p

0

Idąc tropem pozostawionym przez @dzek69 i tak muszę dopisać ładowanie pliku. Na tę chwilę zrobiłem to tak:

    require_once 'config.php';
    require_once 'Service/class.MySQLDriver.php';
    
    use Service\MySQLDriver;

No i działa. :) W niedzielę postaram się napisać autoloder. Pisać całość samemu czy używać spl_autoload() do ładowania klas?

1

ja bym napisał samemu - będzie szybsze (mniej zbędnych plików do sprawdzenia) i pewniejsze (spl widzę bazuje na include path, co nie zawsze jest sensownie ustawione i pod naszą kontrolą)

1

W większości projektów używa się composera. Użyj go do ładowania klas, na przyszłość się przyda :).

https://getcomposer.org/doc/01-basic-usage.md#autoloading

0

A więc tak, po pierwsze wybaczcie za późną odpowiedź. Nie miałem wcześniej kiedy przysiąść. :)

Problem rozwiązałem wg tego co podpowiedział mi @gaUa69, wykorzystałem composera i autoładowanie wg standardu psr-4. Przy okazji uporządkowało mi to strukturę projektu.

Okazało się, że żeby tak ładować klasy musiałem zmienić nieco konwencję, a szkoda, bo chciałem od razu rozróżniać klasy od interfejsów i traitsów.

Np. moja klasa nazywała się class.MySQLDriver.php, musiałem zostawić MySQLDriver.php, inaczej autoloader nie mógł znaleźć klasy.

Wykorzystałem composera, a więc plik composer.json wygląda następująco:

{
    "autoload": {
        "psr-4": {
            "Service\\": "src/Service/",
            "Model\\": "src/Model/"
        }
    }
}

Autoloader composera znajduje się w katalogu vendor/autoload.php i wystarczy dodać go w pliku php, teraz kod mojego pliku index.php wygląda tak:

<?php
    require_once __DIR__ . '/vendor/autoload.php';
    require_once 'config.php';    
    
    use \Service\MySQLDriver;

    error_reporting(E_ALL);
    ini_set('display_errors', 1);    
    
    $pdo = new PDO(
            $config['db_dsn'], 
            $config['db_user'], 
            $config['db_pass'],
            null
            );
    $dbdriver = new MySQLDriver($pdo);
?>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php
            echo $config['db_dsn'];
        ?>
    </body>
</html>

A więc problem rozwiązany. Przy okazji nauczyłem się też pisać własny autoloader tak jak pisał @dzek69. Ostatecznie wykorzystałem composera, jak wspomniał @gaUa69.
Panowie dzięki za pomoc! :)

1
ajgoron napisał(a):

Okazało się, że żeby tak ładować klasy musiałem zmienić nieco konwencję, a szkoda, bo chciałem od razu rozróżniać klasy od interfejsów i traitsów.

Np. moja klasa nazywała się class.MySQLDriver.php, musiałem zostawić MySQLDriver.php, inaczej autoloader nie mógł znaleźć klasy

Według mnie to nie jest potrzebne i wygląda dziwnie, więc nie przejmuj sie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1