Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Konstante in Klasse (https://www.delphipraxis.net/136754-%5Bphp%5D-konstante-klasse.html)

Luckie 7. Jul 2009 13:20


[PHP] Konstante in Klasse
 
Ich habe hier eine PHP-Klasse mit einer Konstanten:
Code:
class CreatePDF
{
    const CORRECTION_FACTOR_MAXCELLROWS = 1.60; // just a workaround
Wenn ich selbige aber benutzen will, sagt er mir, dass er sie nicht kennen würde:
Code:
    private function getMaxTextLinesForRow($i, $trans)
    {       
        return max(
            $this->pdf->getNumLines((string)$i+1, $this->colWidths[0]),
            $this->pdf->getNumLines($trans['Position'][(string)$i]['title'], $this->colWidths[1]),
            $this->pdf->getNumLines($trans['Position'][(string)$i]['description'], $this->colWidths[2]),
            $this->pdf->getNumLines($trans['Position'][(string)$i]['net_price'], $this->colWidths[3]),
            $this->pdf->getNumLines($trans['Position'][(string)$i]['amount'], $this->colWidths[4]),
            $this->pdf->getNumLines($trans['Position'][(string)$i]['amount']*$trans['Position'][(string)$i]['net_price'], $this->colWidths[5]),
            $this->pdf->getNumLines($trans['Position'][(string)$i]['tax_type'], $this->colWidths[6]),
            $this->pdf->getNumLines((1-$trans['Position'][(string)$i]['tax_type']/100)*$trans['Position'][(string)$i]['amount']*$trans['Position'][(string)$i]['net_price'], $this->colWidths[7])
            ) * $this->CORRECTION_FACTOR_MAXCELLROWS;
    }
Zitat:

Undefined property: CreatePDF::$CORRECTION_FACTOR_MAXCELLROWS [APP\views\transactions\createpdf.php, line 154]
Aber laut einem PHP Tutorial werden in Klassen Konstanten mit const deklariert und nicht mit define.

Gollum 7. Jul 2009 13:28

Re: [PHP] Konstante in Klasse
 
Hallo,

so sollte es funktionieren:


self::CORRECTION_FACTOR_MAXCELLROWS

Mithrandir 7. Jul 2009 13:28

Re: [PHP] Konstante in Klasse
 
Imho müsste es doch
Code:
CreatePDF::CORRECTION_FACTOR_MAXCELLROWS
heißen und nicht
Code:
$this->CORRECTION_FACTOR_MAXCELLROWS
, oder?

Luckie 7. Jul 2009 13:52

Re: [PHP] Konstante in Klasse
 
Hm, das wäre aber komisch. Auf Variablen und Methoden der Klasse kann ich mit
Code:
$this->...
zugreifen. Ich probiere es mal.

Die Muhkuh 7. Jul 2009 14:02

Re: [PHP] Konstante in Klasse
 
Auf Konstanten greifst Du, wie die anderen schon erwähnt haben, mit self:: bzw. Klassenname:: zu.

Du hast auch Zugriff auf die Konstanten, wenn die Klasse nicht instantiiert ist.

Luckie 7. Jul 2009 14:17

Re: [PHP] Konstante in Klasse
 
A-ha. Also ist das bei Konstanten anders als bei Variablen und Methoden? Wie krank ist das denn? :wall:

Daniel 7. Jul 2009 14:25

Re: [PHP] Konstante in Klasse
 
Ist es nicht so, dass $this-> auf die aktuelle Instanz der Klasse geht? Wenn Du hingegen auf die Klassenkonstante zugreifen willst, dann bewegst Du Dich aus Sicht von PHP außerhalb der aktuellen Instanz - somit ist die andere Notation korrekt. (Es ist syntaktisch das Gleiche, wenn Du in PHP auf Klassenmthoden zugreifen möchtest.)

Luckie 7. Jul 2009 14:30

Re: [PHP] Konstante in Klasse
 
Aber die Konstante soll eigentlich keine Klassen-Konstante seion, sondern eine ganz einfache private Konstante innerhalb der Klasse, die auch nur dort gültig ist.

PS: Ich kann das ganze im Moment gerade nicht testen, der DB-Server bei uns spinnt und scheint down zu sein.

Daniel 7. Jul 2009 14:36

Re: [PHP] Konstante in Klasse
 
Zitat:

Zitat von Luckie
Aber die Konstante soll eigentlich keine Klassen-Konstante seion, sondern eine ganz einfache private Konstante innerhalb der Klasse, die auch nur dort gültig ist.

Wenn Du PHP ... :gruebel: 5 hast, dann setze ein "private" davor und Du hättest wenigstens das mit der Sichtbarkeit geklärt. Die restliche Syntax müsste ich gleich mal nachschlagen.

Luckie 7. Jul 2009 15:21

Re: [PHP] Konstante in Klasse
 
Also mit
Code:
self::...
geht es. Aber setze ich ein private davor
Code:
private const CORRECTION_FACTOR_MAXCELLROWS = 1.60; // just a workaround
meint er:
Zitat:

Parse error: parse error, expecting `T_VARIABLE' in C:\Programme\xampp\htdocs\psi.iogroup.net\public_h tml\app\views\transactions\createpdf.php on line 20
(Zeile 20 ist die obige Zeile.)

mirage228 7. Jul 2009 15:35

Re: [PHP] Konstante in Klasse
 
Soweit ich weiß gibts in PHP keine Sichtbarkeitsangabe für Klassenkonstanten. Kannstes ja mit einer private static Variablen versuchen (ggf. mit final wie in Java? Da bin ich aber nicht sicher) ....

Viele Grüße

Daniel 7. Jul 2009 15:45

Re: [PHP] Konstante in Klasse
 
Ja, wenn Du sie für jede Instanz (und damit eben genau nicht einmalig für die Klasse) brauchst, dann kannst Du nur eine private Variable nehmen, die Du bei der Deklaration auch gleich initialisierst.

private $foo = 'bar';

Damit haben auch abgeleitete Klassen keinen Zugriff auf diese Variable.


Siehe auch:
http://de.php.net/manual/en/language.oop5.static.php

Luckie 7. Jul 2009 20:38

Re: [PHP] Konstante in Klasse
 
Hm, OK. Ich glaube, dass es eine Konmstante ist, ist mir wichtiger, als die Sichtbarkeit. Irgendwie eine komische Sprache, diesees PHP. :gruebel:

Mithrandir 7. Jul 2009 20:48

Re: [PHP] Konstante in Klasse
 
Zitat:

Zitat von Luckie
Hm, OK. Ich glaube, dass es eine Konmstante ist, ist mir wichtiger, als die Sichtbarkeit. Irgendwie eine komische Sprache, diesees PHP. :gruebel:

Das liegt wohl daran, dass OOP in PHP noch recht "frisch" ist. Ansonsten ist die (Skript-)Sprache eigentlich recht geil. ;)

alcaeus 9. Jul 2009 21:10

Re: [PHP] Konstante in Klasse
 
Eine Klassenkonstante braucht an sich keine Sichtbarkeiten. Sie ist eher dazu da, den generellen Namespace zu befreien (seit 5.3 gibts ja auch tatsaechliche Namespaces, Klassenkonstanten ham aber trotzdem was).

Nehmen wir an, du hast eine MVC-App. Im Model hast du bspw. Benutzer, du hast Gruppen und du hast Mitglieder (also Benutzer) in diesen Gruppen. In einer klassischen Applikation haettest du also Konstanten definiert:
Code:
define('USER_STATUS_ACTIVE', 0);
define('USER_STATUS_INACTIVE', 1);
define('USER_STATUS_DELETED', 2);

define('GROUP_STATUS_PRIVATE', 0);
define('GROUP_STATUS_PUBLIC', 1);

define('GROUP_MEMBER_FOUNDER', 0);
define('GROUP_MEMBER_MODERATOR', 1);
define('GROUP_MEMBER_USER', 2);

define('GROUP_MEMBER_STATUS_INVITED', 0);
define('GROUP_MEMBER_STATUS_PENDING', 1);
define('GROUP_MEMBER_STATUS_MEMBER', 2);
Das funktioniert zwar, ist aber haesslich da du bei einer grossen Applikation relativ bald einen ganzen Haufen Konstanten hast, die dir den globalen Namespace verseuchen. Spaetestens sobald deine Code-Completion ewig braucht bis sie geladen hat, ist alles zu spaet.

Wenn du nun richtig programmierst (und ich meine richtig, also mit PHP5, OOP, MVC, usw.) dann hast du eh eine Klasse, die deinen Benutzer definiert. Warum also nicht die Stati dort definieren:
Code:
class User {
  const ACTIVE = 0;
  const INACTIVE = 1;
  const DELETED = 2;
//...
}
Ansprechen kannst du sie dann mit User::ACTIVE, wass nicht nur kuerzer ist als die Konstante von oben, sondern auch klar zeigt, wo du dich befindest: naemlich im User-Kontext. Vor allem bei den Gruppen musst du dann nicht erstmal schaun ob das jetzt GROUP_ oder GROUP_MEMBER_ ist:
Group::PRIVATE und GroupMember::FOUNDER vereinfachen das Unterscheiden dann doch ein bisschen.

So, und wofuer braeuchte man hier jetzt Sichtbarkeiten? Von aussen kann der Wert sowieso nicht geaendert werden, und Konstanten sind eigentlich dazu da, um Stati, Codes, usw. zu definieren so dass man davon ausgehen kann, dass diese immer gleichbleiben (bzw. dass die ganze Applikation auf eine eventuelle Anpassung im Code reagiert).

Was dieses "nur in der Klasse gueltig" betrifft: was meinst du mit nur in der Klasse gueltig? Der Vorteil von Konstanten ist ja auch der, dass sie global gueltig sind, und nicht nur in dem Kontext, in dem sie definiert wurden (es sei denn man benutzt global :kotz: )

@DanielG: OOP in PHP ist gar nicht so frisch, das gabs seit den Anfaengen von PHP4. Die Tatsache dass es verwendbar ist, ist auch nicht mehr so frisch, PHP5 gibts ja schon ne Weile. Das Problem ist nur dass sich die Webhoster immer so viel Zeit lassen, auf neue Versionen zu springen. PHP 5.0 gibts ja schliesslich seit Juli 2004, 5.1 seit November 2005 und 5.2 seit November 2006. Die sind eigentlich alle drei hoffnungslos veraltet und man kann nur hoffen, dass die Hoster relativ schnell auf PHP 5.3 springen ;)

Greetz
alcaeus

Luckie 13. Jul 2009 10:15

Re: [PHP] Konstante in Klasse
 
Zitat:

Zitat von alcaeus
So, und wofuer braeuchte man hier jetzt Sichtbarkeiten?

Ich wollte damit zum Beispiel deutlich machen, dass diese Konstante nur zu dieser Klasse gehört, also klassenspezifisch ist oder wie man das nennen will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz