Thinkphp源码阅读笔记(一)

app container 容器和依赖注入类
facde 注册门面方法 可以静态调用他们内部的普通方法。
validate 验证类 写入验证规则和提示,可动态添加和删除 定制场景的 穿入数组 验证类。
Middleware 切面类。 定义中间件类 handle 方法 注册到controller ,会被自动执行。 类似于监听者模式。
ob 缓冲
Route 路由类。

所有从容器出来的对象都为单例 对其中一个修改 在其他调用的时候也生效


         'default_namespace' => 'app\\http\\middleware\\',
     // 加载中间件
            if (is_file($path . 'middleware.php')) {
                $middleware = include $path . 'middleware.php';
                if (is_array($middleware)) {
                    $this->middleware->import($middleware);
                }
            }
	$middleware='app\\http\\middleware\\'$this->queue[$type][] =  [[$this->app->make($middleware), 'handle'], isset($param) ? $param : null]; 


 
        $this->middleware->add(function (Request $request, $next) use ($dispatch, $data) {
            return is_null($data) ? $dispatch->run() : $data;
        });


方法里不要只看最后一个return
中间可能也会return 了 。就不往下执行了。

匿名函数 闭包函数 若在 类的方法里定义 会多一个this的属性。闭包内可用$this . use的参数 定义成 static 传入的参数 为parameter

php think make:valiate api/test/user
php think make:valiate index/User

解析ur 若符合设置的路由解析,new 配置的地址 。 负责通过普通的controller new。

route.php

调用方法 注册路由


 Route::get('think', function () {
    return 'hello,ThinkPHP5!';
});
Route::get('hello/:name', 'index/hello')->model();

绑定的模型可以直接在控制器的架构方法或者操作方法中自动注入,具体可以参考请求章节的依赖注入。

批量注册路由 import
return [];

Db 返回数组
mode 返回之前 转换成model对象

 public function __debugInfo()
    {
        $data = get_object_vars($this);
        unset($data['app']);

        return $data;
    }

get_class_methods($class);//获取类方法
get_object_vars($obj);// 获取对象属性
get_class_vars($class); //获取类属性

   dump(get_declared_classes());
  dump(get_declared_interfaces());

  get_defined_functions();// 获取定义的方法系统和用户
  get_defined_constants();


            dump(get_declared_classes());
            dump(get_declared_interfaces());
            dump(get_defined_functions());
            define("MY_CONSTANT", 1);
            dump(get_defined_constants(true));
            die;
	public function add(){
         dump(get_defined_constants(true));
		dump(get_class_methods(App::class));
		dump(get_class_methods(OrderAdvSchedule::class));
		dump(get_object_vars($this));//获取对象属性
		  echo $this->app->getAppPath();//获取继承对象
		  dump($this->app->env->get('THINK_PATH'));//获取注入对象
		die;
	}

  dump(get_declared_traits());die; 
think\facade\Debug
	   Debug::remark('begin');
// ...其他代码段
Debug::remark('end');
// ...也许这里还有其他代码
// 进行统计区间
echo Debug::getRangeTime('begin','end').'s';

Facade功能可以让类无需实例化而直接进行静态方式调用。

容器里边都为单例对象

依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于URL请求, 普通变量就是通过参数绑定自动获取, 对象变量则是通过依赖注入生成。

依赖注入的对象参数支持多个,并且和顺序无关。

支持使用依赖注入的场景包括(但不限于):

控制器构造方法;
控制器操作方法;
数据库和模型事件方法;
路由的闭包定义;
行为类的方法;

依赖注入


public function add(AuditUser $app){
        echo $app->getName(); die;
        dump( get_class_methods(App::class));
        die;
        bind('app\common\Test');
        bind('think\LoggerInterface','think\Log');
        // 绑定类闭包
        bind('sayHello', function ($name) {
            return 'hello,' . $name;
        });
        echo app('sayHello',['thinkphp']);

        $cache = new think\Cache;
// 绑定类实例
        bind('cache',$cache);
// 快速调用类的实例
        $cache = app('cache');

        echo $app1->getName(); die;

}
// 绑定类库标识
bind('cache','think\Cache');
// 快速调用(自动实例化)
$cache = app('cache');

容器中已经调用过的类会自动使用单例,除非你使用下面的方式强制重新实例化。

ob 输出缓冲函数
当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。输出控制函数不影响由 header() 或 setcookie()发送的文件头信息,仅影响象 echo这样的函数和PHP代码块间的数据。

一般用法

ob_start(); //启用缓冲
echo '';
include 'xx.html'; //写入
$a=ob_get_clean(); // 取出
 
echo $a; // 输出

return 只是返回 并不是输出。
输出只有echo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值