php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.01.2005, 19:43  
Gast
 
Beiträge: n/a
Standard funktion gegen klasse

hi, ich habe für meine hp einige funktionen geschrieben, zb. formular auswerten usw. jetzt hab ich vor kurzem von klassen gehört. würde mir das was nutzen? wie bzw. ist der vorteil solcher klassen bei einem php document gefüllt mit funktionen?

gibt es deutsche seiten, die in einfache beispielen den umgang mit klassen verdeutlichen?

gruss und sorry, in sachen php noch grün hinter den ohren
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.01.2005, 23:05  
Erfahrener Benutzer
 
Registriert seit: 01.08.2004
Beiträge: 113
Kofi
Kofi eine Nachricht über ICQ schicken
Standard

Klassen sind Objekte, Funktionen Handlungsanweisungen.

Klassen haben ihrerseits eigenen Eigenschaften und Funktionen.

Konkret: Möchtest du ein Objekt haben, dem du Eigenschaften zuweisen kannst, und mit dem du mehrere Male etwas machen möchtest, dann definierst du eine Klasse. Möchtest du einmal etwas machen, dann ist die Funktion dein Kandidat.

Aber prinzipiell kannst du mit Klassen auch alles machen, was du mit einer Funktion machen kannst - ist nur meistens unsinnig.

Beispiel

Du möchtest eine Zahl quadrieren. Als Funktion sieht das so aus:

PHP-Code:
function quadrieren($zahl)
{
   return 
$zahl*$zahl;
}

// Anwendung

echo quadrieren(5); 
Wenn du unbedingt eine Klasse anwenden möchtest, würdest du dir zuerst mal Gedanken über den Nahmen machen. Die Klasse würde wohl "Zahl" oder "Container" oder so heßen, weil du ja das Objekt hast, mit dem du dann etwas machst.
PHP-Code:
class zahl
{
   var 
$wert;

   function 
quadrieren()
   {
      return 
$wert $wert;
   }
   
   
// weitere Funktionen, wie zum beispiel Wurzelziehen oder so.
}

// Anwendung

$zahl = new zahl;
$zahl->wert 5;
echo 
$zahl->quadrieren(); 
Der Nachteil ist offensichtlich: Es ist viel komplizierter. Außerdem braucht eine einfache Integerzahl weniger Speicher als eine Instanz deiner Klasse.
Der Vorteil: Willst du später $zahl noch einmal quadrieren, dann kannst du einfach die Funktion ohne Parameter wieder aufrufen, der Wert ist noch immer gespeichert (das ist praktisch, wenn du zum Beispiel nicht mehr weißt, was du für eine Zahl eingegeben hast, weil die Variable überschrieben wurde oder so).
Kofi ist offline  
Alt 19.01.2005, 01:23  
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

klassen machen erst da sinn wirklich, wo ein groesseres projekt angegangen werden soll. im grunde genommen hilft es deinen code besser zu strukturieren. hatten wir auch vor kurzem eine diskussion drueber. schau mal im offtopic...
__________________
Was ist validität?
fantast ist offline  
Alt 19.01.2005, 08:38  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Kofi
Klassen sind Objekte
besser nochmal nachschlagen.
imported_Ben ist offline  
Alt 19.01.2005, 08:47  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 2.150
Guradia befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Kofi
PHP-Code:
<?php
class zahl
{
   var 
$wert;

   function 
quadrieren()
   {
      return 
$wert $wert;
   }
   
   
// weitere Funktionen, wie zum beispiel Wurzelziehen oder so.
}

// Anwendung

$zahl = new zahl;
$zahl->wert 5;
echo 
$zahl->quadrieren();
?>
Da üben wir aber nochmal:

PHP-Code:
<?php
class zahl
{
    function 
quadrieren($wert)
    {
        return 
$wert $wert;
    }
   
    
// weitere Funktionen, wie zum beispiel Wurzelziehen oder so.
}

// Anwendung

echo zahl::quadrieren(5);
?>

oder auch:

PHP-Code:
<?php
class zahl
{
    public 
$wert;
    
    public function 
__construct($wert)
    {
        
$this->wert $wert;
    }
    
    public function 
quadrieren()
    {
        return 
$this->wert $this->wert;
    }
   
    
// weitere Funktionen, wie zum beispiel Wurzelziehen oder so.
}

// Anwendung

$zahl = new zahl(5);
echo 
$zahl->quadrieren();
?>
Guradia ist offline  
Alt 19.01.2005, 08:50  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

boah. sehe ich ja jetzt erst. direkt von außen auf eine membervariable zugegriffen .. ich liebe die tatsache, dass PHP5 jetzt den modifier private kennt. :wink:
imported_Ben ist offline  
Alt 19.01.2005, 08:52  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 2.150
Guradia befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Ben
boah. sehe ich ja jetzt erst. direkt von außen auf eine membervariable zugegriffen .. ich liebe die tatsache, dass PHP5 jetzt den modifier private kennt. :wink:
Und ich sehe gerade, wo du es sagst, dass mein public ja gar nicht mehr nötig war ^^
Guradia ist offline  
Alt 19.01.2005, 08:56  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ah stimmt. boah hilfe .. noch voll verpennt ^^
also nochmal, wie ich es machen würde.


PHP-Code:
<?php 
   
    
class Zahl 
    

        private 
$wert
    
        public function 
__construct($wert
        { 
             
$this->wert $wert
        } 
    
        public function 
quadrieren() 
        { 
             return 
$this->wert $this->wert
        } 
    
        
     } 


     
// Anwendung 

     
$zahl = new Zahl); 
     echo 
$zahl->quadrieren(); 

?>
und wenn das jetzt auch noch fehlerbehaftet ist .. dann geh ich erst mal nen kaffee trinken
imported_Ben ist offline  
Alt 19.01.2005, 14:47  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Kofi
Klassen sind Objekte
Wie Ben schon sagt: NEIN (<< Wer lieber "Jein" antworten würde: Nicht meckern, sondern weiterlesen).
Zitat:
Zitat von Kofi
, Funktionen Handlungsanweisungen.
Nettes Wort. Wörtlich genommen sind Klassen auch Handlungsanweisungen.
Zitat:
Zitat von Kofi
Klassen haben ihrerseits eigenen Eigenschaften und Funktionen.
Richtig. Bei Klassen sollte man das dann besser nicht Funktionen nennen, sondern Methoden. Nur um eine Unterscheidung zwischen den Funktionen in einer Klasse und den "normalen" Funktionen zu kriegen.

Zitat:
Zitat von Kofi
Konkret: Möchtest du ein Objekt haben, dem du Eigenschaften zuweisen kannst, und mit dem du mehrere Male etwas machen möchtest, dann definierst du eine Klasse. Möchtest du einmal etwas machen, dann ist die Funktion dein Kandidat.
NEIN. Hinten und Vorne geistiger Dünnschiss. (<< nicht persönlich gemeint, ist nur ein witziger Ausdruck).

Die Häufigkeit der Aufrufe sagt zunächst einmal nichts aus, ob du eine Klasse schreibst oder normale Funktionen verwendest. Im Gegenteil: Das Nutzen von Funktionen und Klassen hat zwei gemeinsame Hintergründe:
a) Übersichtlichkeit
b) Wiederverwendbarkeit

Die Übersichtlichkeit wird durch Funktionen und auch durch Klassen normalerweise gesteigert. Sogenannter Spagetti- Code, der von oben bis unten stur abgearbeitet wird und aus reinen Anweisungen besteht, ist zum einen unübersichtlich und schwer nachzuvollziehen, zum anderen ist er schwer wartbar.
Durch Funktionen oder Klassen werden einzelne Problemstellungen ausgelagert. Durch geschickte Benamung wird erreicht, dass auch verständlich ist, was eine Funktion oder eine Klasse leisten soll. Beispielsweise sollte die Funktion mit dem Namen "pruefeMailAdresse('webmaster@phpfriend.de')" auch tatsächlich die übergebene eMail-Adresse auf Korrektheit prüfen und zurückgeben, wie diese Prüfung ausgefallen ist. Ob du sie nur einmal brauchst oder 20mal sollte nie eine Rolle spielen.

Funktionen und Klassen werden aufgrund der Wiederverwendung entwickelt. Sei es in einem Script (4 Stellen, an denen eine eMail-Adresse geprüft werden soll --> eine Funktion, die man 4 mal aufruft) oder sei es aus mehreren Scripten (Gästebuch, Kontaktformular, Login, Passwort-Mailer, Newsletter) oder sei es, weil man in anderen Projekten/ Webseiten nicht alles neu erfinden möchte.

Doch wie unterscheiden sich Methoden und Funktionen? Prinzipiell durch zwei Tatsachen:

1. Methoden sind immer an Objekte gekoppelt. Selbst statische Methoden sind rein technisch an ein Objekt gekoppelt! (<< um allen, die sonst wegen den immer oder dem NIE in meinem ersten Satz aufschreien würden, den Wind aus den Segeln zu nehmen).
Einer Methode muss man also nicht mitgeben, was sie nun verarbeiten soll, sondern sie weiss es sozusagen. Jede Methode kann nämlich auf die Eigenschaften des zugehörigen Objektes zugreifen. Sie muss nicht erst über Umwege (Funktionsparameter, Globale Variablen oder sonstwas) erfahren, zu welchen Datensätzen sie nun gehört, oder auf welche Eingeschaften sie zugreifen soll. Am konkreten Beispiel: Das Sperren eines Benutzers mittels "sperreBenutzer()". Hier wird eine Methode idealerweise wissen, welchen Benutzer sie sperren muss, weil sie zu einem Objekt der Klasse "Benutzer" gehört, was beispielsweise die Eigenschaft "$userID" kennt. Eine Funktion hat ein Problem: Sie muss irgendwie erfahren, wen sie sperren soll. Im einfachsten Fall ist dies über Funktionsparameter möglich. Im ungünstigsten Fall über irgendwelche Globale Variablen. In jedem Fall wird es schwerer nachzuvollziehen, was eigentlich passiert.
OK, das ist ein einfaches Beispiel aber es gibt sehr komplexe Beispiele, wo Funktionen sehr blöde aussehen, wenn man denen alles mitgeben muss.

2. Polymorphie. Klassen zeichnen sich durch eine einfache aber mächtige Tatsache aus: Wenn du eine Methode "sperreBenutzer()" aufrufst, ist bei einer Funktionsfdefinition auch immer genau definiert, welche Funktion du am Ende aufrufst. Bei einer Klasse zunächst nicht.
Ein durchgängiges Beispiel: Du hast eine Klasse "Benutzer", die zunächst allgemein beschreibt, was man mit einem Benutzer so alles machen kann. Dann hast du einige Spezialisierungen eines Benutzers. Du hast beispielsweise "Gäste", du hast "NormalerUser", du hast "Moderator" und du hast "Admin".
So. Nun könntest du, um beim Beispiel zu bleiben, in jedem der Klasssen eine Methode "sperreBenutzer()" definieren. Bei den Klasse "Gäste" und "NormalerUser" würde sie auch etwas tun, bei den Klassen "Moderator" und "Admin" würde eine Fehlermeldung ausgegeben, dass sich diese nicht sperren lassen.
Wenn du dann im eigentlichen Script bist und dort ein Benutzer-Objekt hast, rufst du einfach die Methode "sperreBenutzer()" auf. Du brauchst dich nicht zu kümmern, was das für ein Benutzer ist. Auch die Methoden braucht das nicht zu interessieren, denn PHP wird je nachdem, ob es ein Admin, ein normalerUser oder sonstwas ist, immer die richtige Methode raussuchen und aufrufen.
So.
Das war jetzt so einfach wie möglich und hoffentlich verständlich.

Fazit: Ein OOP- Modell, also die Objektorientierte Entwicklung, bietet einige interessante Aspekte.

Zitat:
Zitat von Kofi
Aber prinzipiell kannst du mit Klassen auch alles machen, was du mit einer Funktion machen kannst - ist nur meistens unsinnig.
Prinzipiell ja. Wobei die Aussage, dass es unsinnig ist eigentlich unsinnig ist. OOP ist nicht unsinnig, im Gegenteil, es ist äußerst sinnvoll. Nur es gilt das gleiche, wie bei Funktionen: Eine einzelne Code- Zeile in eine Funktion oder eine Klasse auszulagern ist meist vom Aufwand her unnötig, aber unsinnig ist es nie...

Zitat:
Zitat von Kofi
Beispiel

Du möchtest eine Zahl quadrieren. Als Funktion sieht das so aus:

PHP-Code:
function quadrieren($zahl)
{
   return 
$zahl*$zahl;
}

// Anwendung

echo quadrieren(5); 
Wenn du unbedingt eine Klasse anwenden möchtest, würdest du dir zuerst mal Gedanken über den Nahmen machen. Die Klasse würde wohl "Zahl" oder "Container" oder so heßen, weil du ja das Objekt hast, mit dem du dann etwas machst.
PHP-Code:
class zahl
{
   var 
$wert;

   function 
quadrieren()
   {
      return 
$wert $wert;
   }
   
   
// weitere Funktionen, wie zum beispiel Wurzelziehen oder so.
}

// Anwendung

$zahl = new zahl;
$zahl->wert 5;
echo 
$zahl->quadrieren(); 
Der Nachteil ist offensichtlich: Es ist viel komplizierter. Außerdem braucht eine einfache Integerzahl weniger Speicher als eine Instanz deiner Klasse.
Der Vorteil: Willst du später $zahl noch einmal quadrieren, dann kannst du einfach die Funktion ohne Parameter wieder aufrufen, der Wert ist noch immer gespeichert (das ist praktisch, wenn du zum Beispiel nicht mehr weißt, was du für eine Zahl eingegeben hast, weil die Variable überschrieben wurde oder so).
Da stimme ich dir zu, dass dies auf den ersten Blick komplizierter ausschaut und dass ein Objekt etwas mehr Speicherplatz verbraucht, als ein skalarer Typ. Aber du bist inkonsistent: Für das Quadrieren eine eigene Funktion zu machen, ist nach deiner Ansicht genauso quatsch und Overhead. Du bist also mit deiner Erklärung nicht konsequent.
Auch hast du den Sinn von OOP so nicht ganz verstanden, denn es geht nicht davon aus, einzelne atomare Vorgänge mit aller Macht in eine Klasse zu quetschen.

Ein einfaches Gegenbeispiel:
Du willst also eine Zahl quadrieren. Wenn du nun nicht weisst, wie, weil du nicht weisst, was für eine Zahl das ist, wie machst du es dann? Mit OOP kannst du dir Klassen definieren, die beispielsweise bei Quadrat, Wurzelziehen etc. jeweils mit unterschiedlicher Genauigkeit arbeiten und auch mit reellen Zahlen arbeiten können. Mit Funktionen hast du ein Problem, weil du jedesmal entscheiden musst, welche Funktion du aufrufen musst, bevor du sie endgültig aufrufst.


btw: Klassen sind immer Beschreibungen von Objekten. Eine Klasse ist also die Beschreibung, welche Eigenschaften und Methoden es so gibt, ein Objekt ist eine Instanz von einer bestimmten Klasse mit konkreten Inhalten...
mepeisen ist offline  
Alt 19.01.2005, 15:12  
Gast
 
Beiträge: n/a
Standard

Bei dem Gerede kommen mir wieder nostalgische Gefühle von damals in der Schule OOP in C++. Nur wurde uns immer alles viel trockener beigebracht.
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
aufrufende Klasse und Funktion abfragen?? galaxyshadow PHP Tipps 2008 4 10.06.2008 06:43
funktion innerhalb einer Klasse mit call_user_func aufrufen phpbeginner PHP Tipps 2008 8 22.05.2008 16:20
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
mail - Funktion u. Klasse Stümper PHP Tipps 2006 7 02.03.2006 22:06
Zugriff auf eine Klasse innerhalb einer Funktion -&amp;gt; Fehle PHP-Fortgeschrittene 23 05.02.2006 13:02
aus einer funktion auf funktion anderer klasse zugreifen seejay PHP Tipps 2006 3 05.01.2006 10:37
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
Ausgabe Var einer Klasse geht nicht mit externer Funktion HL1234 PHP-Fortgeschrittene 2 01.08.2005 19:40
In einer Funktion auf eine Funktion der Klasse zugreifen phpbeginner PHP Tipps 2005-2 2 28.07.2005 00:30
Problem mit einer rekursiven Funktion in einer Klasse ajo_silent PHP-Fortgeschrittene 6 13.06.2005 16:40
funktion in klasse ruft funktion in anderer klasse auf phpfortgeschrittener PHP Tipps 2005 6 17.04.2005 17:47
Funktion einer Klasse über Link aufrufen? MortakArtos PHP Tipps 2004-2 4 18.11.2004 12:05
Problem mit optionalen Parametern bei Funktion in Klasse RudiS PHP-Fortgeschrittene 6 24.09.2004 09:03
OOP: offizielle php funktion als methode einer klasse ... PHP Tipps 2004 4 17.09.2004 04:24

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php zahlen quadrieren, php quadrieren

Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.