[ alfa-pro @ 09.04.2013. 17:53 ] @
Imam par nejasnih stvari oko namespaces.
Kako sam ja to ukapirao da radi. Ja sam mislio da ako definisem namespace nekoj klasi necu morati da stavljam require_once ili da koristim spl_autoload.

Ja npr sam pokusao u index.php da uradim ovo:

Code:
$controller = new  Core\Controller\ModuleController();


E sada to prijavljuje gresku da klasa ModuleController nije pronadjena. A kada uradim include() iznad i importujem datu klasu onda radi.
Mislim nije mi jasna tematika, zasto bi ja onda koristio namespace kada opet moram da koristim include/require_once?

Za moju strukru je malo teze iskoristiti spl_autoload jer je meni sve u vise foldera odvojeno.

Citat:
|
-Root
|-- Library(dir)
|-----Core(dir)
|-------- Controllers(dir)
|----------------BaseController.php
|----------------FrontController.php
|----------------ModuleController.php
|---------------- helper.php
|----------------Exception(dir)
|---------------------BaseControllerException.php
|---------------------FrontControllerException.php
|---------------------ModuleControllerException.php
|----------- Database
|---------------- Doctrine
|-----------------doctrine.php
|--index.php
|--.htaccess


I tako dalje imam foldere koji sadrze klase, controllers, uri.

Nije mi jasno zasto moram require ako sam definisao namespace?
Evo kako sam definisao :

Code:

namespace Core\Controllers;

class ModuleController {
    protected $urlvalues;
    protected $action;
    public function __construct($action, $urlvalues) {
        $this->action = $action;
        $this->urlvalues = $urlvalues;
    }
    public function ExecuteAction() {
        return $this->{$this->action}();
    }
    protected function ReturnView($viewmodel, $fullview) {
        $viewloc = 'views/' . get_class($this) . '/' . $this->action . '.php';
        if ($fullview) {
            require('views/maintemplate.php');
        } else {
            require($viewloc);
        }
    }
}


I na kraju kao test u index.php moram sledece da bi bio uspesno instanciran :
Code:

require 'library/core/controller/ModuleController.php';
$obj = new  Core\Controller\ModuleController();


Ja sam to drugacije ukapriao onda ili ne znam zato vas i pitam. Mislio sam ako definisem namespace da nemam potreba za imortovanje...

Jel moze neko da mi pojasni uopste sustinu svega ovoga i kako to radi. Citajuci php manuel nisam nasao na primer kada su klase odvojene u vise direktorijuma i kako se onda koristi namespaces ...

Hvala...

[ Nemanja Avramović @ 10.04.2013. 23:27 ] @
Koliko ja znam o namespace-ovima (a ne znam puno) oni nemaju veze sa direktorijumima već se uglavnom koriste da možeš koristiti više klasa sa istim imenom, tako što ćeš ih staviti u druge namespace-ove
[ alfa-pro @ 11.04.2013. 12:27 ] @
Ali vidis ti ovo, obrni okreni ja moram da definisem ime klase, nemogu 5 klasa da instanciram jednim imenom.

Code:
$obj = [namespaces]\[init]() ;
[ StaX_ @ 11.04.2013. 12:51 ] @
Ne možeš instancirati 5 različitih klasa jednim imenom, ali ih upotrebom namespace-a razlikuješ

Čak ih možeš i pozvati imenom koje ti odgovara koriscenjem as

use phpstar\fooBar as FB;
$obj_foobar = new FB();

ali svakako klasa mora biti dostupna bilo sa require ili nekim drugim nacinom pre nego sto ces je upotrebiti, ne moze aplikacija sama da zna gde se ta klasa nalazi ako nisi pokazao gde je ona na bilo koji nacin.