Was mache ich, wenn ich mehrere Instanzen von etwas brauche. z.b. Eine Liste von Personen in einer Personengruppe? Wie nutze ich das per DI-Container? Muss ich dann eine Factory schreiben und die Instanzen in der Klasse per Methode über die Factory aufrufen, um neue Elemente Person zu erzeugen? Wie wird der DI-Container genutzt. Man sieht in Deinen videos dazu nicht so richtig, wo der letztlich verwendet wird. Also Du hast halt so komischen prozeduralen code, wo der DI-Container definiert wird der ins "nichts" returned. ich persönlich finde das extrem schwer debugbar und auch von der Logik im code kaum nachvollziehbar, wo der Inhalt des DI-Containers herkommt. Wie oft muss man DI-Container schreiben im Projekt? Einen, mehrere?
Also wenn du zb eine Liste von Personen haben willst, würdest du dir aus dem DI Container ein PersonRepository holen und der hat methoden wie etwa findAll() oder findById() und das repository würde dann entweder die objekte direkt erzeugen oder mit einer Hydrator Klasse das DB Array in ein Objket umwandeln.
Mir gefällt der Overhead, der mit Attributen einhergeht, nicht wirklich. Soweit ich weiß, gibt es leider keine Einstellung für PHP, daß Attribute ignoriert werden, obwohl sie als Kommentarsyntax geschrieben sind. Sonst hätte ich eine Verwendung für Unit-Tests. Kennst Du gute Tools, die den Quellcode für die Produktivumgebung bereinigen? Da sollen auch gern generell alle Kommentare rausfliegen, und ggf. auch Hints, sofern sie Overhead erzeugen. Codeperformanceoptimierungen dürfen auch gern stattfinden. Bei Hints bin ich nicht sicher, wie die in aktuellen Versionen vom Compiler behandelt werden, wahrscheinlich aber auch suboptimal.
Ja es gibt einen kleinen Overhead, allerdings ist der wesentlich geringer als es früher der Fall war. Früher musste man für solche Späße die Kommentare mit einem Regulären Ausdruck analysieren. Ein Tool zur Bereinung gibt es nicht, soweit ich es weiß. Es würde auch kein Sinn machen. Das Symfony Framework würde ohne Attribute nicht mehr funktionieren. Außerdem hat PHP eigene native Attribute die vom PHP Interpreter analyisiert werden. zb Depricated oder AllowDynamicProperties. Attribute sind ein Feature was aus der C# Welt vermutlich abgeschaut wurde und ich denke wir werden immer mehr und mehr attribute in php sehen.
@@VitalijMik Ja genau. In C# nutze ich auch Attribute, um in der Editorumgebung von Unity Features zu implementieren. Zur Laufzeit vermeide ich sie aber wie der Teufel das Weihwasser. :) Die depricated-Attribute braucht man ja auch nur zur Entwicklungszeit. Die könnten zur Laufzeit ebenfalls verschwinden. Daß das in Zukunft in Mode kommt, wie schon bei Doctrine zu sehen, fürchte ich leider auch. Der Trend geht ja zu immer mehr Abstraktion, was ich nicht unbedingt befürworte. Es haben sich in der Branche so viele Hypes entwickelt, die oft eher kontraproduktiv sind. Z.B. befürworte ich auch test-driven nicht; Ich schreibe erst eine Funktionalität fertig, bis die Struktur feststeht. Das ändert sich im Entwicklungsprozeß meist noch stark. Erst wenn sich eine Struktur etabliert hat, wird der Test dazu geschrieben, sodaß Veränderungen durch Abhängigkeiten unmittelbar aufällig werden. Das spart eine menge Zeit. Durch zu frühe Tests wird die Kreativität zu stark in ein Korsett gepreßt. Einen Router würde ich in einer Weise angehen, ohne daß der geroutete Code zur Laufzeit vorab geladen sein muß. Bei C# wird ohnehin zur Laufzeit nicht compiliert, also schlechte Vorlage für PHP. Da stehen die Attribute praktisch schon zur Verfügung. Wenn ich C# programmiere, meist für WebAssembly, dann will ich die Größe des Exports so gering wie mögilch halten, und ich versuche, Bibliotheken zu vermeiden. Bei PHP will ich nur das Laden, was nötig ist. Oder ich erzeuge am Ende eine Monolith-Anwendung oder zumindest viele häufig genutzte Klassen. Die Größe der Datei spielt eher weniger eine Rolle als die vielen Dateizugriffe.
@@pinkeHelga jain, Depricated attributes zur Laufzeit sind schon sinnvoll. Wenn du Kibana oder andere Logfiles Analysetools hast dann siehst du dort was depricated ist. Du siehst ja nicht alle Klassen bei der Entwicklung. Es hilft schon zu sehen ob in der Applikation man viele Klassen hat die depricated sind oder nicht. Bezüglich des Ladens, dafür sind ja die Anonymen funktionen da + autoloader. Das was du willst, wird ja durch diese tools erreicht. Da werden Dinge geladen wenn diese auch gebraucht werden. Ich meine Technisch gesehen macht es kein Unterschied ob du jetzt die Action der Route als Callable registrierst in einer routes.php oder ob du via reflection klassen erst mal schaust was es denn für attribute gibt und diese dann registrierst, der Overhead ist eigentlich minmal. Dateizugriff ist ja auch gering, mit require_once wird die datei ein mal intern geladen und immer wieder aus dem Speicher abgefragt. Seit PHP 8.0 gibt es ja den Just in Time Compiler der die applikation kompiliert und das Laden der Attribute optimiert. Du hast halt bei jedem Feature irgend ein Tradeoff und Performance in PHP ist echt ein schwieriges thema, meistens ist PHP nie wirklich ein bottleneck sondern externe Applikationen wie etwa die DB. PHP applikationen kannst du wunderbar in einem parallelbetrieb mit einem loadbalancer skalieren und das auch noch kostengünstig. In der Praxis muss man halt schauen, wie lange dauert es alles manuell zu konfigurieren. Wenn du eine Stunde extra brauchst nur um ein paar Routen zu setzen, dann rechne das gegen einen Server der 5 euro im Monat kostet und schau ob die Performance sich dann wirklich rentiert
@@pinkeHelga in der heutigen Zeit wird sowieso nicht mehr wirklich auf Performance geachtet, nur dann wenn es relevant wird. Als Beispiel Apps. Alle entwickeln nativen Apps auf elektron basis mit Typescript/Javascript. Besser wäre es natürlich alles nativ zu entwickeln, desktop apps mit Rust/C++ und Mobile Apps mit den Sprachen für das Endgerät. Das wäre Optimal. Allerdings heißt es dass man die gleiche Logik in mehreren Sprachen entwickeln muss, was auch zu Fehlern führen kann. Debugging wird schwierig usw also nimmt man das was Zeitlich sinnvoller ist. Wenn es dir wichtig ist, die Attributes nicht zu nutzen, dann nutze die nicht, das ist ja das schöne daran, alles ist optional
@@pinkeHelga hier noch mal die Bestätigung von einem anderen Entwickler ua-cam.com/video/BAJnCbavUcU/v-deo.html Writetime Speed > Runtime Speed es ist wichtiger eine applikation schnell zu erstellen und schnell zu verändern. Laufzeit kann man mit mehreren Servern aufbessern. Wird aber eh erst dann Relevant wenn man auch last hat
Vielleicht mag mir hier jemand beim RegEx der URL behilflich sein. Sobald in der URL ein Leerzeichen ist, sprich %20, wird die Route nicht mehr gefunden, da preg_match nicht übereinstimmt. Route: #[Route('/download/{filename}')] URL, wird nicht gefunden: /download/Aktuelle%20Preise.txt URL, wird gefunden: /download/AktuellePreise.txt Liegt denke ich an Router.php, Zeile 24: $rexEx = sprintf('~^(%s)/?%s(%s)$~i',$routeKey,self::SEPARATOR,$route->getMethods());
das liegt daran github.com/BlackScorp/attributes/blob/main/Route.php#L26 das große S im regex besagt, suche nach buchstaben und das prozent Zeichen ist ein Zeichen und kein Buchstabe. vielleicht da mal statt \S+ ein .* eintragen
@@VitalijMik Super, das hat funktioniert. Jetzt möchte ich nur noch die rawurldecode-Funktion zum laufen bringen, damit Umlaute in der URL wieder korrekt umgewandelt werden. Irgendwie zeigt die Funktion keinerlei Wirkung bei rawurldecode($_SERVER['REQUEST_URI']), wenn ich die in createFromGlobal() ausführe. Hatte damit noch nie Schwierigkeiten, da PHP und der Server auf UTF-8 eingestellt sind. /download/H%C3%A4ngebr%C3%BCcke.jpg sollte /download/Hängebrücke.jpg ausgeben
@@JanAllanZischke wieso benutzt du mb_detec_encoding und dann aber iconv um zu kodieren? wieso nicht mb_convert_encodinfg? und macht es sinn nach dem rawurlencode dann die kodierung zu ermitteln? die ist doch dann verfälscht?
Das ist auch gelöst. Der liebe IIS und sein FastCGI steht auf ASCII anstatt UTF-8. Registryeintrag hinzugefügt und es rennt: reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO
Habt ihr noch weitere Ideen wofür man Attribute verwenden könnte abgesehen von Router und ORM?
Спасибо за видео. Коммент в поддержку!
спасибо болшое
Was mache ich, wenn ich mehrere Instanzen von etwas brauche. z.b. Eine Liste von Personen in einer Personengruppe? Wie nutze ich das per DI-Container? Muss ich dann eine Factory schreiben und die Instanzen in der Klasse per Methode über die Factory aufrufen, um neue Elemente Person zu erzeugen?
Wie wird der DI-Container genutzt. Man sieht in Deinen videos dazu nicht so richtig, wo der letztlich verwendet wird. Also Du hast halt so komischen prozeduralen code, wo der DI-Container definiert wird der ins "nichts" returned. ich persönlich finde das extrem schwer debugbar und auch von der Logik im code kaum nachvollziehbar, wo der Inhalt des DI-Containers herkommt.
Wie oft muss man DI-Container schreiben im Projekt? Einen, mehrere?
Also wenn du zb eine Liste von Personen haben willst, würdest du dir aus dem DI Container ein PersonRepository holen und der hat methoden wie etwa findAll() oder findById() und das repository würde dann entweder die objekte direkt erzeugen oder mit einer Hydrator Klasse das DB Array in ein Objket umwandeln.
Mir gefällt der Overhead, der mit Attributen einhergeht, nicht wirklich. Soweit ich weiß, gibt es leider keine Einstellung für PHP, daß Attribute ignoriert werden, obwohl sie als Kommentarsyntax geschrieben sind. Sonst hätte ich eine Verwendung für Unit-Tests.
Kennst Du gute Tools, die den Quellcode für die Produktivumgebung bereinigen? Da sollen auch gern generell alle Kommentare rausfliegen, und ggf. auch Hints, sofern sie Overhead erzeugen. Codeperformanceoptimierungen dürfen auch gern stattfinden. Bei Hints bin ich nicht sicher, wie die in aktuellen Versionen vom Compiler behandelt werden, wahrscheinlich aber auch suboptimal.
Ja es gibt einen kleinen Overhead, allerdings ist der wesentlich geringer als es früher der Fall war. Früher musste man für solche Späße die Kommentare mit einem Regulären Ausdruck analysieren.
Ein Tool zur Bereinung gibt es nicht, soweit ich es weiß. Es würde auch kein Sinn machen. Das Symfony Framework würde ohne Attribute nicht mehr funktionieren. Außerdem hat PHP eigene native Attribute die vom PHP Interpreter analyisiert werden. zb Depricated oder AllowDynamicProperties. Attribute sind ein Feature was aus der C# Welt vermutlich abgeschaut wurde und ich denke wir werden immer mehr und mehr attribute in php sehen.
@@VitalijMik Ja genau. In C# nutze ich auch Attribute, um in der Editorumgebung von Unity Features zu implementieren. Zur Laufzeit vermeide ich sie aber wie der Teufel das Weihwasser. :)
Die depricated-Attribute braucht man ja auch nur zur Entwicklungszeit. Die könnten zur Laufzeit ebenfalls verschwinden.
Daß das in Zukunft in Mode kommt, wie schon bei Doctrine zu sehen, fürchte ich leider auch. Der Trend geht ja zu immer mehr Abstraktion, was ich nicht unbedingt befürworte. Es haben sich in der Branche so viele Hypes entwickelt, die oft eher kontraproduktiv sind.
Z.B. befürworte ich auch test-driven nicht; Ich schreibe erst eine Funktionalität fertig, bis die Struktur feststeht. Das ändert sich im Entwicklungsprozeß meist noch stark. Erst wenn sich eine Struktur etabliert hat, wird der Test dazu geschrieben, sodaß Veränderungen durch Abhängigkeiten unmittelbar aufällig werden. Das spart eine menge Zeit. Durch zu frühe Tests wird die Kreativität zu stark in ein Korsett gepreßt.
Einen Router würde ich in einer Weise angehen, ohne daß der geroutete Code zur Laufzeit vorab geladen sein muß.
Bei C# wird ohnehin zur Laufzeit nicht compiliert, also schlechte Vorlage für PHP. Da stehen die Attribute praktisch schon zur Verfügung. Wenn ich C# programmiere, meist für WebAssembly, dann will ich die Größe des Exports so gering wie mögilch halten, und ich versuche, Bibliotheken zu vermeiden. Bei PHP will ich nur das Laden, was nötig ist. Oder ich erzeuge am Ende eine Monolith-Anwendung oder zumindest viele häufig genutzte Klassen. Die Größe der Datei spielt eher weniger eine Rolle als die vielen Dateizugriffe.
@@pinkeHelga jain, Depricated attributes zur Laufzeit sind schon sinnvoll. Wenn du Kibana oder andere Logfiles Analysetools hast dann siehst du dort was depricated ist. Du siehst ja nicht alle Klassen bei der Entwicklung. Es hilft schon zu sehen ob in der Applikation man viele Klassen hat die depricated sind oder nicht.
Bezüglich des Ladens, dafür sind ja die Anonymen funktionen da + autoloader. Das was du willst, wird ja durch diese tools erreicht. Da werden Dinge geladen wenn diese auch gebraucht werden.
Ich meine Technisch gesehen macht es kein Unterschied ob du jetzt die Action der Route als Callable registrierst in einer routes.php oder ob du via reflection klassen erst mal schaust was es denn für attribute gibt und diese dann registrierst, der Overhead ist eigentlich minmal.
Dateizugriff ist ja auch gering, mit require_once wird die datei ein mal intern geladen und immer wieder aus dem Speicher abgefragt. Seit PHP 8.0 gibt es ja den Just in Time Compiler der die applikation kompiliert und das Laden der Attribute optimiert.
Du hast halt bei jedem Feature irgend ein Tradeoff und Performance in PHP ist echt ein schwieriges thema, meistens ist PHP nie wirklich ein bottleneck sondern externe Applikationen wie etwa die DB. PHP applikationen kannst du wunderbar in einem parallelbetrieb mit einem loadbalancer skalieren und das auch noch kostengünstig. In der Praxis muss man halt schauen, wie lange dauert es alles manuell zu konfigurieren. Wenn du eine Stunde extra brauchst nur um ein paar Routen zu setzen, dann rechne das gegen einen Server der 5 euro im Monat kostet und schau ob die Performance sich dann wirklich rentiert
@@pinkeHelga in der heutigen Zeit wird sowieso nicht mehr wirklich auf Performance geachtet, nur dann wenn es relevant wird.
Als Beispiel Apps. Alle entwickeln nativen Apps auf elektron basis mit Typescript/Javascript. Besser wäre es natürlich alles nativ zu entwickeln, desktop apps mit Rust/C++ und Mobile Apps mit den Sprachen für das Endgerät. Das wäre Optimal. Allerdings heißt es dass man die gleiche Logik in mehreren Sprachen entwickeln muss, was auch zu Fehlern führen kann. Debugging wird schwierig usw also nimmt man das was Zeitlich sinnvoller ist.
Wenn es dir wichtig ist, die Attributes nicht zu nutzen, dann nutze die nicht, das ist ja das schöne daran, alles ist optional
@@pinkeHelga hier noch mal die Bestätigung von einem anderen Entwickler
ua-cam.com/video/BAJnCbavUcU/v-deo.html
Writetime Speed > Runtime Speed
es ist wichtiger eine applikation schnell zu erstellen und schnell zu verändern. Laufzeit kann man mit mehreren Servern aufbessern. Wird aber eh erst dann Relevant wenn man auch last hat
Vielleicht mag mir hier jemand beim RegEx der URL behilflich sein. Sobald in der URL ein Leerzeichen ist, sprich %20, wird die Route nicht mehr gefunden, da preg_match nicht übereinstimmt.
Route:
#[Route('/download/{filename}')]
URL, wird nicht gefunden:
/download/Aktuelle%20Preise.txt
URL, wird gefunden:
/download/AktuellePreise.txt
Liegt denke ich an Router.php, Zeile 24:
$rexEx = sprintf('~^(%s)/?%s(%s)$~i',$routeKey,self::SEPARATOR,$route->getMethods());
das liegt daran github.com/BlackScorp/attributes/blob/main/Route.php#L26
das große S im regex besagt, suche nach buchstaben und das prozent Zeichen ist ein Zeichen und kein Buchstabe. vielleicht da mal statt \S+ ein .* eintragen
@@VitalijMik Super, das hat funktioniert.
Jetzt möchte ich nur noch die rawurldecode-Funktion zum laufen bringen, damit Umlaute in der URL wieder korrekt umgewandelt werden. Irgendwie zeigt die Funktion keinerlei Wirkung bei rawurldecode($_SERVER['REQUEST_URI']), wenn ich die in createFromGlobal() ausführe. Hatte damit noch nie Schwierigkeiten, da PHP und der Server auf UTF-8 eingestellt sind.
/download/H%C3%A4ngebr%C3%BCcke.jpg sollte /download/Hängebrücke.jpg ausgeben
Aus irgendeinem Grund wird das als iso8559-1 kodiert empfangen. Hiermit klappt es:
$encoding_list = array('utf-8', 'iso-8859-1');
$enc = mb_detect_encoding(rawurldecode($_SERVER['REQUEST_URI']), $encoding_list);
$requestUri = '#' . iconv($enc, 'utf-8', rawurldecode($_SERVER['REQUEST_URI']));
@@JanAllanZischke wieso benutzt du mb_detec_encoding und dann aber iconv um zu kodieren? wieso nicht mb_convert_encodinfg? und macht es sinn nach dem rawurlencode dann die kodierung zu ermitteln? die ist doch dann verfälscht?
Das ist auch gelöst. Der liebe IIS und sein FastCGI steht auf ASCII anstatt UTF-8.
Registryeintrag hinzugefügt und es rennt:
reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\w3svc\Parameters /v FastCGIUtf8ServerVariables /t REG_MULTI_SZ /d REQUEST_URI\0PATH_INFO