Grundfragen zu Namenskonvention / Namespaces

Davicito

Erfahrenes Mitglied
Hallo liebe Chat Community,

ich habe bereits eine kleine oo. TestApp entwickelt und habe erfahren, das unter PHP 5.3+ auch Namenskonventionen mit einbezogen werden können. Was das ist, kenne ich bereits aus C++ oder Java.

Ich hab bei mir - bevor ich mit Namespaces gearbeitet habe - alle Klassendateien über eine Config.php eingebunden.
Nun wird in Zukunft auch mein Programm größer anwachsen und möchte nicht immer umständlich alle Klassendateien in eine Config.php schreiben. Dazu habe ich mir mal angesehen, wie Namensräume unter PHP realisiert werden.
Später möchte ich einen Autoloder-Klasse schreiben, die sich um das Einbinden, meiner Klassendateien kümmert.

Aber zunächst, Schritt für Schritt.
Ich möchte erstmal wissen warum ich immer Fehler bekomme, wenn ich mit Namespaces arbeite.

meine bisherige Klassenimplementierung, die sehr gut funktioniert hat!
Ordnerstruktur:

Test
|-[MVC]
|-[Config]
|-[Template]
|-index.php

Test\Config\Config.php
PHP:
<?php
    include_once('MVC\Controller\LoginController.php');		
	include_once('MVC\View\PSMView.php');		
	include_once('MVC\Model\LoginModel.php');

Test\index.php
PHP:
<?php
    require_once('Config'.DIRECTORY_SEPARATOR.'Config.php');
	$controller = new LoginController(arry_merge($_GET, $_POST));
	$controller->run();

MVC\Controller\LoginController.php
PHP:
<?php
class LoginController
{	
	public function __constructor($request){			 
		$this->request = $request;
	}
	
	public function run()	{			
		$model = new LoginModel();		
		$view = new PSMView();
		
		if(isset($_SESSION['bn_is_logged']) && !empty($SESSION['bn_is_logged']))
			echo 'Sie sind Eingelogt!';
		else{ 			
			$view->setTemplate('LoginTempl');
			print $view->loadTemplate();
			$model->login(isset($_POST['bn']), isset($_POST['pw']), "k&k-psm-".isset($_POST['db']));
		}		
		if(isset($_POST['logout'])) $model->logout();
	}	
}

MVC\Model\LoginModel.php
PHP:
<?php
    class LoginModel
	{
        ...
    }

Wenn ich jetzt in die Klassen, durch den Präfix "namespace", die Namensräume einbinde, kommen ständig, für mich schwer nachvollziehbare Fehlermeldungen. Muss denn in der index.php auch ein Namespace rein, oder gebe ich einen globalen Namespace an? Ich muss doch auch noch mit require_once('%Pfad%'); die Klassendatei einbinden? Wenn ja, dann sehe ich irgendwie keinen Vorteil, in der Einbindung von Namensräumen, wenn ich immer noch die Klassendatei extra einbinden muss.

Ich hoffe sehr, Ihr könnt mir da ein bisschen Licht ins Dunkle bringen.

Mein Ansatz mit folgender Fehlermeldung:
Test\index.php
PHP:
1<?php
2    namespace Test;
3    //require_once('Config'.DIRECTORY_SEPARATOR.'Config.php');
4    require_once('MVC\Controller\LoginController.php');
5	$controller = new LoginController(arry_merge($_GET, $_POST));
6	$controller->run();

Test\MVC\Controller\LoginController.php
PHP:
<?php
       namespace Test\MVC\Controller;

       require_once('MVC\Model\LoginModel.php');
       require_once('MVC\View\PSMView.php');

       class LoginController{
           ...
           $model = new LoginModel();
	   $view = new PSMView();
           ...
       }


Ich bekomme die Fehlermessage:
PHP:
Fatal error: Class 'Test\LoginController' not found in C:\xampp\htdocs\Test\Index.php on line 5
 
Zuletzt bearbeitet:
Hi

Wrum willst du alle Klassen in eine Config.php schreiben?
as haben Namenskonventionen mit namespaces zu tun?
Worum gehts hier überhaupt?

Warum doppelte \ bei 'MVC\\Controller\\LoginController.php' ?

(Hier nicht relevant: Eine Funktion arry_merge gibts nicht.)

PS: Und seit wann ist das hier ein Chat? :D
 
Wrum willst du alle Klassen in eine Config.php schreiben?

ich gebe zu das ist etwas laienhaft realisiert, und ursprünglich so angedacht, die Pfadangaben zu verstecken in einer Config.phi

as haben Namenskonventionen mit namespaces zu tun?

Auch hier noch mal Vertuen von mir. Gemeint war natürlich der Namensraum

Worum gehts hier überhaupt?

Ich möchte mit Namespaces arbeiten und binde in jeder Klassendatei - durch namespace [Pfad] - den Namensraum ein. Ich weis nur nicht, ob in der index.php auch ein namespace hingehört. Und muss ich dann zusätzlich immer noch mit require_once('Klasse'); immer noch die Klasse zusätzlich eingebunden werden, zu der ich eine Instanz werfe? Wenn ja, sehe ich keinen Vorteil in Namespaces!

Und ein Beispiel, was ich mit angefügt habe, bringt mir eine Fehlermeldung, mit der ich erstmal nichts anfangen kann.

Warum doppelte \ bei 'MVC\\Controller\\LoginController.php' ?

Habe das bereits schon korrigiert, war natürlich falsch gepostet!



LG, Davicito.
 
Zuletzt bearbeitet:
Bin jetzt einen Schritt weiter und konnte den Fehler beseitigen.
Ich habe in der index.php namespace Test eingebunden
und beim Erzeugen eines Obj. "$controller", habe ich einen globalen Pfad angegeben.


PHP:
<?php
namespace Test;
	
	require_once('MVC\Controller\LoginController.php');
		
	$controller = new MVC\Controller\LoginController(array_merge($_GET, $_POST));
	$controller->run();

Allerdings meckert der Interpreter nun in der Klasse LoginController.php rum

Code:
Fatal error: Class 'Test\MVC\Controller\LoginModel' not found in C:\xampp\htdocs\Test\MVC\Controller\LoginController.php on line 10

Logisch ist, das die Klasse "LoginModel", sich nicht in MVC\Controller befindet, sondern in MVC Model.

LoginController.php
PHP:
01<?php
02 namespace Test\MVC\Controller;
03
04 require_once('MVC\Model\LoginModel.php');
05 require_once('MVC\View\PSMView.php');
06
07 class LoginController{	
08	public function run(){				
09		
10	$model = new MVC\Model\LoginModel();			
11	$view = new View\PSMView();
12		
13	if(isset($_SESSION['bn_is_logged']) && !empty($SESSION['bn_is_logged']))
14		echo 'Sie sind Eingelogt!';
15	else{ 		
16		$view->setTemplate('LoginTempl');
17		print $view->loadTemplate();
18		$model->login(isset($_POST['bn']), isset($_POST['pw']), "k&k-psm-".isset($_POST['db']));
19	}		
20	if(isset($_POST['logout'])) $model->logout();
21  }	
22}

Durch namespace Test\MVC\Controller, schaut aber der Interpreter ebend in diesem Pfad nach meiner LoginModel.php.
Wie bekomme ich jetzt den richtigen Pfad hingepast**** Mit "use" oder durch ein 2. namespace?
 
Ich hab auch diesen Fehler beseitigen können

Test\MVC\Controller\LoginController.php
PHP:
...
10 $model = new \Test\MVC\Model\LoginModel();            
11   $view = new \Test\MVC\View\PSMView();
...

So habe ich mein Programm zum Laufen bekommen. Nur muss es doch irgendwie auch einfacher gehen, ohne das ich jedesmal den Pfad angeben muss um ein Obj, zu instanziieren.

Habt Ihr noch Tipps, wie es einfacher geht?

LG, Davicito
 
Hallo,

ich bin in Sachen Namensräumen etwas kluger geworden und habe herausgefunden, dass man vollqualifizierte Namensräume - vor Objektinstanziierungen - mit dem Präfix "use" abbilden kann, um sich so viel Tipparbeit zu ersparen - so heißt es in einem Buch.
Komisch aber, dass es so nicht stimmt. Denn ich muss ja trotzdem zumindest einmal im "use" den vollqualifizierten Namensraum angeben.
So sieht es wenigstens besser vom Programmierstil her aus ^^.

z.B in dem LoginController
PHP:
<?php
namespace Test\MVC\Controller;

use Test\MVC\Model\LoginModel,
    Test\MVC\View\PSMView;

class LoginController{
   ..
   $model = new LoginModel();
   $view = new PSMView();
   ..
}

Gruß, Davicito.
 
Zuletzt bearbeitet:
Zurück