在PHP5.2中不要Runkit 给类动态添加新方法
在PHP5.2中不用Runkit 给类动态添加新方法
js中的对象可以动态添加方法. 在PHP5.2中可用Runkit 给类添加方法. 而到php5.3,增加了闭包的语法. 可以直接动态添加方法.
由于Runkit 是在PECL中的,一般无法直接使用.所以,在在PHP5.2中,也就受到了限制. 所以,人们说PHP5.2仍不是动态结构语言.
而js中的对象可以动态添加方法,这对于精简代码,减少继承与扩展,对人总有吸引力.
是否真的不能动态添加呢.其实是可以的,只不能人们没有找到实现的方法.
现在我们就讲解一下,如何动态添加:
<?phpclass ActiveStruct { var $lambda=array(); //定义保存动态方法的数组 //定义动态添加方法的方法 function addFunction($name,$code) { $func=create_function('',$code); $this->lambda[$name] = $func; } //为动态添加的方法增加调用接口 function __call($name,$args){ if (array_key_exists($name,$this->lambda)){ $func = $this->lambda[$name]; return $func($args); } } } //创建对象$objAcst = new ActiveStruct(); //添加新方法$objAcst->addFunction('newFunc', '$vars = func_get_args(); return ($vars[0][0].$vars[0][1]);'); //对新方法进行测试$testResult=$objAcst->newFunc('Hello,',' Php! '); echo($testResult);?>
?
需要注意的是, 使用这一方式,动态添加的方法,我们不能显式声明变量的个数.而在动态添加的方法内部.要获取传入的参数,只能通过:
$vars = func_get_args();
无论多少个变量,传入的参数均是在$vars[0]中
所以,要了解传入多少个参数,那就需要用 count($vars[0]);
对参数的使用则是:
$vars[0][0], $vars[0][1], 依次类推.
?
另外的不足,则是,因为是用create_function实现的,所以,代码要写成字串.
其次则是 __call函数使用,会影响效率.
?
尽管如此,却为你能够在虚拟主机的空间,使方法能动态添加成为可能! 所以, 需要时,还是可以用的.
?
当然,如果你有更好的改进办法, 也请你告诉我!
?

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

In C++ gibt es zwei Möglichkeiten, Ausnahmen mit Lambda-Ausdrücken zu behandeln: Die Ausnahme mit einem Try-Catch-Block abfangen und die Ausnahme im Catch-Block behandeln oder erneut auslösen. Mithilfe einer Wrapper-Funktion vom Typ std::function kann die Methode try_emplace Ausnahmen in Lambda-Ausdrücken abfangen.

Funktion bedeutet Funktion. Es handelt sich um einen wiederverwendbaren Codeblock mit bestimmten Funktionen. Er kann Eingabeparameter akzeptieren, bestimmte Operationen ausführen und Ergebnisse zurückgeben. Code, um die Wiederverwendbarkeit und Wartbarkeit des Codes zu verbessern.

In C++ ist ein Abschluss ein Lambda-Ausdruck, der auf externe Variablen zugreifen kann. Um einen Abschluss zu erstellen, erfassen Sie die äußere Variable im Lambda-Ausdruck. Abschlüsse bieten Vorteile wie Wiederverwendbarkeit, Ausblenden von Informationen und verzögerte Auswertung. Sie sind in realen Situationen nützlich, beispielsweise bei Ereignishandlern, bei denen der Abschluss auch dann noch auf die äußeren Variablen zugreifen kann, wenn diese zerstört werden.

Zu den Vorteilen von Lambda-Ausdrücken in der C++-Multithread-Programmierung gehören Einfachheit, Flexibilität, einfache Parameterübergabe und Parallelität. Praktischer Fall: Verwenden Sie Lambda-Ausdrücke, um Multithreads zu erstellen und Thread-IDs in verschiedenen Threads zu drucken, was die Einfachheit und Benutzerfreundlichkeit dieser Methode demonstriert.

C++-Lambda-Ausdrücke unterstützen Abschlüsse, die Funktionsbereichsvariablen speichern und sie für Funktionen zugänglich machen. Die Syntax lautet [capture-list](parameters)->return-type{function-body}. Capture-Liste definiert die zu erfassenden Variablen. Sie können [=] verwenden, um alle lokalen Variablen nach Wert zu erfassen, [&], um alle lokalen Variablen nach Referenz zu erfassen, oder [Variable1, Variable2,...], um bestimmte Variablen zu erfassen. Lambda-Ausdrücke können nur auf erfasste Variablen zugreifen, den ursprünglichen Wert jedoch nicht ändern.

Es gibt drei Möglichkeiten, Lambda-Ausdrücke externer Variablen in C++ zu erfassen: Erfassung nach Wert: Erstellen Sie eine Kopie der Variablen. Erfassen nach Referenz: Rufen Sie eine Variablenreferenz ab. Gleichzeitige Erfassung nach Wert und Referenz: Ermöglicht die Erfassung mehrerer Variablen, entweder nach Wert oder nach Referenz.

Wie führt man eine verzögerte Auswertung mit C++-Lambda-Ausdrücken durch? Verwenden Sie Lambda-Ausdrücke, um verzögert ausgewertete Funktionsobjekte zu erstellen. Eine verzögerte Berechnung verzögert die Ausführung, bis sie benötigt wird. Berechnen Sie Ergebnisse nur bei Bedarf und verbessern Sie so die Leistung.

In C++ können Sie Lambda-Ausdrücke als Funktionsparameter verwenden, um die Flexibilität von Rückruffunktionen zu erreichen. Konkret: Parameterübergabe: Wickeln Sie den Lambda-Ausdruck durch std::function und übergeben Sie ihn in Form eines Funktionszeigers an die Funktion. Rückgabewertverarbeitung: Geben Sie den Rückgabewerttyp an, wenn Sie den Rückruffunktionszeiger mit std::function deklarieren. Praktischer Fall: Optimieren Sie Rückrufe bei der GUI-Ereignisverarbeitung, vermeiden Sie die Erstellung unnötiger Objekte oder Funktionszeiger und verbessern Sie die Einfachheit und Wartbarkeit des Codes.
