MasterEvil hat gesagt.:
Das PHP hässlich ist würde ich nicht gerade sagen, ich finde eine Syntax die stark an Basic oder ähnliches erinnert viel hässlicher, die C ähnlich Syntax von PHP find ich viel angenehmer zu schreiben ;-]
Python und Ruby 's Syntax hat nun gar nichts mit Basic zu tun.
Python:
class Daemonizer:
def main(self, args=None):
self.options = ZDRunOptions()
self.options.realize(args)
self.logger = self.options.logger
self.set_uid()
self.run()
def set_uid(self):
if self.options.uid is None:
return
uid = os.geteuid()
if uid != 0 and uid != self.options.uid:
self.options.usage("only root can use -u USER to change users")
os.setgid(self.options.gid)
os.setuid(self.options.uid)
def run(self):
self.proc = Subprocess(self.options)
self.opensocket()
try:
self.setsignals()
if self.options.daemon:
self.daemonize()
self.runforever()
finally:
try:
os.unlink(self.options.sockname)
except os.error:
pass
mastersocket = None
commandsocket = None
def opensocket(self):
sockname = self.options.sockname
tempname = "%s.%d" % (sockname, os.getpid())
self.unlink_quietly(tempname)
while 1:
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
sock.bind(tempname)
os.chmod(tempname, 0700)
try:
os.link(tempname, sockname)
break
except os.error:
# Lock contention, or stale socket.
self.checkopen()
# Stale socket -- delete, sleep, and try again.
msg = "Unlinking stale socket %s; sleep 1" % sockname
sys.stderr.write(msg + "\n")
self.logger.warn(msg)
self.unlink_quietly(sockname)
sock.close()
time.sleep(1)
continue
finally:
self.unlink_quietly(tempname)
sock.listen(1)
sock.setblocking(0)
self.mastersocket = sock
def unlink_quietly(self, filename):
try:
os.unlink(filename)
except os.error:
pass
def checkopen(self):
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
s.connect(self.options.sockname)
s.send("status\n")
data = s.recv(1000)
s.close()
except socket.error:
pass
else:
while data.endswith("\n"):
data = data[:-1]
msg = ("Another zrdun is already up using socket %r:\n%s" %
(self.options.sockname, data))
sys.stderr.write(msg + "\n")
self.logger.critical(msg)
sys.exit(1)
technisch ist PHP doch auch nicht wirklich "gefährlich" wenn man es richtig handhabt und konfiguriert. Mit eigenen Librarys kann man PHP dann auch noch erweitern mit eigenen Funktionen.
Doch ist es. Denn PHP verleitet zu schlechter Programmierung. Und schlechte Programmierung ist das was mann eigentlich in fast jedem PHP Code entdeckt.
Es sieht doch so aus das mann zwar erkannt hat das globale Variablen ein Sicherheitsrisiko sind (hat ja lang genug gedauert) aber schreckt davor zurück register_globals = on gleich zu verbieten.
Resultat: nicht wenige Hoster erlauben register_globals. Womit selbst jene Scripte die auf register_globals off gestrickt sind leider damit handeln müssen. Oder aber jener Programmierer muss darauf achten global Variablen in seiner .htaccess umzustellen.
Das zeigt aber das PHP in Sicherheitsfragen genauso konzeptionslos ist wie bei der benennung.
OOP ist wirklich nicht die Stärke von PHP aber wo braucht man das schon wirklich bei einer Website. Einfache Klassen kann man auch mit PHP4 erzeugen, zum einfachen handlen eines Warenkorbs etc. reicht es vollkommen aus. Wenn man Objekte erstellen will die nur bedingten Zugriff auf Attribute und Funktionen haben muss man halt PHP5 verwenden.
OOP ist etwas mehr als Klassen erzeugen. Ich habe schon geschrieben das keine Exception geworfen wird, die mann abfangen könnte, wenn eine Datei nicht lesbar ist.
Nein PHP geht noch nen Schritt weiter richtung bescheuert und erlaubt es sogar mit @ komplette Fehlermeldungen / Fehlschläge zu ignorieren.
Und das ist für ein Warenkorb sehr wichtig. Welcher Webshop Anbieter will denn gerne
Waren verschicken ohne das jene Bestellung auch unter Rechnungen protokolliert wird.
Wenn du denkst sowas kommt nicht vor, hast du dich geeirrt. Genauo so ein Webshop habe ich vor ein paar Jahren mal fixen müssen.
Der "Programmierer" hatte nach dem Bestellauftrag ein fehlgeschlagenen MySQL Query ignoriert. Weshalb ein paar Bestellungen raus gingen ohne das dafür eine Rechnung erstellt wurde.
Die Namensgebung ist für wahr nicht berauschend, ein großer Nachteil von PHP aber nicht wirklich schwerwiegend wie ich finde. Mit php.net hat man eine perfekte Plattfom in der man ohne lange zu suchen genau das findet was man braucht.
PHP ist auch die einzige Sprache die ich kenne in der mann permanent mit einem Auge in der Doku verbringen muss.
Oder wer weiss denn schon Auswendig welche dieser 14 Escaping Funktionen aktuell am besten passt:
dbx_escape_string, escapeshellarg, escapeshellcmd, pg_escape_bytea,
pg_escape_string, pg_unescape_bytea, addslashes, addcslashes, preg_quote,
quotemeta, mysql_escape_string, mysql_real_escape_string,
mysqli_real_escape_string, sqlite_escape_string
...