この記事では主に thinkphp5 インスタンスの簡単な実装を紹介します。興味のある方は参考にしてください。
最近 ThinkPHP5 を勉強して、TestClass インスタンスを作成する TestClass::instance() メソッドを初めて見ました。 。非常に興味を持って ThinkPHP のソースコードを調べたところ、その設計思想は非常に高度なものであることがわかりました。
古いルール、コードに直接アクセスします:
<?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 />'; ?>
呼び出しを容易にするために、私も ThinkPHP を真似てヘルパー関数を書きました
<?php function app() { return TestClass::instance(); } $app2 = app(); $app2->key = 'Application 2'; echo $app2->key . '<br />'; ?>
このようにして、インスタンスは単純に実装されます。
ただし、この方法には小さな問題があります。次のことを想像してください。100 回呼び出すと、100 個のインスタンスを作成する必要があります。
Test クラスに静的属性を追加し、作成したインスタンスをここに保存します。次回呼び出す必要がある場合は、このインスタンスを直接呼び出してください。
<?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); ?>
上記の実験を通して、何度呼び出しても同じインスタンスが使用されることがわかります。これにより、効率が低いという問題が解決されます。
これまでのところ、基本的にほとんどの状況に対応しています。唯一の小さな欠点は、インスタンスの初期パラメータが異なる可能性があるため、柔軟に呼び出すことができないことです (通常、同じプログラムが 2 つのデータベースを呼び出します)。これは、上記の例を少し変更して、受信パラメータをキーとして使用し、不当なインスタンスを配列にキャッシュすることで解決できます。
りー以上がThinkPhp5 でのインスタンス実装の簡単な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。