![]() |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Wo jetzt erstmal wieder alles läuft und zusätzlich noch die mysql- und templatte-klassen fertig sind (und hoffentlich auch alles läuft)
und bevor ich mich ans Rechte und Benutzer-System wende, wollte ich mal wieder etwas fragen: Und zwar hab ich von vielen Klassen deren Namen direkt für die Anbindung an die DB genutzt. Leider kann man ja nicht von einer Klasse den Namen auslesen. Der PHP-Parser hat was dagegen, wenn man den Klassennamen direkt als "String" verwenden will, aber diesen nicht schon als String in den Quelltext reinschreibt.
PHP-Quellcode:
Hier meckert er jedenfalls rum.
class MeineKlasse {
} echo MeineKlasse; if (is_subclass_of($obj, MeineKlasse)) ... Zitat:
Wenn man den Klassennamen nutzen würde, dann könnte eine Meldung ala "unbekannte Klasse" erzeugt werden. nun war ich erstmal auf diese saublöde Idee (und verwende sie schon eine kleine Weile)
PHP-Quellcode:
leider finde ich das etwas umständlich,
class test {
static function Name() { return get_called_class(); } } echo test::Name(); aber immerhin kommt bei einem Verschreiber etwas wie "... besitzt diese Methode nicht" :-D Nun bin ich vor ein paar Minuten auf diese noch krankere Idee gekommen, hab's ausprobiert und erschreckender Weise scheint es zu funktionieren. :shock: (also, es geht um die Konstante ... das __toString ist nur bei dem Test mit drin)
PHP-Quellcode:
Wie gesagt, in diesem kleinen Test funktioniert es, auch wenn ich nicht verstehe, wie PHP nun zwischen der Konstannte und der Klasse unterscheidet. :gruebel:
class test {
function __toString() { return get_called_class(); } } define('test', 'test'); $test = new test; if ($test instanceof test) echo 'yes'; echo test; echo $test; Spricht jetzt irgendwas gegen dieses Vorgehen? (natürlich würde ich mir diese Konstanten automatisch generieren lassen, um da ebenfalls Verscheiber zu unterbinden) |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Zitat:
![]() Zitat:
Zitat:
Zitat:
Zitat:
Du baust dir da ein Konstrukt hin das einfach nur noch bescheuert ist. Also wirklich bescheuert. Erstens solltest du $test mithilfe von
PHP-Quellcode:
erzeugen. Zweitens, fuehr mal den Code aus:
new test();
PHP-Quellcode:
So, und jetzt rate was ausgegeben wird, dann weisst du auch was Vorrang hat: Klassenname oder Konstantenname.
class foo {
} class bar { } define('foo', 'bar'); $test = new foo(); echo get_class($test); Wenn du direkt im Anschluss diesen Code ausfuehrst:
PHP-Quellcode:
wirst du feststellen dass beim Instanzieren von Objekten Konstantennamen nicht aufgeloest werden.
define('foo', 'baz');
$test = new foo(); echo get_class($test); Zitat:
Greetz alcaeus |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
auf die Idee bin ich auch schon gekommen und
PHP-Quellcode:
funktioniert nicht :zwinker:
get_class(MeineKlasse)
und du weißt garnicht wie oft man sich verschreiben kann :oops: (in Strings gibt's ja nimma 'ne Autovervollständigung) |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Zitat:
PHP-Quellcode:
Und trotzdem, was ist das Problem mit
get_class($meinObjekt);
PHP-Quellcode:
Greetz
if ($meinObjekt instanceof MeineKlasse)
alcaeus |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Zitat:
Code:
und es kommt natürlich der bekannte Fehler, mit der unbekannten Konstante
meinObjekt << Name von Klasse
get_class(meinObjekt) << Name von Klasse get_class($meinObjekt) << Name von Objekt Tja, nun hab ich alles nach String umgewandelt und auch denganzen __CLASS__-Schrott rausgemacht, denn es sieht sch***e aus, wenn an einer Stelle die Klasse und an anderer Stelle einen String genutzt wird. Ich wollte einfach nur ein einheitliches Aussehn. > in der Klasse nutzte ich __CLASS__ und self > und z.B. im Installer wollte ich den Klassennamen direkt angeben. öfters genutzte DB-Zugriffe und Ähnliches hab ich in Klassen zusammengefaßt und selten/fast nie genutztes in getrennten Dateien, damit diese nicht ständig mit geladen werden müssen. |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Erklaer mal dein Problem in Ruhe von Anfang an, ohne komischen WTF-Code. Ich hab absolut nicht verstanden was du ueberhaupt willst.
Kurzer Code zur Erklaerung:
PHP-Quellcode:
Kurz zur Erklaerung: __CLASS__ ist eine magische Konstante, die immer den Namen der aktuellen Klasse beinhaltet (oder nicht definiert ist wenn du nicht im Klassen-Kontext bist).
class A
{ public function foo() { echo __CLASS__; } } class B extends A { } $b = new B();
PHP-Quellcode:
Dieser Code gibt "A" aus.
$b->foo();
get_class() ist eine Methode, der du ein Objekt, keinen String (auch nicht sowas: get_class(meineKlasse), denn das ist auch nur ein String mit Compiler-Warnung) uebergibst und die dir den Klassennamen zurueckliefert.
PHP-Quellcode:
Dieser Code gibt "B" aus.
get_class($b)
instanceof prueft ob ein Objekt ein Child einer Klasse ist.
PHP-Quellcode:
In diesem Fall wird zweimal true ausgegeben, denn durch die Vererbung ist $b auch eine Instanz von A.
var_dump($b instanceof B);
var_dump($b instanceof A); Klar soweit? Greetz alcaeus PS: __CLASS__ ist kein Schrott. Es sieht auch nicht scheisse aus wenn an einer Stelle die Klasse benutzt wird und an anderer der String. Hin und wieder brauchts das eben so. Schrott oder Scheisse ist es nur, wenn du es nicht schaffst Konzepte auseinanderzuhalten. |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Was __CLASS__ ist das weiß ich schon,
aber ich wollte einfach nicht an einer Stelle eine Konstannte(Klasse) und anderer Stelle einen String für das Selbe verwenden.
PHP-Quellcode:
$Result = array();
$Database->Select(Language, array('NameID' => $NameID)); while ($Row = $Database->FetchRow()) $Result[$Row->Lang] = $Row->Text; return $Result;
PHP-Quellcode:
.
$Database->AddForeignKey(Template, 'Description', Language, 'ID');
Ich finde es auch praktisch, wenn die "Klasse" in der Syntaxhervorhebung des Editors anders angezeigt wird. (is irgendwie übersichtlicher, als wenn da nur irgendein String unter Anderen untergeht. Hab aber nun allen Klassen (wo ich's genötige) eine Konstannte verpaßt, in welcher der Tabellen/Klassenname nochmal drinsteht.
PHP-Quellcode:
.
$Database->Select(Language::TAB, array('NameID' => $NameID));
Auch innerhalb der Klassen scheib ich nun dieses, obwohl da auch die magische String-Konstante __CLASS__ gegangen wäre. |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Also ich bin mir recht sicher, dass ich verstanden habe was du meinst. Das wird' dir aber jetzt nicht gefallen... Dein Datenbankkonzept ist in der Hinsicht einfach nicht dafür zu gebrauchen. Ich sag' dir mal wie ich (und viele andere, vielleicht auch alcaeus :-) ) das machen:
PHP-Quellcode:
Um SELECTs zu machen gibt es verschiedene Möglichkeiten. Darunter zum Beispiel, dass man dieser Eltern-Klasse ein Attribut (z.B. "objects") gibt, oder auch direkt einfache Methoden. So kann man das benutzen:
$user = new User();
$user->passsword = md5( /*...*/ ); $user->name = $name; $user->save();
PHP-Quellcode:
Eine Klasse bzw. Tabelle definiert sich dann beispielsweise durch sowas hier:
$users = new User()->objects->all();
foreach ($users as $user) { /* ... */ }
PHP-Quellcode:
Das ist alles nur beispielsweise und auch nur ungefähr. Vieles davon kann man ändern. So ist der Weg, den ich kennen gelernt habe und zu schätzen weiß. Im Vergleich zu den vielen, recht simple gehaltenen Anwendungen, kann man das auch durchauss als "professionell" bezeichnen.
class User extends BaseTable
{ public function getFields() { return array( "name" => new VarChar(255), "password" => new VarChar(32) ); } } Fertige Implementationen von Ähnlichem (!) sind zum Beispiel ![]() ![]() ![]() Hoffe ich konnte dir damit helfen. PHP ist nicht so schlimm wie du immer denkst. Du machst es nur schlimm... PHP hat viele Nachteile, das kann man nicht abstreiten. Aber das sind nicht die, die du immer nennst. Schlechtes Design, inkonsequente APIs und unlogisches Verhalten definieren sich an ganz anderen Stellen in PHP. Aber auch damit lernt man umzugehen. Liebe Grüße, Valle :-) |
AW: PHP - sind hier "Sicherheitsexperten" an Board?
Zitat:
Erstens: wenn du deinem DB-Layer sagen musst, in welche Klasse er die Daten reinhydrieren soll dann hast du schon was falsch gemacht. Entweder das Ding weiss es von selbst oder du musst nochmal ans Zeichenbrett. Zweitens: in dem Codebeispiel von vorhin ist es absolut sinnbefreit, eine Hydrierung in Objekte vorzunehmen (die kostet richtig viel Zeit) nur um danach ein Array zu befuellen. Da bist du von Anfang an mit Arrays besser bedient. Spaetestens wenn du mal ein paar Hundert Datensaetze ein paar Hunder mal auslesen musst, wirst du mir fuer den Tipp danken. Drittens: hoer auf ein n-Eck zu entwickeln, es als Rad zu verkaufen und wenn man sagt "ne, das ist kein Rad" dann einfach ein n+1-Eck zu bauen und das Ganze von vorne losgehn zu lassen. Es mag jetzt boese klingen, aber es gibt zwei richtig gute Projekte (ok, ein richtig gutes und ein...naja, egal) die genau das Umsetzen was du da halbherzig mit ohne Features umgesetzt hast. Das Ganze nennt sich "Object-Relational Mapper" und kann das Hundertfache von dem was deine Library kann. Auch von mir kommt nochmal der bereits oft erwaehnte ernsthafte Rat, dir wenigstens Doctrine anzugucken. Wenn du selbstzerstoererisch veranlagt bist kannst du dir auch noch ![]() Und jetzt eine ganz, ganz, ganz grosse Bitte: befasse dich bitte mit Software-Architektur. In Delphi wird einem viel vorgegeben, weshalb es schwer ist sich in den Fuss zu schiessen. Du hast ein winziges Projekt angefangen und hast dir mehr Fuesse weggeschossen als jemals Prothesen dafuer gebaut werden koennen. PHP ist eine Sprache die dich in kein Muster zwingt. Das ist auf der einen Seite sehr schoen, weil Quick'n'Dirty-Programming echt gut funktioniert. Wenn du aber Software entwickeln willst (im Unterschied zum ueblichen "Scripte basteln") dann befass dich bitte mit Patterns wie eben ORM, MVC, Factories, Singletons, Decorators. Zusaetzlich solltest du dir das Konzept der Dependency Injection angucken - all diese Dinge sind in der modernen SW-Entwicklung (und in meinen Augen v.a. in PHP) unerlaesslich. Auch wenn du nur hobby-maessig PHP-Projekte entwickelst, als hauptberuflicher PHP-Entwickler tut es echt weh, diese Leier immer wieder erwaehnen zu muessen. Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz