Objektorientiere Programmierung -> Navigationsleiste

_hq_

Grünschnabel
Hallo,

ich bringe mir seit zirka einem Jahr PHP/MySQL im Selbststudium bei. Mein Projekt ist mittlerweile aber umfangreicher als geplant und mein Code wird zunehmend wartungsunfreundlich. Daher beschäftige ich mich seit kurzem mit objektorientierter Programmierung. Ich habe gestern eine Klasse geschrieben, mit welcher ich eine kleine Navigationsleiste (Neue Email | Posteingang | Postausgang) erstellen möchte. Die aktive Schaltfläche wird farblich hervorgehoben. Die CSS Formatierung habe ich sehr einfach gehalten, da sie hier nur zu Demonstrationszwecken dient. Möchte sich jemand die Mühe machen und meinen Code kurz überfliegen? Ist meine Klasse soweit einsatzbereit? Benötige ich die Funktion __set() unbedingt (steht so in meinem Buch)?

PHP:
<?php

class button_nav {
	public $info;
	private $button = array('Neue E-Mail' => 'email_neu.php', 'Posteingang' => 'posteingang.php', 'Postausgang' => 'postausgang.php');

	public function __set($name, $value) {
		$this->$name = $value;
	}

	public function anzeige() {
		$this->button_anzeige($this->button);
		if (!empty($this->info)) {
			echo '<span class="info_text">';
			echo $this->info;
			echo '</span>';
		}
	}

	private function button_anzeige($button) {
		while (list($name, $url) = each($button)) {
			$this->button_erstellen($name, $url, $this->seite_aktuell($url));
		}
	}

	private function seite_aktuell($url) {
		if (strpos($_SERVER['PHP_SELF'], $url) == true) {
			$active = true;
		} else {
			$active = false;
		}
		return $active;
	}	

	private function button_erstellen($name, $url, $active) {
		if ($active == true) {
			echo '<a href="' . $url . '" class="nav_aktuell">' . $name . '</a>';
		} else {
			echo '<a href="' . $url . '" class="nav">' . $name . '</a>';
		}
	}
}

?>

<!DOCTYPE html>
<html>

<head>
	<style type="text/css">
		a.nav {border:5px dashed lightgray; margin: 5px 5px; padding: 5px 5px; text-decoration:none;}
		a.nav_aktuell {border:5px dashed lightblue; margin: 5px 5px; padding: 5px 5px; text-decoration:none;}
		.info_text {font-weight:bold}
	</style>
</head>

<body>
	<?php
		$email_nav = new button_nav();
		$email_nav->info = 'In Ihrem Posteingang befinden sich 2 neue Nachrichten'; // $info für für posteingang.php und postausgang.php
		$email_nav->anzeige();
	?>
</body>

</html>

Schöne Grüße, _hq_
 
item: OOP ist ein guter Ansatz um den Code aufzuräumen

item: Das Property $info sollte nicht unbedingt public gesetzt werden. public bei Properties nur verwenden, wenn es sich nicht verhindern lässt. Ansonsten immer Setter und Getter schreiben

item: __set() und __get() müssen nicht gesetzt werden. Grad so wie du es brauchst bringts nicht viel. Wenn du keine flexiblen Eigenschaften der Klasse zuordnen willst, kannst du aber über __set() und __get() nicht gewünschte Zugriffe abfangen

Hier mal ein Beispiel
PHP:
//$info nicht einfach public machen
    private $info;

// Nur Properties mit den Namen info und desc zulassen und auch gleich in HTML-Code wandeln
    public function __set($name, $value) {
        switch($name){
            case 'info':
            case 'desc':
                $this->$name = htmlentities($value);
                break;
            default:
                echo "Ungültiger Parameter: '{$name}'";
        }
    }

//Und beim abfragen wieder zurückwandeln
    public function __get($name) {
        switch($name){
            case 'info':
            case 'desc':
                $this->$name = html_entity_decode($value);
                break;
            default:
                echo "Ungültiger Parameter: '{$name}'";
        }
    }

Ob die Klasse als ganzes Sinn macht, hängt ganz einfach vom Gesamtkonstrukt ab.
 
Achso, man kann von außerhalb der Klasse auf "private" Attribute bzw. Operationen zugreifen, aber nur mittels __set() und __get(). Stimmt das soweit? Aber was bedeutet "desc"? Noch eine Frage: Angenommen ich möchte eine zweite Navigationsleiste erstellen, etwa "Ändere Daten | Ändere Passwort | Ändere E-Mail". Soll ich in diesem Fall mit Vererbung arbeiten und einfach mein Array $button überschreiben? Anscheinend muss ich in diesem Fall mit "protected" anstelle von "private" arbeiten (?).
 
Zurück