古いルール、コードに直接アクセスします:
<?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 つのデータベースを呼び出します)。これは、上記の例を少し変更して、受信パラメータをキーとして使用し、不当なインスタンスを配列にキャッシュすることで解決できます。
えええええ