开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
forked from 后盾人/v2015
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
video
/
webApp
/
admin
/
hdphp
/
kernel
/
Container.php
video
/
webApp
/
admin
/
hdphp
/
kernel
/
Container.php
Container.php 5.40 KB
一键复制 编辑 原始数据 按行查看 历史
后盾人 提交于 2017年05月02日 15:00 +08:00 . no message
<?php
/** .-------------------------------------------------------------------
* | Software: [HDCMS framework]
* | Site: www.hdcms.com
* |-------------------------------------------------------------------
* | Author: 向军 <2300071698@qq.com>
* | WeChat: aihoudun
* | Copyright (c) 2012-2019, www.houdunwang.com. All Rights Reserved.
* '-------------------------------------------------------------------*/
namespace hdphp\kernel;
use Closure;
use ArrayAccess;
use Exception;
use ReflectionClass;
class Container implements ArrayAccess {
//绑定实例
public $bindings = [ ];
//单例服务
public $instances = [ ];
/**
* 服务绑定到容器
*
* @param $name 服务名
* @param $closure 返回服务对象的闭包函数
* @param bool $force 是否单例
*/
public function bind( $name, $closure, $force = FALSE ) {
$this->bindings[ $name ] = compact( 'closure', 'force' );
}
/**
* 注册单例服务
*
* @param $name 服务
* @param $closure 闭包函数
*/
public function single( $name, $closure ) {
$this->bind( $name, $closure, TRUE );
}
/**
* 单例服务
*
* @param $name 名称
* @param $object 对象
*/
public function instance( $name, $object ) {
$this->instances[ $name ] = $object;
}
/**
* 获取服务实例
*
* @param $name 服务名
* @param bool|false $force 单例
*
* @return Object
* @throws Exception
*/
public function make( $name, $force = FALSE ) {
if ( isset( $this->instances[ $name ] ) ) {
return $this->instances[ $name ];
}
//获得实现提供者
$closure = $this->getClosure( $name );
//获取实例
$object = $this->build( $closure );
//单例绑定
if ( isset( $this->bindings[ $name ]['force'] ) && $this->bindings[ $name ]['force'] || $force ) {
$this->instances[ $name ] = $object;
}
return $object;
}
/**
* 获得实例实现
*
* @param $name 创建实例方式:类名或闭包函数
*
* @return mixed
*/
private function getClosure( $name ) {
return isset( $this->bindings[ $name ] ) ? $this->bindings[ $name ]['closure'] : $name;
}
/**
* 生成服务实例
*
* @param $className 生成方式 类或闭包函数
*
* @return object
* @throws Exception
*/
protected function build( $className ) {
//匿名函数
if ( $className instanceof Closure ) {
//执行闭包函数
return $className( $this );
}
//获取类信息
$reflector = new ReflectionClass( $className );
// 检查类是否可实例化, 排除抽象类abstract和对象接口interface
if ( ! $reflector->isInstantiable() ) {
throw new Exception( "$className 不能实例化." );
}
//获取类的构造函数
$constructor = $reflector->getConstructor();
//若无构造函数,直接实例化并返回
if ( is_null( $constructor ) ) {
return new $className;
}
//取构造函数参数,通过 ReflectionParameter 数组返回参数列表
$parameters = $constructor->getParameters();
//递归解析构造函数的参数
$dependencies = $this->getDependencies( $parameters );
//创建一个类的新实例,给出的参数将传递到类的构造函数。
return $reflector->newInstanceArgs( $dependencies );
}
/**
* 递归解析构造函数的参数
*
* @param $parameters
*
* @return array
* @throws Exception
*/
protected function getDependencies( $parameters ) {
$dependencies = [ ];
//参数列表
foreach ( $parameters as $parameter ) {
//获取参数类型
$dependency = $parameter->getClass();
if ( is_null( $dependency ) ) {
// 是变量,有默认值则设置默认值
$dependencies[] = $this->resolveNonClass( $parameter );
} else {
// 是一个类,递归解析
$dependencies[] = $this->build( $dependency->name );
}
}
return $dependencies;
}
/**
* 提取参数默认值
*
* @param $parameter
*
* @return mixed
* @throws Exception
*/
protected function resolveNonClass( $parameter ) {
// 有默认值则返回默认值
if ( $parameter->isDefaultValueAvailable() ) {
return $parameter->getDefaultValue();
}
throw new Exception( '参数无默认值,无法实例化' );
}
public function offsetExists( $key ) {
return isset( $this->bindings[ $key ] );
}
public function offsetGet( $key ) {
return $this->make( $key );
}
public function offsetSet( $key, $value ) {
if ( ! $value instanceof Closure ) {
$value = function () use ( $value ) {
return $value;
};
}
$this->bind( $key, $value );
}
public function offsetUnset( $key ) {
unset( $this->bindings[ $key ], $this->instances[ $key ] );
}
public function __get( $key ) {
return $this[ $key ];
}
public function __set( $key, $value ) {
$this[ $key ] = $value;
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

后盾人视频教程代码,收到 Star 我们会更有动力。
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
PHP
1
https://gitee.com/itcode-itcode/video.git
git@gitee.com:itcode-itcode/video.git
itcode-itcode
video
video
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /