


Ein einfaches Beispiel für die Instanzimplementierung in ThinkPhp5
Dieser Artikel stellt hauptsächlich die einfache Implementierung der thinkphp5-Instanz vor, die einen gewissen Referenzwert hat.
Ich habe kürzlich ThinkPHP5 studiert und zum ersten Mal die Methode TestClass: :instance() gesehen kann eine TestClass-Instanz erstellen. Ich war sehr neugierig und habe den Quellcode von ThinkPHP durchgesehen und seine Designideen verstanden.
Alte Regel, gehen Sie direkt zum Code:
<?php class TestClass { public static function instance() { return new self(); } public $data = []; public function __set($name, $val) { return $this->data[$name] = $val; } public function __get($name) { return $this->data[$name]; } } $app1 = TestClass::instance(); $app1->key = 'Application 1'; echo $app1->key . '<br />'; ?>
Um den Aufruf zu erleichtern, habe ich auch ThinkPHP nachgeahmt und eine Hilfsfunktion geschrieben
<?php function app() { return TestClass::instance(); } $app2 = app(); $app2->key = 'Application 2'; echo $app2->key . '<br />'; ?>
In Auf diese Weise wird die Instanz einfach implementiert.
Es gibt jedoch ein kleines Problem bei dieser Methode. Wenn Sie es 100 Mal aufrufen, müssen Sie 100 Instanzen erstellen.
Fügen Sie der Testklasse ein statisches Attribut hinzu und speichern Sie die erstellte Instanz hier. Wenn Sie es das nächste Mal aufrufen müssen, rufen Sie diese Instanz direkt auf.
<?php class TestClass { public static $instance; //用于缓存实例 public $data = []; public static function instance() { //如果不存在实例,则返回实例 if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; } public function __set($name, $val) { return $this->data[$name] = $val; } public function __get($name) { return $this->data[$name]; } } function app($option = []) { return TestClass::instance($option); } header('content-type:text/plain'); $result = []; $app1 = app(); $app1->key = "Application 1"; //修改 key 为 Application 1 $result['app1'] = [ 'app1' => $app1->key, //实例中 key 为 Application 1 ]; // 创建 app2,因为 instance 已经存在实例,直接返回 缓存的实例 $app2 = app(); $result['app2'] = [ 'setp1' => [ 'app1' => $app1->key, // Application 1 'app2' => $app2->key, //因为直接调用的实例的缓存,所以 key 也是 Application 1 ], ]; // 无论 app1,app2 都对在内存中 对应的同一个实例,无论通过谁修改,都能改变值 $app1->key = "Application 2"; $result['app2']['setp2'] = [ 'app1' => $app1->key, // Application 2 'app2' => $app2->key, // Application 2 ]; print_r($result); ?>
Durch das obige Experiment können Sie sehen, dass unabhängig von der Häufigkeit des Aufrufs dieselbe Instanz verwendet wird. Dies löst das Problem der geringen Effizienz.
Bisher erfüllt es grundsätzlich die meisten Situationen. Der einzige kleine Fehler besteht darin, dass die Anfangsparameter der Instanzen unterschiedlich sein können, was einen flexiblen Aufruf unmöglich macht (ein häufiges Beispiel ist, dass dasselbe Programm zwei Datenbanken aufruft). ). Dies kann durch eine leichte Modifikation des obigen Beispiels gelöst werden, indem die eingehenden Parameter als Schlüssel verwendet und die unvernünftigen Instanzen in einem Array zwischengespeichert werden.
<?php class TestClass { public static $instance = []; //用于缓存实例数组 public $data = []; public function __construct($opt = []) { $this->data = $opt; } public static function instance($option = []) { // 根据传入的参数 通过 serialize 转换为字符串,md5 后 作为数组的 key $instance_id = md5(serialize($option)); //如果 不存在实例,则创建 if (empty(self::$instance[$instance_id])) { self::$instance[$instance_id] = new self($option); } return self::$instance[$instance_id]; } public function __set($name, $val) { return $this->data[$name] = $val; } public function __get($name) { return $this->data[$name]; } } function app($option = []) { return TestClass::instance($option); } header('content-type:text/plain'); $result = []; //传入 初始数据 $app1 = app(['key' => '123']); $result['init'] = $app1->key; // 使用 传入的数据,即:123 $app1->key = "app1"; $result['app'] = $app1->key; // 现在值改为了 自定义的 app1了 print_r($result); $result = []; // 创建 app2,注意 初始参数不一样 $app2 = app(); // 因为初始参数不一样,所以还是创建新的实例 $app2->key = "app2"; $result['app1'] = $app1->key; // app1 $result['app2'] = $app2->key; // app2 print_r($result); $result = []; // 创建 app3,传入的参数 和 app1 一样,所以会直接返回 和app1相同 的 实例 $app3 = app(['key' => '123']); $result['log'] = [ 'app1' => $app1->key, // app1 'app2' => $app2->key, // app2 'app3' => $app3->key, // app1 ]; // 设置 app3 的key,会自动修改 app1 的值,因为他们两个是同一个实例 $app3->key = 'app3'; $result['app3_set'] = [ 'app1' => $app1->key, // app3 'app2' => $app2->key, // app2 'app3' => $app3->key, // app3 ]; // 同理,设置 app1 的key,app3 的 key 也会修改 $app1->key = 'app1'; $result['app1_set'] = [ 'app1' => $app1->key, // app1 'app2' => $app2->key, // app2 'app3' => $app3->key, // app1 ]; print_r($result); ?>
Das obige ist der detaillierte Inhalt vonEin einfaches Beispiel für die Instanzimplementierung in ThinkPhp5. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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



PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

Die Anmeldung bei CakePHP ist eine sehr einfache Aufgabe. Sie müssen nur eine Funktion verwenden. Sie können Fehler, Ausnahmen, Benutzeraktivitäten und von Benutzern durchgeführte Aktionen für jeden Hintergrundprozess wie Cronjob protokollieren. Das Protokollieren von Daten in CakePHP ist einfach. Die Funktion log() wird bereitgestellt

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP ist ein Open-Source-MVC-Framework. Es erleichtert die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich. CakePHP verfügt über eine Reihe von Bibliotheken, um die Überlastung der häufigsten Aufgaben zu reduzieren.
