Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #3601

Re: private property

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>

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar


Thread

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