In een MVC applicatie die ik wil doorgronden kom ik in de code van de database class dingen tegen die ik niet begrijp.
Het gaat om de regel:
' public function __construct( Config $config )'
Kan iemand me een zetje in de goede richting geven?

Die 'Config' is waarschijnlijk een class.
En '$config' een variabele.

Maar waar definieer je die zaken?

Het complete stukje code ziet er zo uit:

<?php
namespace skf;

class db extends \PDO
{
/**
* factory
*
* Sets an DataBaseBinding compatible object based on the type of database
* defined in $config_values['database']['db_type']
*/
public function __construct( Config $config )
{
$db_type = $config->config_values['database']['db_type'];
$db_host = $config->config_values['database']['db_host'];
$db_name = $config->config_values['database']['db_name'];
$db_user = $config->config_values['database']['db_user'];
$db_pass = $config->config_values['database']['db_pass'];
$db_port = $config->config_values['database']['db_port'];
Nou, je zit in de namespace "skf", dus d(i)e Config class zal naar alle waarschijnlijkheid daar gedefinieerd zijn?

$config is dus ook niet zomaar een variabele, maar zou een object van die Config class moeten zijn.
Thomas,
Dank je. Je antwoord verlegt m'n vraag naar: 'Hoe lees je de inhoud van een namespace?'
Heb je een suggestie?
Uhm.

Vaak gebeurt dit op afroep? Op het moment dat je een object van een class maakt wordt de class-definitie opgevraagd/ingeladen. Dus dit gebeurt (meestal) pas op het moment dat je classes ook daadwerkelijk gebruikt. Op deze manier is er geen "verspilling": je gebruikt enkel hetgeen je nodig hebt.

In applicaties die OOP gebruiken is er vaak een "autoloader" aanwezig: deze beschrijft in wezen waar classes gevonden kunnen worden zodat je deze bestanden niet allemaal hoeft te requiren/includen maar direct kunt gebruiken alsof de locatie al bekend was. Deze fungeert als een "mapper" van classnaam naar fysieke locatie, en meestal stemmen deze twee ook in grote lijnen overeen, zodat het redelijk logisch/vanzelfsprekend is waar deze classes te vinden zijn.

PHP heeft hier zelf ook aanbevelingen voor hoe de organisatie er uit zou moeten zien zodat (idealiter) alle applicaties eenzelfde indeling hebben.

Je kunt dus naar alle waarschijnlijkheid de inhoud van de namespace bekijken door naar de desbetreffende directory te navigeren, aangenomen dat de bestanden in jouw applicatie/de library in kwestie op die manier georganiseerd zijn.
Het is me nog steeds een raadsel.
Ik heb die class Config gemaakt - en daar maak ik in de init.php een instantie van: $config = new Config;
In de class DataBase roep ik aan met:
public function __construct( Config $config )
...(alles dat nodig is om PDO aan de gang te krijgen)...
En dat werkt, natuurlijk zou ik bijna zeggen.
Maar waarom staat die class naam daar? Zonder dat werkt het toch ook prima.
Kan/wil iemand me dat uitleggen?
Hiermee kun je afdwingen dat ook alleen maar een $config van het juiste type (class Config of een afgeleide) wordt meegegeven. En stopt je script dus als er per ongeluk bijvoorbeeld een array wordt doorgegeven.

Als je alles altijd goed doet heb je dit natuurlijk niet nodig, en het is dus ook niet verplicht. Maar als je werkelijk altijd alles goed doet, dan zijn er denk heel wat werkgevers in je geïnteresseerd. Kortom: het is er een in de categorie "controle is beter dan vertrouwen".

Overigens is er wel een klein beetje extra processing tijd mee gemoeid (het controleren kost uiteraard tijd), dus een script zonder dit soort "opsmuk" zal iets sneller werken. Maar het zal amper merkbaar zijn, en het heeft natuurlijk ook voordelen.

Als je meer wilt weten kun je zoeken op "Type declarations" ( https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration ). Sinds PHP 7 kun je ook voor de return value een type opgeven ( https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration ).
Rob,
Dank je. Nu is helder Wat er gebeurt en je vertelt er ook bij Waarom het bestaat.
In een groot project waar veel mensen aan werken inderdaad een nuttig vangnet.
Bijkomend voordeel: een slimme php editor zal de class herkennen en type-hints geven zoals de public methods.

In plaats van rechtstreeks een Class naam op te geven mag er ook een interface opgegeven worden. Vervolgens wordt elke class toegestaan die de interface geïmplementeerd heeft. Zoek maar op php interfaces voor meer info.

Reageren