TP框架的一些知识_tp csdn,一次哔哩哔哩面试经历

25 阅读2分钟

class Person { /** * 依赖: Person依赖于Car/House * 注入: Car/House注入到Person * @param obj\*@returnmixed\*/publicstaticfunctionbuy(obj \* @return mixed \*/ public static function buy(obj){ return $obj->pay(); } }



namespace script;

class Car{ public function pay(){ return 1; } }



namespace script;

class House{ public function pay(){ return 2; } }



// 当对象注入, 并调用对象的方法 car=newCar();car = new Car(); house = new House(); Person::buy(car);Person::buy(car); Person::buy(house);


###### 4. 反射机制


1. 利用反射机制可以实例化类以及使用和访问类方法, 属性, 参数和注释等



/** * 初步认识反射机制 * Class A * @package script */ namespace script;

class A { public a=1;privatea = 1; private b = 2; public static instance=null;/\*\*\*A类的ab方法\*@paraminstance = null; /\*\* \* A类的ab方法 \* @param a * @param b\*@returnstring\*/publicfunctionab(b \* @return string \*/ public function ab(a, b){ return 'a: '.a .'_b: ' . $b; }

/\*\*

* type * @param int type\*@returnstring\*/publicfunctioncd(type \* @return string \*/ public function cd(type = 1){ return 'cd: '. $type; } }



a=newA();a = new A(); obj = new \ReflectionClass(a);//创建A的反射类a); //创建A的反射类 instance = obj->newInstance(); // 相当于实例化这个类 /\*\* \* array(2) { [0] => class ReflectionMethod#3 (2) { public name => string(2) "ab" public class => string(1) "A" } [1] => class ReflectionMethod#4 (2) { public name => string(2) "cd" public $class => string(1) "A" } }

*/ methods=methods = obj->getMethods(); // 获取这个类的所有方法 foreach (methodsasmethods as method){ method->getDocComment(); // 获取每个方法的注释 } obj->getProperties(); // 获取该类中的所有属性, 公共/私有/静态

// 调用该类中的方法 instance>ab(123,456);//或者instance->ab('123', '456'); // 或者 method = obj>getMethod(ab);//获取要调用的方法obj->getMethod('ab'); // 获取要调用的方法 method->invokeArgs(instance,[111,222]);//调用带参数的方法,传入对象和参数//调用不带参数的方法instance, ['111', '222']); // 调用带参数的方法, 传入对象和参数 // 调用不带参数的方法 method = obj>getMethod(cd);obj->getMethod('cd'); method->invoke($instance);

// 创建A的反射类, 并使用A类中的方法 objMethod=new\ReflectionMethod(objMethod = new \ReflectionMethod(a, 'ab'); objMethod>isPublic();//判断某个方法是不是公共的objMethod->isPublic(); // 判断某个方法是不是公共的 objMethod->isStatic(); //判断是否静态方法 objMethod>getParameters();//获取该方法的参数objMethod->getParameters(); // 获取该方法的参数 objMethod->getNumberOfParameters(); //获取该方法的参数个数


###### 5. 工厂模式



namespace script; /** * 定义一个接口 * 发送短信接口, 固定方法和参数 * Interface Sms * @package script\sms */ interface Sms { public static function send(phone,phone, code); }



namespace script; /** * 去实现Sms的方法 * 阿里短信服务 * Class Ali * @package script\sms */ class Ali implements Sms { public static function send(phone,phone, code){ // return 'Ali-Sms'; } }



namespace script;

/** * 去实现Sms的方法 * 七牛短信服务 * Class Qiniu * @package script\sms */ class Qiniu implements Sms { public static function send(phone,phone, code) { // TODO: Implement send() method. return 'Qiniu-Sms'; } }



namespace script;

/** * 去实现Sms的方法 * 百度短信服务 * Class Baidu * @package script\sms */ class Baidu implements Sms { public static function send(phone,phone, code) { // TODO: Implement send() method. return 'Baidu-Sms'; } }



include 'Sms.php'; type=Ali;includetype = 'Ali'; include type.'.php'; class="script".class = "script\\".type; echo class::send(class::send(phone,$code);


###### 6. 容器



namespace script; /** * 容器理解 * Class Container * @package script */ class Container { /** * 容器中的对象实例 * @var null */ protected static instance=null;/\*\*\*存放容器的数据(注册树)\*@vararray\*/publicinstance = null; /\*\* \* 存放容器的数据 (注册树) \* @var array \*/ public objects = [];

private function \_\_construct()
{

}

/\*\*

* 获取当前容器的实例 * 单例模式 * @return null|Container */ public static function getInstance(){ if (is_null(self::instance)){ self::instance = new self(); }

    return self::$instance;
}

/\*\*

* 设置当前容器的数据 * 挂载到注册树 * @param key\*@paramkey \* @param value */ public function set(key,key, value){ this>objects[this->objects[key] = $value; }

/\*\*

* 获取当前容器的数据 * 从注册树中直接获取 * 反射机制 * @param key\*@returnmixed\*/publicfunctionget(key \* @return mixed \*/ public function get(key){

    if ($this->objects[$key]) $key = $this->objects[$key];

    $reflect = new \ReflectionClass($key); // 创建该类的反射类
    // 获取类的构造函数
    $construct = $reflect->getConstructor();
    if (!$construct){
        // 不存在构造函数
        return new $key;
    }

    // 获取构造函数的参数
    $params = $construct->getParameters();
    if (!$params) return new $key;

    $args = [];
    foreach ($params as $param){
        $class = $param->getClass();
        if ($class) {
            $args[] = $this->get($class->name);
        }
    }

    return $reflect->newInstanceArgs($args);

}

}

// 注入容器 Container::getInstance()->set('person', 'script\Person'); Container::getInstance()->set('car', 'script\Car'); // 获取

obj=Container::getInstance()>get(person);var_dump(obj = Container::getInstance()->get('person'); var\_dump(obj->buy());



namespace script;

/** * 初步认识 * Class Person * @package app\common\lib */ class Person { public obj;publicobj; public name;

/\*\*

* 默认Car类 * Person constructor. * @param Car object\*@paramstringobject \* @param string name */ public function __construct(Car object,object, name = 'nobody') { this>obj=this->obj = object; this>name=this->name = name; }

/\*\*

* @return string */ public function buy(){ return this>name..this->name . '|' . this->obj->pay(); } }



![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ebc8cb36061b4113908ad5ec025eb7b3~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252567&x-signature=enqPAyX5Q%2FY6ITxAfUbis3tLDDc%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e97c68c029a6489690ecec756e754c72~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252567&x-signature=LBiAwF1kNWVvL2MXteGwP0xdBKI%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/3be0c74c21924ebaae9fb95903fa9987~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252567&x-signature=sAhkMIuvdW7Qv810RONv%2FplmQ4o%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**