Namensräume
Die größte Änderung in PHP 5.3 betrifft zweifellos die Namespaces (zuvor gab es eine entsprechende FAQ zu PHP-Namespaces). Dies bringt PHP-Entwicklern viele Vorteile und auch das vielfach kritisierte Problem der Funktionsbenennung wurde gelöst.
Code ist klarer
Allgemeiner Code vor 5.3 erfordert ein benutzerdefiniertes Präfix, um Funktions- und Klassennamen zu unterscheidenEINFACHER
TEXTCODE
:
function MY_wrapper() {}
Klasse MY_DB { }
define('MY_CONN_STR', '');
MY_wrapper();
new MY_DB();
MY_CONN_STR;
Nach der Verwendung von Namespaces sieht der Code sauberer aus.
EINFACHER
TEXTCODE:
Namespace MY;
Funktion Wrapper() {}
Klasse DB { }
const CONN_STR = '';
benutze MEIN ALS MEIN;
Verpackung();
neuer DB();
CONN_STR;
Mehrere Namespaces in einer Datei definiert
Was ist zu tun, wenn in einer Datei mehrere Namespaces definiert sind?
EINFACHER
TEXTCODE:
Namespace LIB;
Klasse MySQL {}
Klasse SQLite {}
$b = neues SQLite();
Namensraum LIB_EXTRA;
Klasse MScrypt {}
$a = neues MScrypt();
var_dump(
get_class($a),
get_class($b)
);
Die Ausgabe des obigen Codes ist:
PLAIN TEXT
CODE:
string(18)"LIB_EXTRA::MScrypt"
string(11)"LIB::SQLite"
PHP ist eine Sprache zur Interpretation und Ausführung, und die oben genannten Ergebnisse sind vernünftig.
Namespace-Priorität
Im Namensraum definierte Funktionen, Klassen und Konstanten haben Vorrang, gefolgt von globalen.
EINFACHER
TEXTCODE:
Namespace foo;
function strlen($foo) { return htmlentities($foo);
echo strlen("test"); // test
echo ::strlen("test"); // 4
echo namespace::strlen("test"); // test
Die Freundschaft zwischen Namespace und Autoload
Autoload analysiert den Speicherort der Klassendatei basierend auf dem Namespace-Namen und der Klassenname wird nur ausgelöst, wenn die Klassendefinition nicht im Namespace gefunden wird und der im Namespace definierte globale Bereich nicht aufgerufen wird.
Klarer Text
CODE:
function __autoload($var) { var_dump($var); } // LIB::foo
require "./ns.php";
<?php
Namensraum-LIB;
neues foo();
*/
Namespace einige Zubehörteile
EINFACHER
TEXTCODE:
Namespace wirklich::long::sinnlos::verbose::ns;
__NAMESPACE__; // Neue magische Konstante, die den aktuellen Namespace-Namen darstellt
Klasse A{}
get_class(new a()); // wirklich::long::sinnlos::verbose::ns::a
verwenden Sie real::long::pointlessly::verbose::ns::a AS b;// Verweisen Sie auf eine Klasse aus dem Namespace. Hinweis: Der Inhalt hier ist ein Auszug aus den Folien „pdfIntroduction to PHP 5.3“ und wird später nicht wiederholt.
Leistungsverbesserungen
Die Gesamtleistung von PHP 5.3 hat sich um 5–15 % verbessert
und md5() ist 10–15 % schneller
Bessere Stack-Implementierung in der Engine
Konstanten wurden in den Nur-Lese-Speicher verschoben
Verbesserung des Ausnahmebehandlungsprozesses (Vereinfachung, weniger Opcodes)
(erforderlich/einschließen)_Einmal Verbesserung, doppelte Öffnung entfernen
Kleinere Binärgröße und Startgröße mit gcc4
Neue Sprachfunktion__DIR__
Vor 5.3 war ein Funktionsaufruf erforderlich, um das Verzeichnis des aktuellen Skripts zu erhalten
: PLAIN TEXT
CODE:
echo dirname(__FILE__); // < PHP 5.3
In 5.3 wird nur eine magische Konstante __DIR__ benötigt.
EINFACHER
TEXTCODE:
echo __DIR__; // >= PHP 5.3
?:Operator Der praktische ?:Operator kann schnell einen Wert ungleich Null aus zwei Werten/Ausdrücken ermitteln.
EINFACHER
TEXTCODE:
$a = true ?: false; // true
$a = false ?: true; // true
$a = "" ?: 1; // 1
$a = 0 ?: 2; // 2
$a = array() ?: array(1); // array(1);
$a = strlen("") ?: strlen("a"); // 1
__callStatic()
Eine neue magische Methode __callStatic wurde hinzugefügt. Ihre Funktion ähnelt __call, ist jedoch nur für statische Methoden gültig.
EINFACHER
TEXTCODE:
Klassenhelfer {
statische Funktion __callStatic($name, $args) {
echo $name.'('.implode(',', $args).')';
}
}
helper::test("foo","bar"); // test(foo,bar)
Eine statische Methode dynamisch aufrufen. Kombination aus Bewegung und Stille.
EINFACHER
TEXTCODE:
Klassenhelfer {
statische Funktion foo() { echo __METHOD__ }
}
$a = "Helfer";
$b = "foo";
$a::$b(); // helper::foo
Späte statische Bindung
Ich weiß nicht, wie ich es übersetzen soll. Vielleicht ist es einfacher zu verstehen, wenn ich den Originaltext belasse. Der Zeitpunkt der Ereignisverarbeitung statischer Methoden hat sich geändert. Früher wurde sie während der Kompilierung verarbeitet, jetzt jedoch während der Ausführung.
Vor PHP 5.3 würde der folgende Code ein A ausgeben, aber das ist nicht das, was wir wollen. Die whoami-Methode wurde in Klasse B neu definiert. Sie sollte B ausgeben, um dem zu entsprechen, was wir für selbstverständlich halten.
EINFACHER
TEXTCODE:
Klasse A {
öffentliche statische Funktion whoami() {
echo __CLASS__;
}
öffentliche statische Funktion Identity() {
self::whoami();
}
}
Klasse B erweitert A {
öffentliche statische Funktion whoami() {
echo __CLASS__;
}
}
B::identity(); // A <-- PHP <5.3
Der folgende Code verwendet static::whoami(), um statische Methoden aufzurufen. Da __CLASS__ nach PHP 5.3 während der Ausführung verarbeitet wird, kann Klasse B in diesem Beispiel erfolgreich abgefangen werden.
EINFACHER
TEXTCODE:
Klasse A {
öffentliche statische Funktion whoami() {
echo __CLASS__;
}
öffentliche statische Funktion Identity() {
static::whoami();
}
}
Klasse B erweitert A {
öffentliche statische Funktion whoami() {
echo __CLASS__;
}
}
B::identity(); // B <-->= PHP 5.3
mysqlnd
Beachten Sie, dass mysqlnd in PHP 5.3 zum Standard-MySQL-Treiber geworden ist
, PDO_MySQL jedoch MySQL noch nicht unterstützt. Derzeit kann nur die MySQL(i)-Erweiterung
die zuvor eingeführten neuen Funktionen von PHP 5.3 nutzen, die alle für Entwickler praktisch sind. Dies ist eine Funktion, die Webhosting-Anbietern sehr gefällt.
Verbesserte Unterstützung für INI-Dateien
CGI/FastCGI unterstützt die INI-Konfiguration ähnlich wie .htaccess. Der Dateiname von ini hängt von der Konfiguration von php.ini ab, aber [PATH=/var/www/domain.com], [HOST=www .domain.com]-Abschnittseinstellungen können vom Benutzer nicht geändert werden.
Verbesserte Fehlerbehandlung
Variablen und Konstanten dürfen in INI-Dateien definiert und direkt im Programm aufgerufen werden.
Im Anhang finden Sie ein Beispiel für eine INI-Datei.
EINFACHER
TEXTCODE:
#Benutzerdefinierter php.ini-Dateiname (.htaccess). Der Standardwert ist „.user.ini“.
user_ini.filename=".user.ini"
#Wenn Sie diese Funktion deaktivieren möchten, setzen Sie sie auf einen Nullwert.
user_ini.filename=
#Benutzerdefinierte TTL-Länge (Time-to-Live) der php.ini-Datei, Einheit ist Sekunden, ich verstehe es als Cache-Ablaufzeit. Der Standardwert ist 300 Sekunden
user_ini.cache_ttl=300
[PATH=/var/www/domain.com]
variable_order = GPC
Safe_mode =1
[meine Variablen]
somevar = „1234“
anothervar = ${somevar}; anothervar == somevar
[INI-Arrays]
foo[bar]=1
foo[123]=2
foo[]=3