>  기사  >  PHP 프레임워크  >  thinkphp5 인스턴스를 구현하기만 하면 됩니다!

thinkphp5 인스턴스를 구현하기만 하면 됩니다!

藏色散人
藏色散人앞으로
2021-03-15 17:46:572370검색

다음 튜토리얼 칼럼인 thinkphp에서는 thinkphp5 인스턴스의 간단한 구현 방법을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

thinkphp5 인스턴스를 구현하기만 하면 됩니다!

최근에 ThinkPHP5를 배웠는데, TestClass 인스턴스를 생성할 수 있는 메소드인 TestClass::instance()를 처음 보았습니다. 저는 매우 궁금했습니다. ThinkPHP의 소스 코드를 살펴보고 그 디자인 아이디어가 전반적으로 이해되었습니다.

처음부터 다시 자동차를 만듭니다(어제의 자동차 만들기: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);
?>

위의 실험을 통해 몇 번을 호출해도 동일한 인스턴스가 사용되는 것을 알 수 있습니다. 이는 낮은 효율성 문제를 해결합니다.

지금까지는 기본적으로 대부분의 상황을 충족합니다. 유일한 작은 결함은 인스턴스의 초기 매개변수가 다를 수 있어 유연하게 호출할 수 없다는 것입니다(일반적으로 동일한 프로그램이 두 개의 데이터베이스를 호출함). 이 문제는 위의 예제를 약간 수정하여 들어오는 매개변수를 키로 사용하고 불합리한 인스턴스를 배열에 캐시함으로써 해결할 수 있습니다.

rreee

위 내용은 thinkphp5 인스턴스를 구현하기만 하면 됩니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제