Heim  >  Artikel  >  Backend-Entwicklung  >  Vertiefte Kenntnisse der statischen und Ertragsschlüsselwörter in PHP

Vertiefte Kenntnisse der statischen und Ertragsschlüsselwörter in PHP

黄舟
黄舟Original
2017-09-19 09:27:381830Durchsuche

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zu den Static- und Yield-Schlüsselwörtern in PHP ein. Der Artikel stellt sie ausführlich anhand von Beispielcodes vor. Er bietet einen gewissen Referenz-Lernwert für alle, die dies benötigen Artikel Lassen Sie uns mit dem Herausgeber unten lernen.

Vorwort

Dieser Artikel stellt hauptsächlich den relevanten Inhalt zu den Static- und Yield-Schlüsselwörtern in PHP vor und stellt ihn als Referenz und zum Studium zur Verfügung. Im Folgenden gibt es nicht viel zu sagen. Werfen wir einen Blick auf die ausführliche Einführung.

Lassen Sie uns zunächst über das statische Schlüsselwort sprechen. In diesem Artikel geht es nur um die Verwendung statischer Methoden und die späte Bindung.

statisch Wann wird es zum Ändern von Methoden verwendet?

statisches Schlüsselwort wird bekanntermaßen zum Ändern von Methoden und Attributen verwendet. In welchen Szenarien nutzen Sie es also in Ihren Projekten?

Ich bin auf mehrere Projekte gestoßen, bei denen alle Methoden statisch sein müssen. Controller-Methoden können dies natürlich nicht. Einer der Gründe ist: Ist die Effizienz der statischen Methodenausführung hoch? Lassen Sie es uns also auf dieser Grundlage analysieren.

Zunächst einmal habe ich nichts gegen die hohe Ausführungseffizienz einzuwenden. Liegt es an der hohen Effizienz, dass es uneingeschränkt in Projekten eingesetzt werden sollte? Um dieses Problem zu diskutieren, werfen wir zunächst einen Blick auf die Geschichte der Programmiersprachen. In den Anfängen gab es keine objektorientierte Programmierung, und zu dieser Zeit waren im Grunde alle Methoden statische Methoden. Dann entstand die objektorientierte Programmierung und das Konzept der Instanziierung.

Wie aus dem obigen kurzen Entwicklungsprozess ersichtlich ist, scheint es keine Notwendigkeit für eine objektorientierte Existenz zu geben, wenn es nur um die Leistung geht. Was denken diese Meister also über die Einführung von Objektorientierung und Instanziierung in Sprachen wie C++ und Java? Ich denke, das liegt daran, dass die Projekte mit der Entwicklung immer größer werden und eine bessere Organisation des Codes und Programmierdenkens erfordern.

Rückblickend ist die statische Methode, die sie definiert, wirklich effizient, belegt aber weiterhin Speicher. Der Lebenszyklus endet erst, wenn das Programm beendet wird, und einer der Nebenwirkungen ist, dass dies nicht der Fall sein kann Zweitens gibt es aus Sicht des Entwurfsmodus eine starke Kopplung, und drittens gibt es keine Möglichkeit, die durch static definierte Methode zu überschreiben, und Konzepte wie ioc di sind vorhanden nutzlos; viertens verursachen statische Methoden den Menschen Kopfschmerzen.

Auf der Grundlage des oben Gesagten bin ich der Meinung, dass es in Zukunft besser ist, keine statischen Methoden zu verwenden, sondern Methoden ehrlich zu instanziieren und aufzurufen? Wir müssen rational sein, und wir können nicht so extrem sein, dass wir es überall verwenden, und wir können es auch überhaupt nicht verwenden. Fazit: Lernen Sie, objektorientiert zu denken. Ich denke, die ersten Überlegungen beim Schreiben von Code sind: Skalierbarkeit (um schnelle Geschäftsänderungen bewältigen zu können) und Wartbarkeit (um Online-Probleme zeitnah zu beheben). Die hohe Effizienz sollte zuletzt berücksichtigt werden (da es so viele Möglichkeiten gibt, die Effizienz zu optimieren, ist es nicht notwendig, zu jeder Methode „statisch“ hinzuzufügen). Wenn diese Methode aus objektorientierter Sicht völlig unabhängig ist und nichts mit Klassenattributen zu tun hat, verwenden Sie statisch.

Kurz gesagt betrachten wir die Verwendung der Syntax aus einer objektorientierten Perspektive und auf der Ebene des Softwaredesigns, anstatt die Schönheit des Codes aus Gründen der Effizienz zu zerstören.

statische späte statische Bindung

Dies ist ausführlich in der PHP-Dokumentation beschrieben, aber ich habe bisher selten darauf geachtet . Dieser Ort verwendet grundsätzlich self:: um statische Methoden und Eigenschaften aufzurufen.

Ich denke, dass die späte Bindung in gewissem Maße einer Überladung statischer Methoden gleicht. Hier ist ein Beispiel aus dem PHP-Dokument, um es zu beschreiben:


<?php
class A {
 public static function who() {
 echo __CLASS__;
 }
 public static function test() {
 self::who();
 static::who();// 后期静态绑定
 }
}

class B extends A {
 public static function who() {
 echo __CLASS__;
 }
}

B::test();

Wenn es von self::who() aufgerufen wird, wird Folgendes ausgegeben: A. Wenn es static::who() ist, wird B

ausgegeben. Ist es aus dieser Sicht gleichbedeutend damit, dass Klasse B die who()-Methode der übergeordneten Klasse A überschreibt? Wenn Sie diese Funktion also flexibel nutzen, können Sie die Statik flexibler gestalten. Nutzen Sie die Leistungsvorteile voll aus und lösen Sie das Problem der schlechten Skalierbarkeit. Natürlich ist es immer noch dasselbe. Aus objektorientierter Sicht geschieht alles in Maßen.

Nutzungsszenarien von Yield in PHP

Um ehrlich zu sein, wusste ich lange nicht, dass PHP solche hat eine Syntax. Bis ich eines Tages auf dieses Schlüsselwort in js stieß, hatte ich das Gefühl, dass es so unklar ist. Warum ist es nicht in der besten Sprache der Welt verfügbar? Wenn ich mir die Dokumentation noch einmal ansehe, kann ich erkennen, dass es tatsächlich die beste Sprache der Welt ist.

Was sind also die Nutzungsszenarien von Yield? Erst kürzlich hat mich jemand auf SG gebeten, das Problem zu lösen. Ich hoffe, dass jeder es besser in Verbindung mit seinem eigenen Unternehmen nutzen kann. Es gibt keinen Vergleich zwischen yield und Iterator. Ich glaube, dass Sie nach der Lektüre verstehen werden, welcher der beiden kürzer ist.

先说它的使用场景,还是得先回顾历史,在没有 yield 之前,我们要生成一个数组,只能一次性把所有内容全部读入内存(当然也可以通过实现 Iterator接口实现一个迭代)。有了 yield 之后,我们可以通过一个简单的 yield 关键字,完成一个数组的生成,并且是用到的时候才会产生值,相对而言内存占用肯定会下降。空口无凭,咱们下面通过代码实际检验一下上面的结论。

先来看普通模式


<?php

function generateData($max)
{
 $arr = [];
 for ($i = 0; $i <= $max; $i++) {
 $arr[] = $i;
 }
}

echo &#39;开始前内存占用:&#39; . memory_get_usage() . PHP_EOL;
$data = generateData(100000);
echo &#39;生成完数组后内存占用:&#39; . memory_get_usage() . PHP_EOL;
unset($data);
echo &#39;释放后的内存占用:&#39; . memory_get_usage() . PHP_EOL;

运行得到结果:


开始前内存占用:231528
生成完数组后内存占用:231712
释放后的内存占用:231576

前后的差值是:184

使用yield后的效果


function generateData($max)
{
 for ($i = 0; $i <= $max; $i++) {
 yield $i;
 }
}

echo &#39;开始前内存占用:&#39; . memory_get_usage() . PHP_EOL;
$data = generateData(100000);// 这里实际上得到的是一个迭代器
echo &#39;生成完数组后内存占用:&#39; . memory_get_usage() . PHP_EOL;
unset($data);
echo &#39;释放后的内存占用:&#39; . memory_get_usage() . PHP_EOL;

运行结果:


开始前内存占用:228968
生成完数组后内存占用:229824
释放后的内存占用:229016

前后的差值是:856

奇怪,使用了 yield 后,内存占用反而上升了,这是什么鬼?别急。上面我们参数传入的是 1,000,00,我现在将传入参数改成改成 1,000,000试试。

第一个方法得到的结果是:


开始前内存占用:231528

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /test/yield.php on line 6

看了吧,一百万次的循环时,一次性载入内存,超出了限制。那么再来看 yield 的执行结果:


开始前内存占用:228968
生成完数组后内存占用:229824
释放后的内存占用:229016

前后的差值依然是:856

好了到这里,应该看出来了,yield无论数组大小,占用均是 856 ,这是因为它自身,它在你进行迭代的时候才会产生真实数据。

所以如果你的数据来源非常大,那么用 yield 吧。如果数据来源很小,当然选择一次载入内存。

总结

Das obige ist der detaillierte Inhalt vonVertiefte Kenntnisse der statischen und Ertragsschlüsselwörter in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn