Namespace en use - Php: Kan iemand mij dat uitleggen?
Bij voorbaat dank.
Get,
Toevoeging op 29/01/2016 15:24:51:
Voorbeeld:
use app\models\Country;
// get all rows from the country table and order them by "name"
$countries = Country::find()->orderBy('name')->all();
// get the row whose primary key is "US"
$country = Country::findOne('US');
// displays "United States"
echo $country->name;
// modifies the country name to be "U.S.A." and save it to database
$country->name = 'U.S.A.';
$country->save();
// Komt uit Yii 2 documentatie - ben MVC en Frameworks aan het leren..
Namespaces kun je vergelijken met de directorystructuur op je hardeschijf. Use geeft aan welke implementatie van een class je wilt gebruiken. Je kunt meerdere classes met dezelfde naam hebben zolang ze in andere namespaces zitten.
Kijk die use heb je goed uitgelegd. Dat is me nou veel meer helder nu.
In iedere geval bedankt.
Gewijzigd op 29/01/2016 17:13:51 door Hans Teeuwen
Het wordt erin gezet voor de duidelijkheid van je code. Zeker als je een grote codebase hebt is het handig om namespaces te gebruiken voor bijvoorbeeld het framework, de models etc. Wanneer je een goede IDE hebt maakt dit het bouwen veel eenvoudiger.
Stel dat wij voor hetzelfde project een class maken met daarin een paar eigen functies en we zouden die class allebei MyFunctions noemen. Als we nu een class zouden aanmaken via $my_functions = new MyFunctions() maken we dan jouw class aan of de mijne? Nu komen namespaces van pas. Dankzij namespaces kunnen beide classes in het project voorkomen, maar worden ze gekoppeld aan hun eigen namespace.
Use heb je wel gewoon duidelijk uitgelegd.
Toevoeging op 31/01/2016 21:56:12:
Dankjewel ozzie. Helder.
Functioneel voegt het niet veel toe, niet op dezelfde manier als dat een language construct als for, if of foreach dat doen. Het is "syntactic sugar", je kunt namelijk Ozzie aangeeft zonder verdere hacks meerdere classes met dezelfde naam hebben. Dit is handig in de grotere codebases, en als je naam een framework als Symfony of Laravel kijkt kun je zien hoe namespaces goed gebruikt kunnen worden.
Om nou niet iedere class die je wilt gaan gebruiken handmatig te includen met
wordt een autoloader functie gebruikt.
Als de MyFunctions class in de AppBundle/Core namespace gedeclareerd wordt dan is de volledige classnaam AppBundle/Core/MyFunctions. een handig geschreven autoloaderfunctie maakt hier zo een filepath van (bijvoorbeeld C:\myprojects\current\AppBundle\Core\MyFunctions.php) en include vervolgens het bestand wanneer dit nog niet gedaan was.
Namespaces zijn dus ook heel handig in combinatie met een autoloader. (Nooit meer includes gebruiken yeaahh!)
Echter gebruikt Symfony een iets geavanceerdere autoloader, die een gegeven path recursief doorzoekt op classes, en hier een classmap van maakt. Gewoon met de hulp van token_get_all(). Hierdoor kunnen classes in willekeurige folders staan en nog steeds gevonden worden als je een nieuwe map aanmaakt. De methode die je noemt vind ik zelf overigens ook niet heel prettig, omdat een standaard opbouw "Company\Component\SubComponent" is, terwijl je dan iets krijgt als "App\Classes\Etc1\Etc2". Uiteraard zijn hier de verschillende PSR standaarden voor, maar Symfony doet het in ieder geval in één van zijn loaders op de beschreven manier.