Umsteiger-Frage
Hallo !
Habe bisher in Java programmiert und wollte mich nun mal näher mit PHP
beschäftigen, vor allem mit den objektorientierten Features. Vor einiger
Zeit hatte ich schon mal mit PHP zu tun, die grundlegenden
Sprachelemente sind mir also bekannt.
Zum Experimentieren habe ich mir die neueste Version (PHP 5.2.4) als
Apache-Modul installiert.
Nun habe ich folgendes ausprobiert :
<?php
class Person
{
}
?>
<html>
<body bgcolor="#ffffe0">
<?php
$p1=new Person () ;
$p1->irgendwas=100 ;
echo $p1->irgendwas."<br>" ;
?>
</body>
</html>
Warum funktioniert das ohne Fehlermeldung ? Die Member-Variable
"irgendwas" ist doch in der Klasse "Person" gar nicht definiert.
lg, Markus
Re: Umsteiger-Frage
Markus Krebl schrieb:
>Warum funktioniert das ohne Fehlermeldung ?
Nur für passende Definitionen von "keine Fehlermeldung". Eine Notice wird
durchaus geworfen, diese kommt aber mit den bei dir getätigten Einstellungen
offenbar nicht zur Anzeige.
Siehe <http://www.php.net/manual/en/ref.errorfunc.php>.
--
Wolfgang Fellger
Re: Umsteiger-Frage
> Warum funktioniert das ohne Fehlermeldung ? Die Member-Variable
> "irgendwas" ist doch in der Klasse "Person" gar nicht definiert.
Willkommen bei PHP. Anders als bei Java funktioniert bei PHP in den
meisten Fällen alles irgendwie. Ich rate Dir, in der php.ini E_ALL als
Error Level zu nehmen, denn so etwas wirft zumindest noch ein E_NOTICE
(die werden aber standardmässig nicht ausgegeben).
Du solltest Dich zudem noch mit der Typbehandlung vertraut machen...im
schlimmsten Fall ist NULL, "", 0, "0" und FALSE ein- und dasselbe für
PHP, kann zu ekligen Bugs führen.
Ansonsten gibt es gerade in PHP5 die Möglichkeit, für zumindest Arrays
und Objekte bei Funktionsdefinitionen den Typ zu erzwingen:
function wantObject(MyObject $object)
function wantArray(array $array)
Wenn Du dann noch ausgiebig Gebrauch von Interfaces, abstrakten Klassen,
den Sichtbarkeitsmodifikatoren machst und generell stark OO-lastig
programmierst, bleibt Dir das Gröbste erspart.
Aber Echte Männer schalten E_NOTICE ab und nutzen viel und ausgiebig
globale Variablen ;-)
--
Mein Zeugs:
http://www.hadanite-marasek.de/classes.php
http://www.objektivsuche.de/
Ansonsten:
http://www.php-faq.de/q/q-newsgroup-wie-helfen.html
Re: Umsteiger-Frage
> Warum funktioniert das ohne Fehlermeldung ? Die Member-Variable
> "irgendwas" ist doch in der Klasse "Person" gar nicht definiert.
Die wird dann implizit hinzugefügt (als public). WOhl eine Anlehnung an die
Tatsache, dass man Variablen nicht definieren muss.
Vielleicht interessieren Dich in diesem Zusammenhang auch die magischen
Methoden __get und __set.
http://www.professionelle-softwareentwicklung-mit-php5.de/er ste_auflage/oop.interceptors.get.html
Re: Umsteiger-Frage
Markus Krebl schrieb:
> Hallo !
> Warum funktioniert das ohne Fehlermeldung ? Die Member-Variable
> "irgendwas" ist doch in der Klasse "Person" gar nicht definiert.
Nachtrag: direkt auf Members zugreifen darf man ohnehin nicht ;-)
--
Mein Zeugs:
http://www.hadanite-marasek.de/classes.php
http://www.objektivsuche.de/
Ansonsten:
http://www.php-faq.de/q/q-newsgroup-wie-helfen.html
Re: Umsteiger-Frage
Hadanite Marasek wrote:
>> Warum funktioniert das ohne Fehlermeldung ? Die Member-Variable
>> "irgendwas" ist doch in der Klasse "Person" gar nicht definiert.
>
> Willkommen bei PHP. Anders als bei Java funktioniert bei PHP in den
> meisten Fällen alles irgendwie. Ich rate Dir, in der php.ini E_ALL als
> Error Level zu nehmen, denn so etwas wirft zumindest noch ein E_NOTICE
> (die werden aber standardmässig nicht ausgegeben).
Und ich empfehle, E_STRICT gleich noch dazu zu nehmen. Das erleichtert den
Umstieg auf PHP6 wohl erheblich, was unser Javafreund vermutlich dankbar
machen wird, so schnell es geht.
Re: Umsteiger-Frage
Jonas Werres schrieb:
>> Ich rate Dir, in der php.ini E_ALL als
>> Error Level zu nehmen, denn so etwas wirft zumindest noch ein E_NOTICE
>> (die werden aber standardmässig nicht ausgegeben).n
> Und ich empfehle, E_STRICT gleich noch dazu zu nehmen. Das erleichtert den
> Umstieg auf PHP6 wohl erheblich, was unser Javafreund vermutlich dankbar
> machen wird, so schnell es geht.
error_reporting = E_ALL & E_STRICT & E_NOTICE
Ist das richtig so ?
lg, Markus
Re: Umsteiger-Frage
Jonas Werres schrieb:
> Vielleicht interessieren Dich in diesem Zusammenhang auch die magischen
> Methoden __get und __set.
> http://www.professionelle-softwareentwicklung-mit-php5.de/er ste_auflage/oop.interceptors.get.html
Also ich hab jetzt gelesen daß diese beiden Methoden immer dann
aufgerufen werden wenn versucht wird schreibend oder lesend auf nicht
vorhandene Membervariablen zuzugreifen.
Aber wie mein erstes Beispiel gezeigt hat, funktioniert der
Schreibzugriff auf die nicht definierte Membervariable "irgendwas" ja
auch ohne diese __set - Methode problemlos. Welchen Zweck erfüllt diese
dann ?
lg, Markus
Re: Umsteiger-Frage
Markus Krebl wrote:
> Jonas Werres schrieb:
>
>> Vielleicht interessieren Dich in diesem Zusammenhang auch die magischen
>> Methoden __get und __set.
>> http://www.professionelle-softwareentwicklung-mit-php5.de/er ste_auflage/oop.interceptors.get.html
>>
>
> Also ich hab jetzt gelesen daß diese beiden Methoden immer dann
> aufgerufen werden wenn versucht wird schreibend oder lesend auf nicht
> vorhandene Membervariablen zuzugreifen.
>
> Aber wie mein erstes Beispiel gezeigt hat, funktioniert der
> Schreibzugriff auf die nicht definierte Membervariable "irgendwas" ja
> auch ohne diese __set - Methode problemlos. Welchen Zweck erfüllt diese
> dann ?
Du kannst dort eben andere Dinge machen als bloß auf Member zugreifen,
z.B. eine Exception werfen, wenn die Variable nicht existiert...
regards,
Jens
Re: Umsteiger-Frage
Markus Krebl schrieb:
> error_reporting = E_ALL & E_STRICT & E_NOTICE
>
> Ist das richtig so?
Nö.
error_reporting(E_ALL | E_STRICT | E_NOTICE);
http://www.php.net/manual/de/function.error-reporting.php
Re: Umsteiger-Frage
Markus Krebl schrieb:
> error_reporting = E_ALL & E_STRICT & E_NOTICE
>
> Ist das richtig so ?
Nein. E_xxx sind im Grunde gesetzte Bits und '&' ist ein binäres AND:
E_ALL = 6143 = 1011111111111
E_STRICT = 2048 = 0100000000000
===============================
& = 0 = 0000000000000
E_NOTICE = 8 = 0000000001000
===============================
& = 0 = 0000000000000
Kein gesetztes Bit bedeutet aber: Keine Fehlermeldung.
Ich empfehle für Debugging-Zwecke:
error_reporting = E_ALL | E_STRICT ; alles - und strict dazu
display_errors = On ; damit man's sieht
log_errors = On ; damit man's nachgucken kann
error_log=C:\Logs\PHP\phperror.log ; oder wohin geloggt werden soll
date.timezone = Europe/Berlin ; E_STRICT will das so
viele grüße
ralph
Re: Umsteiger-Frage
Hallo, Adrian,
Du (adrianebeling) meintest am 10.10.07:
>> error_reporting = E_ALL & E_STRICT & E_NOTICE
>>
>> Ist das richtig so?
> Nö.
> error_reporting(E_ALL | E_STRICT | E_NOTICE);
In der "php.ini" steht bei "Examples" als Trenner zwischen Optionsname
und Option(en) das "=", aber kein Funktionsaufruf.
Re: Umsteiger-Frage
Helmut Hullen schrieb:
> Hallo, Adrian,
>
> Du (adrianebeling) meintest am 10.10.07:
>
>>> error_reporting = E_ALL & E_STRICT & E_NOTICE
>>>
>>> Ist das richtig so?
>
>> Nö.
>> error_reporting(E_ALL | E_STRICT | E_NOTICE);
>
> In der "php.ini" steht bei "Examples" als Trenner zwischen Optionsname
> und Option(en) das "=", aber kein Funktionsaufruf.
Das eine ist die Schreibweise in der php.ini, das andere der Aufruf aus
einem PHP-Programm.
Michael
Re: Umsteiger-Frage
Markus Krebl <markus.krebl [at] aon.at> wrote:
> Habe bisher in Java programmiert und wollte mich nun mal näher mit PHP
> beschäftigen, vor allem mit den objektorientierten Features. Vor einiger
Vom Regen in die Traufe.
Re: Umsteiger-Frage
Helmut Hullen schrieb:
> Hallo, Adrian,
>
> Du (adrianebeling) meintest am 10.10.07:
>
>>> error_reporting = E_ALL & E_STRICT & E_NOTICE
>>>
>>> Ist das richtig so?
>
>> Nö.
>> error_reporting(E_ALL | E_STRICT | E_NOTICE);
>
> In der "php.ini" steht bei "Examples" als Trenner zwischen Optionsname
> und Option(en) das "=", aber kein Funktionsaufruf.
>
Ups! Nicht richtig gelesen... Sorry!