ホームページ >PHPフレームワーク >ThinkPHP >thinkphp5 インスタンスを実装するだけです。

thinkphp5 インスタンスを実装するだけです。

藏色散人
藏色散人転載
2021-03-15 17:46:572424ブラウズ

次のチュートリアルコラムでは、thinkphp5 インスタンスの簡単な実装方法を紹介しますので、困っている方の参考になれば幸いです。

thinkphp5 インスタンスの簡単な実装thinkphp5 インスタンスを実装するだけです。

もう一度車を一から作ります (昨日の車作り: angularjs の配列パラメータ受け渡しメソッドの簡単な実装 http://www.miaoqiyuan.cn/p/an...) の実装について話しましょう。この記事(thinkphp5インスタンスの簡易実装)はオリジナル記事です、オリジナルアドレスは http://www.miaoqiyuan.cn/p/ph.... 転載の際は出典を明記してください。

古いルール、コードに直接アクセスします:

<?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 サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。