class Person { /** * 依赖: Person依赖于Car/House * 注入: Car/House注入到Person * @param obj){ return $obj->pay(); } }
namespace script;
class Car{ public function pay(){ return 1; } }
namespace script;
class House{ public function pay(){ return 2; } }
// 当对象注入, 并调用对象的方法 house = new House(); Person::buy(house);
###### 4. 反射机制
1. 利用反射机制可以实例化类以及使用和访问类方法, 属性, 参数和注释等
/** * 初步认识反射机制 * Class A * @package script */ namespace script;
class A { public b = 2; public static a * @param a, b){ return 'a: '.a .'_b: ' . $b; }
/\*\*
* type * @param int type = 1){ return 'cd: '. $type; } }
obj = new \ReflectionClass(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" } }
*/ obj->getMethods(); // 获取这个类的所有方法 foreach (method){ method->getDocComment(); // 获取每个方法的注释 } obj->getProperties(); // 获取该类中的所有属性, 公共/私有/静态
// 调用该类中的方法 method = method->invokeArgs(method = method->invoke($instance);
// 创建A的反射类, 并使用A类中的方法 a, 'ab'); objMethod->isStatic(); //判断是否静态方法 objMethod->getNumberOfParameters(); //获取该方法的参数个数
###### 5. 工厂模式
namespace script; /** * 定义一个接口 * 发送短信接口, 固定方法和参数 * Interface Sms * @package script\sms */ interface Sms { public static function send(code); }
namespace script; /** * 去实现Sms的方法 * 阿里短信服务 * Class Ali * @package script\sms */ class Ali implements Sms { public static function send(code){ // return 'Ali-Sms'; } }
namespace script;
/** * 去实现Sms的方法 * 七牛短信服务 * Class Qiniu * @package script\sms */ class Qiniu implements Sms { public static function send(code) { // TODO: Implement send() method. return 'Qiniu-Sms'; } }
namespace script;
/** * 去实现Sms的方法 * 百度短信服务 * Class Baidu * @package script\sms */ class Baidu implements Sms { public static function send(code) { // TODO: Implement send() method. return 'Baidu-Sms'; } }
include 'Sms.php'; type.'.php'; type; echo phone,$code);
###### 6. 容器
namespace script; /** * 容器理解 * Class Container * @package script */ class Container { /** * 容器中的对象实例 * @var null */ protected static objects = [];
private function \_\_construct()
{
}
/\*\*
* 获取当前容器的实例 * 单例模式 * @return null|Container */ public static function getInstance(){ if (is_null(self::instance)){ self::instance = new self(); }
return self::$instance;
}
/\*\*
* 设置当前容器的数据 * 挂载到注册树 * @param value */ public function set(value){ key] = $value; }
/\*\*
* 获取当前容器的数据 * 从注册树中直接获取 * 反射机制 * @param 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->buy());
namespace script;
/** * 初步认识 * Class Person * @package app\common\lib */ class Person { public name;
/\*\*
* 默认Car类 * Person constructor. * @param Car name */ public function __construct(Car name = 'nobody') { object; name; }
/\*\*
* @return string */ public function buy(){ return this->obj->pay(); } }



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**