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:
En een index.php waar ik de user class wil gebruiken:
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.
* 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
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?
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?
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?
Kan je veranderen naar:
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
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:
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)
1
2
3
4
5
6
7
8
9
10
11
12
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 !!
}
// ...
}
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
Wie namespaces zoals \Classes\Model\ of \App\Models\ gebruikt, benut of begrijpt de mogelijkheden van namespaces niet.
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?