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


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

Re: Designfrage

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>

Show all headers | View raw


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


Thread

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