2016-11-14 6 views
2

Bis gestern verbrannte ich mein Gehirn beim Versuch, von einem prozeduralen Denken zu einem OOP-Denken zu wechseln; heute morgen habe ich aufgegeben. Ich sagte zu mir selbst, dass ich wahrscheinlich noch nicht bereit war, es zu verstehen.Cookie check in OOP

Ich begann dann in der üblichen Weise Codierung, eine Funktion zu schreiben um zu überprüfen, ob das Cookie ist „angemeldet“ ist oder nicht

function chkCookieLogin() { 
if(isset($_COOKIE["logged"])) { 
    $logged = 'true'; 
    $cookieValue = $_COOKIE["logged"]; 

    return $logged; 
    return $cookieValue; 
} 
else { 
    $logged = 'false'; 

    return $logged; 
} 
} 

$result = chkCookieLogin(); 
if($result == 'true'){ 
    echo $cookieValue; 
} 
else { 
    echo 'NO COOKIE'; 
} 

da ich auf ein Problem stoßen: Ich wollte zwei Variablen zurückzukehren ($logged und $cookieValue) statt nur einer. Ich google es und ich fand this answer, wo Jasper eine Methode erklärt, die einen OOP-Gesichtspunkt verwendet (oder das ist, was ich sehen kann). Diese Antwort öffnete mir eine neue Vision auf der OOP so habe ich versucht, neu zu schreiben, was ich auf diese Weise zu erreichen versuchte:

class chkCookie { 
public $logged; 
public $cookieValue; 

public function __construct($logged, $cookieValue) { 
    $this->logged = $logged; 
    $this->cookieValue = $cookieValue; 
} 

function chkCookieLogin() { 
    $out = new chkCookie(); 
    if(isset($_COOKIE["logged"])) { 
     $out->logged = 'true'; 
     $out->cookieValue = $_COOKIE["logged"]; 

     return $out; 
    } 
    else { 
     $out->logged = 'false'; 

     return $out; 
    } 
} 
} 

$vars = chkCookieLogin(); 
$logged = $vars->logged; 
$cookieValue = $vars->cookieValue; 
echo $logged; echo $cookieValue; 

Natürlich ist es nicht beim ersten Versuch nicht funktioniert ... und zwar weder im zweiten und der dritte. Aber zum ersten Mal fühle ich, dass ich auf einem Schritt bin, um das OOP wirklich zu berühren (oder das ist, was ich denke!).

Meine Fragen sind:

  1. dieser Versuch ist korrekt aus der OOP Sicht geschrieben?
  2. Wenn ja, was sind die Probleme? (Weil ich denke, dass es mehr als einen gibt)

Vielen Dank!

+3

, dass eine schreckliche Art und Weise ist, es zu tun ... für dieses Verfahren Gehen Sie zurück, und beachten Sie, dass Sie 'return array („angemeldet“=> $ angemeldet„Cookie“=> $ cookieValue); ' –

+1

Ich denke, dass die Freunde auf codereview Ihnen besser helfen können, https: // codereview.stackexchange.com/ – Federkun

+0

@Niet the Dark Absol End aber getrennt für den speziellen Fall der Cookie-Prüfung, bin ich nah an der OOP denken oder nicht? Weil ich versuche, von einem zum anderen zu wechseln, hat das gleiche Gefühl, mit verbundenen Augen in einem dunklen Raum zu gehen: Ich habe 0 Gewissheiten! – Brigo

Antwort

3

Kredit an @NiettheDarkAbsol für die Idee der Rückgabe eines Array-Datentyps.


Mit dependency injection, können Sie ein Objekt wie dieses Set-up:

class Factory { 
    private $Data = []; 
    public function set($index, $data) { 
     $this->Data[$index] = $data; 
    } 

    public function get($index) { 
     return $this->Data[$index]; 
    } 
} 

dann das DI-Modul zu verwenden, können Sie Methoden festgelegt, wie so (mit anonymous functions):

$f = new Factory(); 
$f->set('Cookies', $_SESSION); 
$f->set('Check-Cookie', function() use ($f) { 
    return $f->get('Cookies')['logged'] ? [true, $f->get('Cookies')['logged']] : [false, null]; 
}); 

Mit Fehlerprüfungen können wir dann die Methode aufrufen, wenn und wie wir es brauchen:


Ich würde auch prüfen, Konstanten zu Ihrer DI Klasse hinzufügen, so dass dynamischere Ansätze anstatt tun Kontrollen Fehler jedes Mal. IE, unter set() enthält eine Konstante wie Factory::FUNC_ARRAY, so dass Ihre get() Methode die bereits ausgeführte Schließung zurückgeben kann.

Sie können mit ternary operators untersuchen, wenn Sie verwirrt sind.

Sehen Sie es über arbeiten bei 3v4l.org.
Wenn es etwas bedeutet, here is an OOP styled approach.

+0

Ok, wenn ich groß bin, will ich wie du sein. Es ist so anders und viel komplizierter im Vergleich zu dem (schlechten) Stil, den ich jetzt kodiere, wo ich mich wie ein Baby fühle! Ich werde dein Skript Wort für Wort studieren, um tief hinein zu kommen, denn es ist faszinierend. – Brigo

+0

Haha, froh, dass ich helfen konnte. @ Brigo – KDOT

+0

Ich bin mir nicht sicher, warum dies eine gute Antwort ist. Die 'Factory'-Klasse ist hier nur ein Array. Nur weil das Wort "Klasse" irgendwo nicht bedeutet, dass dies kein prozeduraler Code ist. – Federkun