Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #3496
| From | Thomas 'PointedEars' Lahn <PointedEars@web.de> |
|---|---|
| Newsgroups | de.comp.lang.php |
| Subject | Re: Designfrage |
| Date | 2015-10-05 22:28 +0200 |
| Organization | PointedEars Software (PES) |
| Message-ID | <2915507.bUqziVz7J1@PointedEars.de> (permalink) |
| References | <1t55f16c9di4689n3e8%sfroehli@Froehlich.Priv.at> <murnm1$qlc$1@dont-email.me> |
failwell wrote:
^^^^^^^^
Bitte reparieren.
> Logisch ist für mich:
>
>
> Unterscheide zwischen Methode und Funktion.
> Methode: erhält Referenz als Parameter die verändert werden kann.
> Funktion: keine Veränderung von eingegeben Daten. Rückgabe von Kopien.
Diese Unterscheidung ist fhcsal. Richtig ist stattdessen:
Die *Methode* (als Programmeinheit) ist ein Element der *objektorientierten*
Programmierung (OOP). Sie übernimmt die Aufgabe einer Behandlungsroutine
für eine Nachricht, die ein Objekt entgegennehmen und auf die es reagieren
kann. Sie bildet damit *Funktionalität* ab, den einen Teil der Kapselung,
welche Objekte bereitstellen; den anderen Teil bilden die *Eigenschaften*
ab, welche die *Daten* darstellen, die in einem Objekt gekapselt sind, und
auf die idealerweise (vollständige Kapselung) nur über die öffentlichen
(“public”-) und geschützten (“protected”-)Methoden des Objekts zugegriffen
werden kann.
[In einigen objektorientierten Programmiersprachen mit dynamischer
Typüberprüfung, z. B. ECMAScript-Implementierungen wie JavaScript, wird
nicht streng zwischen Eigenschaften und Methoden unterschieden. Methoden
sind dort als Eigenschaften definiert, deren Wert zur Laufzeit wie eine
Funktion aufrufbar ist.]
Eine Methode ist daher an ein Objekt gebunden. In PHP erbt das Objekt eine
Methode, wenn es Instanz einer Klasse oder, falls die Methode nicht als
privat (“private”) deklariert ist, einer ihrer Unterklassen ist oder selbst
eine Unterklasse der betreffenden Klasse ist (auch über mehrere
Vererbungsebenen hinweg).
Die Methode kann dann auf einer Instanz (dynamisch) oder einer Klasse
(statisch) aufgerufen werden. In einer Methode ist immer entweder “$this”,
bei dynamischem Aufruf, oder “self”, bei statischem Aufruf, definiert; diese
referenzieren jeweils das Objekt, auf dem die Methode aufgerufen wurde.
(Klassen sind in PHP Objekte, aber keine Instanzen.)
In PHP wird nicht − im Unterschied etwa zu Pascal – zwischen Prozeduren, die
keinen Rückgabewert haben *können*, und Funktionen, die einen Rückgabewert
haben *müssen*, unterschieden. Dieses Paradigma hat PHP von C übernommen.
Funktionen, deren Rückgabewert nicht mittels Parameter für die “return”-
Anweisung angegeben wurde, haben in PHP implizit den Rückgabewert NULL:
class C
{
private $answer = 42;
public function foo ()
{
return $this->answer;
}
public function bar ()
{
return $this->baz();
}
protected function baz ()
{
return $this->answer;
}
public static function getInstance ()
{
return new self();
}
}
$instance = new C();
/* class C#1 (0) { } */
var_dump($instance);
/* int(42) */
var_dump($instance->foo());
/* int(42) */
var_dump($instance->bar());
/* class C#1 (0) { } */
var_dump(C::getInstance());
[Mit letzterem Ansatz lässt sich das Singleton-Entwurfsmuster in PHP
implementieren, wenn gleichzeitig der Konstruktor der Klasse als nicht-
öffentlich (i. d. R. “private”) deklariert wird:
class C
{
private $_instance = null;
private function __construct () {}
public function getInstance ()
{
if (self::$_instance === null)
{
self::$_instance = new self();
}
return self::$_instance;
}
}
]
Ebensowenig ändert die Parameterübergabe – call-by-value oder call-by-
reference – die Tatsache, dass es sich bei dem Nachfolgenden jeweils um eine
Funktion handelt (wie man auch am Schlüsselwort “function” sieht):
function f1 ($foo) {}
function f2 (&$bar) {}
Daher sind in PHP alle Methoden auch Funktionen, nicht jedoch alle
Funktionen auch Methoden.
Das bedeutet auch, dass für Funktionen, die Methoden sind, die Sichtbarkeit
deklariert werden kann (siehe oben); für die übrigen Funktionen jedoch
nicht: Letztere sind entweder global deklariert, dann sind sie immer
sichtbar; oder sie sind lokal deklariert, dann sind sie nur im lokalen
Aufrufkontext sichtbar:
function foo () {}
function bar ()
{
function baz () {}
/* Aufruf möglich */
baz();
}
/* Aufruf möglich */
foo();
bar();
/*
* Aufruf nicht möglich: “Fatal error: Call to undefined function baz()”
*/
baz();
HTH
--
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
Designfrage Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-09-10 11:48 +0000
Re: Designfrage Niels Braczek <nbraczek@freenet.de> - 2015-09-10 14:53 +0200
Re: Designfrage Claus Reibenstein <4spamersonly@kabelmail.de> - 2015-09-10 18:57 +0200
Re: Designfrage Gregor Kofler <usenet@gregorkofler.com> - 2015-09-11 00:54 +0200
Re: Designfrage Claus Reibenstein <4spamersonly@kabelmail.de> - 2015-09-11 12:07 +0200
Re: Designfrage failwell <steve@mindfav.com> - 2015-10-04 17:29 +0000
Re: Designfrage Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-10-05 22:28 +0200
Re: Designfrage Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-10-05 22:33 +0200
Re: Designfrage "Christoph M. Becker" <cmbecker69@arcor.de> - 2015-12-12 19:16 +0100
Re: Designfrage Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-12 20:25 +0100
Re: Designfrage Andreas Treichel <gmblar@gmail.com> - 2015-11-01 11:09 +0100
csiph-web