Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #3601
| From | Thomas 'PointedEars' Lahn <PointedEars@web.de> |
|---|---|
| Newsgroups | de.comp.lang.php |
| Subject | Re: private property |
| Date | 2015-12-11 14:56 +0100 |
| Organization | PointedEars Software (PES) |
| Message-ID | <2165595.GBe9iyNroi@PointedEars.de> (permalink) |
| References | <n4bpsd$ous$1@news.albasani.net> <n4bvin$3e0$1@news.albasani.net> <n4e8i8$eg5$1@news.albasani.net> <n4e948$fje$1@news.albasani.net> |
Jan Novak wrote:
> Am 11.12.2015 um 11:29 schrieb Jan Novak:
>> Ich will nicht die HTML Klasse generalisieren, sondern die Klasse
>> "generalClassFunctions".
>> Damit funktioniert dein Ansatz dann nicht so wie ich es mir vorstelle.
>> Ich möchte in der Eigenschaft "show" keine Variable Namens "archives"
>> haben, denn die Eigenschaft "show" soll ja ebenso in anderen Klassen
>> inkludiert(extends) genutzt werden und dort gibt es keine archives,
>> sondern ... whatever.
>
> habe es jetzt so gelöst:
>
> $archives = [hole aus der db ]
> $a = new ArchivListUi();
> $a->show1('/template/archiv_list_ui.html',$archives, $_lang, $_rootdir);
>
>
> class ArchivListUi extends generalClassFunctions{
> private $archives;
> public function setArchives($archives){
> $this->archives = $archives;
> }
> }
>
>
> class generalClassFunctions{
Alle Klassenbezeichner sollten mit einem Grossbuchstaben beginnen. Bei
nicht-abstrakten Klassen und Nicht-Singleton-Klassen hat das ausserdem den
Vorteil, dass Konstruktor-Aufrufe besser erkennbar sind.
Ausserdem wird Quelltext IMHO einfacher verständlich und wartbar, wenn er
von oben nach unten gelesen werden kann, ohne dabei auf unbekannte Symbole
zu stossen. Also: Funktionen erst deklarieren, dann aufrufen, und
Klassen/Interfaces erst deklarieren, dann davon ableiten/diese
implementieren. (Idealerweise befindet sich in einer Datei auch nur eine
Klassendeklaration und diese in einem Namespace, der dem Pfad entspricht;
dann kann man sehr einfach und effizient mit einem Autoloader arbeiten.)
> public function show1($htmlfile, $data, $_lang, $_rootdir){
Funktionen/Methoden mit mehr als drei formalen Parametern sind ein Anzeichen
für bestenfalls schlecht durchdachtes Software-Design. Das Problem daran
ist, dass man sich immer wieder daran erinnern bzw. in der Dokumentation
nachlesen muss, was die Parameter bedeuten und in welcher Reihenfolge sie
angegeben werden müssen (PHPDoc-Kommentare fe len bei Dir – nicht gut).
Extremes schlechtes Beispiel – immerhin inzwischen endlich “Legacy”: [1a].
Abhilfe (mangels z. B. Pythons “keyword arguments” in PHP [1b]): Zusätzlich
oder statt mehrere Parameter mit einem Array-Parameter arbeiten.
Mit der Instanz einer Template/View-Klasse werden aber alle diese Parameter
höchstens optional, da entweder die Information bei der Initialisierung in
Eigenschaften gespeichert und vor dem Rendern daraus gelesen werden kann.
Weshalb show*1*()?
> $file = $_rootdir. $htmlfile;
> if (file_exists($file)){
> echo $this->render($file, $data, $_lang);
> }
> else {
> throw new Exception('could not find template: ' .$file);
Du solltest spezifische Exceptions werfen; die Standard PHP Library (SPL)
bietet bereits einige:
<http://php.net/manual/en/spl.exceptions.php>
Falls das nicht reicht, solltest Du eigene Exception-Klassen in einem
eigenen Namespace deklarieren. Beispiel: [2a]
> }
> }
> protected function render($template, $data, $_lang) {
> ob_start();
> include $template;
> return ob_get_clean();
> }
Diese Methode ist, wie schon von Niels richtig erwähnt, überflüssig bzw.
braucht eine Template/View-Klasse nur *eine* Methode, welche das Template
included (diese heisst bei meiner View-Klasse auch render()).
Ausgabepufferung hat nur dann einen Vorteil, wenn man den Puffer
schrittweise befüllt oder den Pufferinhalt vor der Ausgabe bearbeitet [2b].
> }
Deine generalClassFunctions-Klasse, jedenfalls die hier geposteten Methoden,
stellt tatsächlich eine Template- bzw. (abstrakte) View-Klasse dar. Benenne
die Klasse um bzw. refactor diese Methoden in eine solche.
Anregungen dazu (noch keine freie Software) findest Du unter [2c].
Am besten fängst Du dort mit dem Einlesen bei Application.php an.
Unter [3] kannst Du sehen, wie die Application-Klasse angewendet wird und
unter [4a] das Ergebnis bewundern ;-) (In meiner Bachelor-Thesis [4b]
findest Du dazu im Abschnitt „Webapplikation“ eine ausführlichere
Beschreibung und weiterführende Referenzen.)
Du solltest aber überlegen, ob es sich für Dich wirklich lohnt, das Rad neu
zu erfinden. In Zend Framework (ZF) gibt es das alles schon, es ist gut
dokumentiert und aufgrund der grossen Community gut getestet:
<http://framework.zend.com/>
Ich hatte damals, weil ich keine Zeit für die Einarbeitung in ZF aufwenden
konnte, für die Thesis (verbesserte Version der ECMAScript Support Matrix)
ein eigenes MVC-Framework (PHPX) geschrieben, was nur die wichtigsten Teile
des ZF, so wie ich es bis dahin verstanden hatte, implementiert. Falls Du
gerade keinen Zeitdruck hast, lohnt es sich für Dich wahrscheinlich, ZF
anzuschauen.
Der Vorteil von ZF ist IMHO, dass man auch nur die Module daraus verwenden
kann, die man braucht. Für meine Website [5] verwende ich zum Beispiel
derzeit nur den gettext (Sprach)-Support von ZF 2.1.2 [6].
___________
[1a] <http://www.w3.org/TR/DOM-Level-3-Events/#idl-interface-MouseEvent-initializers>
[1b] <http://stackoverflow.com/a/1342933/855543>
[2a]
<http://PointedEars.de/wsvn/PHPX/trunk/ZendFramework-2.1.2/library/Zend/Loader/Exception/SecurityException.php>
[2b] <http://PointedEars.de/wsvn/JSX/trunk/ResourceBuilder.php>
[2c] <http://PointedEars.de/wsvn/PHPX/trunk/>
[3] <http://PointedEars.de/wsvn/es-matrix/trunk/index.php>
[4a] <http://PointedEars.de/es-matrix>
[4b] <http://PointedEars.de/scripts/test/es-matrix/application/doc/thesis.pdf>
[5] <http://PointedEars.de/>
[6] <http://PointedEars.de/wsvn/LCARS/trunk/global.php>
--
PointedEars
Zend Certified PHP Engineer
Twitter: @PointedEars2
Please do not cc me. / Bitte keine Kopien per E-Mail.
Back to de.comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar
private property Jan Novak <repcom@gmail.com> - 2015-12-10 13:06 +0100
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-10 14:09 +0100
Re: private property Niels Braczek <nbraczek@freenet.de> - 2015-12-10 14:43 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-10 16:04 +0100
Re: private property Niels Braczek <nbraczek@freenet.de> - 2015-12-10 16:25 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-11 08:06 +0100
Re: private property Arno Welzel <usenet@arnowelzel.de> - 2015-12-10 16:31 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-11 08:04 +0100
Re: private property Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-12-11 07:37 +0000
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-11 16:23 +0100
Re: private property Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-12-12 13:06 +0000
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-12 16:32 +0100
Re: private property Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-12-17 17:40 +0000
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-17 20:02 +0100
Re: private property Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-12-17 19:03 +0000
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-17 20:52 +0100
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-10 19:31 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-11 08:03 +0100
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-11 13:17 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-14 08:06 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-11 11:29 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-11 11:39 +0100
Re: private property Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-11 14:56 +0100
Re: private property Jan Novak <repcom@gmail.com> - 2015-12-14 08:15 +0100
csiph-web