Namespaces und Static functions

01/13/2017 15:52 .Barone#1
Heyho.
Ich versuche mich aktuell nochmal in Static functions und hauptsächlich auch Namespaces einzuarbeiten, jedoch gelingt mir das gerade nicht so wirklich.

PHP Code:
namespace Me\Classes;
use 
PDO;
use 
PDOStatement;
class 
Loader
{
    static 
$host '';
    static 
$database '';
    static 
$dbusername '';
    static 
$dbpassword '';
    static 
$pdo;

    static function 
__construct(){
        
self::$pdo = new PDO("mysql:host=localhost;dbname=dbname"self::$dbusernameself::$dbpassword);
        
self::$pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        return 
self::$pdo;
    }
     static function 
LoadUsers(){
        
$stmt self::$pdo->prepare("SELECT * FROM `users`");
        
$stmt->execute();
        
$users$stmt->fetchAll();
        return (
$users);
    }

Der Loader.

Wenn ich jetzt zb in die Index.php folgendes schreibe:

PHP Code:
Use Me\Classes\Loader;
$users Loader::LoadUsers(); 
Dann bekomme ich nen Statuscode 500 bei Twig (Weiße Seite).
Sobald ich in die Index zb namespace Me\Main oder Me\Index schreibe, dann gibt twig auch nen Status Code 500 aus.
Was genau mache ich falsch? x.x
01/13/2017 17:48 iKyroja :>#2
500 ist bei Twig glaube ich wenn etwas nicht definiert ist.
Dump doch einfach mal deinen Loader aus.
01/13/2017 17:55 False#3
Quote:
Originally Posted by .Barone View Post
Heyho.
Ich versuche mich aktuell nochmal in Static functions und hauptsächlich auch Namespaces einzuarbeiten, jedoch gelingt mir das gerade nicht so wirklich.

PHP Code:
namespace Me\Classes;
use 
PDO;
use 
PDOStatement;
class 
Loader
{
    static 
$host '';
    static 
$database '';
    static 
$dbusername '';
    static 
$dbpassword '';
    static 
$pdo;

    static function 
__construct(){
        
self::$pdo = new PDO("mysql:host=localhost;dbname=dbname"self::$dbusernameself::$dbpassword);
        
self::$pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        return 
self::$pdo;
    }
     static function 
LoadUsers(){
        
$stmt self::$pdo->prepare("SELECT * FROM `users`");
        
$stmt->execute();
        
$users$stmt->fetchAll();
        return (
$users);
    }

Der Loader.

Wenn ich jetzt zb in die Index.php folgendes schreibe:

PHP Code:
Use Me\Classes\Loader;
$users Loader::LoadUsers(); 
Dann bekomme ich nen Statuscode 500 bei Twig (Weiße Seite).
Sobald ich in die Index zb namespace Me\Main oder Me\Index schreibe, dann gibt twig auch nen Status Code 500 aus.
Was genau mache ich falsch? x.x
Als Tipp, schau dir nicht nur an was du beim Browser zurück bekommst sondern schau in Logs.

Du machst folgendes :
Code:
 $stmt = self::$pdo->prepare("SELECT * FROM `users`");

Das kann aber nicht klappen da $pdo NULL ist.
Wieso $pdo NULL ist ?
Das liegt daran das der constructor nur aufgerufen wird wenn von der Klasse eine Instanz erzeugt wird was bei einem static Call nicht passiert.
01/13/2017 18:00 .Barone#4
PHP Code:
use Me\Classes\Loader;
$usersLoader::LoadUsers
echo $twig->render('register.html', array('users'=>$users 
register.html
PHP Code:
{{ dump(users) }}

{{ 
dump }} 
Es wird nichts gedumpt. Also ist theoretisch $users leer?
01/13/2017 18:03 iKyroja :>#5
Muss nicht sein, was .ƒaℓsє. oben geschrieben hat wird wohl der fehler sein.
In deiner LoadUsers function ist die variable $pdo nicht definiert.
01/13/2017 18:18 .Barone#6
Okay, danke euch.

Jetzt frage ich mich wie man das ordentlich umsetzt ohne große workarounds..
01/13/2017 18:32 False#7
Quote:
Originally Posted by .Barone View Post
Okay, danke euch.

Jetzt frage ich mich wie man das ordentlich umsetzt ohne große workarounds..
Generell sollte (finde ich) solche Sachen Function nicht static sein.Statische Methoden kannst du nutzen für z.b "convertUkToGermanDate" oder "EurToDollar" oder "createUser(array $data)" etc....

Du solltest eine Haupt Klasse haben (deine Application), von dort aus hast du zugriff auf weitere Controller (Datenverarbeitung) diese Controller haben Zugriff zu einem Repository z.b. (in deinem fall) UserRepository, diese holen nur Daten.


Dann gibt es natürlich noch die Action, diese holt einfach nur die Sachen aus dem Html bzw bereitet diese für das Html vor.


Sprich der Workflow zum anzeigen von User wäre:


Action => Controller => Repository


P.s. In der Hauptklasse hast du dann z.b. auch die Datenverbindung die du in die Repositorys/Controller(je nach dem) weiter gibst.
Somit erzeugst du nicht in jeder Klasse (wo nötig) eine neue Verbindung.
01/13/2017 22:50 Mikesch01#8
Was zu dem Beispiel des TE gut passt ist das Singleton Pattern.

[Only registered and activated users can see links. Click Here To Register...]
01/14/2017 12:36 .Barone#9
@mikesch01
Das hatte ich mir angeschaut, gefällt mir so aber nicht wirklich.

Wäre es so nicht umsetzbar?
Das ist jetzt zb die Registrierung vom User.
Wenn der User die Daten eingibt, werden diese an die Register.php weitergeleitet.

PHP Code:
 $register Handler\UserHandler::registerUser($_POST['username'],$_POST['password'],$_POST['email']); 
PHP Code:
namespace Me\Handler\HandlerUser;
use 
Me\Classes\user as User;
use 
Me\Loader\CoreLoader as Loader;
use 
Me\Wrapper\DatabaseWrapper as Wrapper;
use 
Exception;
use 
PDO;

Class 
UserHandler extends User\User
{
static function 
registerUser($name,$password,$email){
$pdo Wrapper::getPDO();

...
}

Wrapper:
PHP Code:
namespace Me\Wrapper;
class 
DatabaseWrapper
{
   private 
$pdo;

public static function 
getPDO()
        {
            
$host 'localhost';
            
$database '';
            
$username '';
            
$password '';
                
$pdo = new PDO("mysql:host=$host;dbname=$database"$username$password);
                return 
$pdo;
        }

Kriege hier auch nen 500 Statuscode.. mh.
01/14/2017 13:12 Mikesch01#10
Code:
class DatabaseWrapper
{
   private $pdo;
   /* .. */
}
Statische Methode benötigen auch statisch Variablen. Statisch bedeutet ja, an die Klasse gebunden und nicht an eine Instanz (new ...).

Richtig wäre:
Code:
class DatabaseWrapper
{
   private static $pdo;
   
   public static function getPDO()
        {
            $host = 'localhost';
            $database = '';
            $username = '';
            $password = '';
                self::$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);
                return self::$pdo;
        }
}
Aber theoretisch erzeugst du immer noch bei jedem Aufruf ein neues PDO Objekt und das macht das statische auch nicht besser.

Noch besser wäre folgendes:
PHP Code:
namespace Me\Wrapper;
class 
DatabaseWrapper
{
   private static 
$pdo null;

   private 
initPDO() {
      
$host 'localhost';
      
$database '';
      
$username '';
      
$password '';
      
self::$pdo = new PDO("mysql:host=$host;dbname=$database"$username$password);
   }

   public static function 
getPDO()
        {
                if(
self::$pdo == null) {
                   
initPDO();
                }
                return 
self::$pdo;
        }

Programm:
PHP Code:
$db Me\Wrapper\DatabaseWrapper::getPDO(); 
01/14/2017 13:33 .Barone#11
Obwohl meine Augen funktionsfähig sind denke ich manchmal das ich blind bin.

Ich habe es so wie du geschrieben hast, umgestzt (1:1), jedoch sagt mir phpstorm:

"undefined function initPDO();"

Und Twig haut nen 500 Statuscode raus.

Edit:
Es wird daran liegen das
$db = Me\Wrapper\DatabaseWrapper::getPDO();
null ist.
01/14/2017 14:09 False#12
Quote:
Originally Posted by .Barone View Post
Obwohl meine Augen funktionsfähig sind denke ich manchmal das ich blind bin.

Ich habe es so wie du geschrieben hast, umgestzt (1:1), jedoch sagt mir phpstorm:

"undefined function initPDO();"

Und Twig haut nen 500 Statuscode raus.

Edit:
Es wird daran liegen das
$db = Me\Wrapper\DatabaseWrapper::getPDO();
null ist.
Und nochmal: Schau dir die Logs an!!!
Zudem wäre eine richtige IDE (z.b. PhpStorm) von vorteil, dann würdest du sehen das schon alles Rot markiert ist.Er hat dort :
PHP Code:
private initPDO() { 
stehen anstatt:
PHP Code:
private static function initPDO() { 
desweiteren ist auch das falsch :
PHP Code:
initPDO(); 
dort müsste folgendes stehen :
PHP Code:
self::initPDO(); 
Ich stelle mir immer noch die Frage wieso muss sowas Static sein ?
01/14/2017 15:15 .Barone#13
Quote:
Originally Posted by .ƒaℓsє. View Post
Ich stelle mir immer noch die Frage wieso muss sowas Static sein ?
Ich nutze PHPstorm, jedoch sind die angaben von PHPstorm nicht immer korrekt, da zb die Ordnerstruktur etwas anders ist aufm Server.

Es muss nicht umbedingt Static sein, aber irgendwie bring ich hier gerade glaube was durcheinander.

Ich habe in die Logs geschaut, da steht das PHP Fatal error: Class 'Me\\Handler\\HandlerUser' not found in register.php on line 22.

line 22:
PHP Code:
$register Me\Handler\HandlerUser::registerUser 
Handler:
PHP Code:
 static function registerUser($name,$password,$email)
    {
    } 
01/14/2017 15:26 False#14
Quote:
Originally Posted by .Barone View Post
Ich nutze PHPstorm, jedoch sind die angaben von PHPstorm nicht immer korrekt, da zb die Ordnerstruktur etwas anders ist aufm Server.

Es muss nicht umbedingt Static sein, aber irgendwie bring ich hier gerade glaube was durcheinander.

Ich habe in die Logs geschaut, da steht das PHP Fatal error: Class 'Me\\Handler\\HandlerUser' not found in register.php on line 22.

line 22:
PHP Code:
$register Me\Handler\HandlerUser::registerUser 
Handler:
PHP Code:
 static function registerUser($name,$password,$email)
    {
    } 
1.Wieso hat man auf dem Server eine andere Struktur ?
2.PhpStorm zeigt solche Fehler immer richtig an!
3.Dann haste ja dein Fehler gefunden, die Klasse ist nicht geladen(include/alternativ ein autoloader nutzen)