Use en Namespace

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jorn Reed

Jorn Reed

01/04/2020 22:28:33
Quote Anchor link
Kan iemand mij een beetje uitleggen wat goed is aan `use` en `namespace`

Ik had begrepen dat je dan in bijvoorbeeld 1 project meerdere classes met dezelfde naam zou kunnen gebruiken, of stel je gebruikt een api van iemand, dat er geen conflicten zijn met dezelfde namen die misschien in je project voorkomen.

Stel ik heb een User.php:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
namespace Classes/Model/User;

...


En een index.php waar ik de user class wil gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
use Classes/Model/User as User;

$jorn = new User();


Werkt het een beetje zo als op mijn voorbeeld, of zie ik het hele principe helemaal verkeerd?
Had ook nog begrepen dat ik ergens een autoload functie moet toepassen.
 
PHP hulp

PHP hulp

19/03/2024 08:32:28
 
Rob Doemaarwat

Rob Doemaarwat

01/04/2020 22:48:16
Quote Anchor link
Redelijk goed. Wat opmerkingen:

* De separator is een BACKspace.
* Als je een class Classes\Model\User hebt, dan is de namespace Classes\Model (en de class User - in die namespace).
* In use Classes\Model\User as User is de "as User" niet perse nodig (als je 'm weg laat is het alias automatisch de naam van de class = "User"). Alleen als je bijvoorbeeld twee "User" classes hebt (maar elk in een andere namespace), dan geef je de een een andere alias (user Classes\Model\User as UserModel - of zoiets).

Autoload functie hoeft niet perse (je kunt gewoon met het handje blijven includen), maar het werkt wel heel handig (je hoeft niet meer bij te houden wat je al wel/niet ge-include hebt, of include_once te gebruiken). Standaard wordt dan bijvoorbeeld Classes\Model\User in een bestand in Classes/Model/User.php gezocht (dit bestand wordt dan automatisch ge-include). Maar je kunt het ook naar je eigen inzicht/gewoonten instellen (callback functie bij spl_autoload_register()), dat ie dus bijvoorbeeld classes/model/user.class.php include).
Gewijzigd op 01/04/2020 22:54:31 door Rob Doemaarwat
 
Jorn Reed

Jorn Reed

05/04/2020 17:52:20
Quote Anchor link
Sorry voor de late reactie.

Dus zodra ik een bijvoorbeeld use App\Models\User as User; doe, kan ik gewoon een object aanmaken door $user = new User(); te doen?

En die autoload functie, die zou ik ook nog ergens in een apart bestand kunnen doen, om m'n code schoon te houden, of raad je gewoon aan, dat in de index.php te doen?
 
Marthijn Buijs

Marthijn Buijs

05/04/2020 23:26:26
Quote Anchor link
Jorn Reed op 05/04/2020 17:52:20:
Sorry voor de late reactie.

Dus zodra ik een bijvoorbeeld use App\Models\User as User; doe, kan ik gewoon een object aanmaken door $user = new User(); te doen?

En die autoload functie, die zou ik ook nog ergens in een apart bestand kunnen doen, om m'n code schoon te houden, of raad je gewoon aan, dat in de index.php te doen?


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
App\Models\User as User;

Kan je veranderen naar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
App\Models\User;



Verder, je zou het inderdaad het in een apart bestand kunnen stoppen, maar dat is meer een voorkeur eigenlijk. Je zou eens kunnen kijken naar Composer voor het autoloaden, dit wordt meer gebruikt.
Gewijzigd op 05/04/2020 23:26:50 door Marthijn Buijs
 
Frank Nietbelangrijk

Frank Nietbelangrijk

06/04/2020 17:47:14
Quote Anchor link
>> Dus zodra ik een bijvoorbeeld use App\Models\User as User; doe, kan ik gewoon een object aanmaken door $user = new User(); te doen?

Correct en zoals Marthijn al aangeeft is het stukje met AS en een alias optioneel. Je kunt de class ook nog aanroepen door de Fully qualified name (FQN) te gebruiken. Je begint dan met de backslash gevolgd door de namespace met classnaam:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$user = new \App\Models\User();

Je hebt dan geen use statement nodig.

Een andere veelgestelde vraag is hoe je een standaard PHP class aanroept wanneer je met namespaces werkt.
Binnen het bestand User.php geef je met de eerste regelcode aan dat de namespace App\Models is. Je bent nu dus niet meer in de global namespace maar in de App\Models namespace bezig. Je kunt nu toch een standaard PHP class gebruiken door de Fully qualified name voor die class te gebruiken. Dus door er simpel een backslash voor te zetten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
namespace App\Models;

class User
{
    protected $lastLogin;

    public function __construct () {
        $this->lastLogin = new \DateTime(); // <-- Fully qualified name \DateTime !!
    }

    // ...
}


Verder is interessant te vermelden dat autoloaders nauw samen kunnen werken met namespaces. Geen talloze include regels meer Jippie!
Met Composer haal je die autoloader al standaard in huis. De twee meest gebruikte gestandaardiseerde autoloaders zijn PSR0 en PSR4. Type die termen maar eens in Google. Door het bestand composer.json aan te passen kun je ook je eigen project files autoloaden. Dit staat op de website van composer beschreven.
Gewijzigd op 06/04/2020 17:58:19 door Frank Nietbelangrijk
 
Ward van der Put
Moderator

Ward van der Put

06/04/2020 19:59:56
Quote Anchor link
Wie namespaces zoals \Classes\Model\ of \App\Models\ gebruikt, benut of begrijpt de mogelijkheden van namespaces niet.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

06/04/2020 21:31:03
Quote Anchor link
Ben benieuwd naar je uitleg Ward?

Toevoeging op 06/04/2020 21:31:47:

Heb je het over de namen die gebruikt worden of over het feit dat je FQN gebruikt?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.