Passed
Push — 5.2 ( 14f2ed...c4c2c8 )
by liu
02:25
created

Base::getBeginMem()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
// +----------------------------------------------------------------------
1 ignored issue
show
Coding Style introduced by
You must use "/**" style comments for a file comment
Loading history...
3
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
4
// +----------------------------------------------------------------------
5
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
6
// +----------------------------------------------------------------------
7
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
8
// +----------------------------------------------------------------------
9
// | Author: liu21st <[email protected]>
10
// +----------------------------------------------------------------------
11
declare (strict_types = 1);
12
13
namespace think;
14
15
use Opis\Closure\SerializableClosure;
16
use think\exception\ClassNotFoundException;
17
use think\exception\HttpException;
18
19
/**
20
 * App 应用管理
21
 * @property Route $route
22
 * @property Config $config
23
 * @property Cache $cache
24
 * @property Request $request
25
 * @property Env $env
26
 * @property Debug $debug
27
 * @property Event $event
28
 * @property Middleware $middleware
29
 * @property Log $log
30
 * @property Lang $lang
31
 * @property Db $db
32
 * @property Cookie $cookie
33
 * @property Session $session
34
 * @property Url $url
35
 * @property Validate $validate
36
 * @property Build $build
37
 * @property \think\route\RuleName $rule_name
38
 */
5 ignored issues
show
Coding Style introduced by
Missing @category tag in class comment
Loading history...
Coding Style introduced by
Missing @package tag in class comment
Loading history...
Coding Style introduced by
Missing @author tag in class comment
Loading history...
Coding Style introduced by
Missing @license tag in class comment
Loading history...
Coding Style introduced by
Missing @link tag in class comment
Loading history...
39
abstract class Base extends Container
40
{
41
    /**
42
     * 应用名称
43
     * @var string
44
     */
45
    protected $name;
46
47
    /**
48
     * 应用调试模式
49
     * @var bool
50
     */
51
    protected $appDebug = true;
52
53
    /**
54
     * 是否多应用模式
55
     * @var bool
56
     */
57
    protected $multi = false;
58
59
    /**
60
     * 是否自动多应用
61
     * @var bool
62
     */
63
    protected $auto = false;
64
65
    /**
66
     * 应用映射
67
     * @var array
68
     */
69
    protected $map = [];
70
71
    /**
72
     * 应用开始时间
73
     * @var float
74
     */
75
    protected $beginTime;
76
77
    /**
78
     * 应用内存初始占用
79
     * @var integer
80
     */
81
    protected $beginMem;
82
83
    /**
84
     * 应用类库顶级命名空间
85
     * @var string
86
     */
87
    protected $rootNamespace = 'app';
88
89
    /**
90
     * 当前应用类库命名空间
91
     * @var string
92
     */
93
    protected $namespace = '';
94
95
    /**
96
     * 应用根目录
97
     * @var string
98
     */
99
    protected $rootPath = '';
100
101
    /**
102
     * 框架目录
103
     * @var string
104
     */
105
    protected $thinkPath = '';
106
107
    /**
108
     * 应用基础目录
109
     * @var string
110
     */
111
    protected $basePath = '';
112
113
    /**
114
     * 应用类库目录
115
     * @var string
116
     */
117
    protected $appPath = '';
118
119
    /**
120
     * 运行时目录
121
     * @var string
122
     */
123
    protected $runtimePath = '';
124
125
    /**
126
     * 配置目录
127
     * @var string
128
     */
129
    protected $configPath = '';
130
131
    /**
132
     * 路由目录
133
     * @var string
134
     */
135
    protected $routePath = '';
136
137
    /**
138
     * URL
139
     * @var string
140
     */
141
    protected $urlPath = '';
142
143
    /**
144
     * 配置后缀
145
     * @var string
146
     */
147
    protected $configExt = '.php';
148
149
    /**
150
     * 是否需要事件响应
151
     * @var bool
152
     */
153
    protected $withEvent = true;
154
155
    /**
156
     * 设置是否使用事件机制
157
     * @access public
158
     * @param  bool $event
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
159
     * @return $this
160
     */
161
    public function withEvent(bool $event)
162
    {
163
        $this->withEvent = $event;
164
        return $this;
165
    }
166
167
    /**
168
     * 设置应用路径
169
     * @access public
170
     * @param  string $path 应用目录
171
     * @return $this
172
     */
173
    public function path(string $path)
174
    {
175
        $this->appPath = $path;
176
        return $this;
177
    }
178
179
    /**
180
     * 开启应用调试模式
181
     * @access public
182
     * @param  bool $debug 开启应用调试模式
183
     * @return $this
184
     */
185
    public function debug(bool $debug = true)
186
    {
187
        $this->appDebug = $debug;
188
        return $this;
189
    }
190
191
    /**
192
     * 是否为调试模式
193
     * @access public
194
     * @return bool
195
     */
196
    public function isDebug(): bool
197
    {
198
        return $this->appDebug;
199
    }
200
201
    /**
202
     * 设置应用名称
203
     * @access public
204
     * @param  string $name 应用名称
205
     * @return $this
206
     */
207
    public function name(string $name)
208
    {
209
        $this->name = $name;
210
        return $this;
211
    }
212
213
    /**
214
     * 设置应用命名空间
215
     * @access public
216
     * @param  string $namespace 应用命名空间
217
     * @return $this
218
     */
219
    public function setNamespace(string $namespace)
220
    {
221
        $this->namespace = $namespace;
222
        return $this;
223
    }
224
225
    /**
226
     * 设置应用根命名空间
227
     * @access public
228
     * @param  string $rootNamespace 应用命名空间
229
     * @return $this
230
     */
231
    public function setRootNamespace(string $rootNamespace)
232
    {
233
        $this->rootNamespace = $rootNamespace;
234
        return $this;
235
    }
236
237
    /**
238
     * 获取框架版本
239
     * @access public
240
     * @return string
241
     */
242
    public function version(): string
243
    {
244
        return static::VERSION;
0 ignored issues
show
Bug introduced by
The constant think\Base::VERSION was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
245
    }
246
247
    /**
248
     * 获取应用名称
249
     * @access public
250
     * @return string
251
     */
252
    public function getName(): string
253
    {
254
        return $this->name ?: '';
255
    }
256
257
    /**
258
     * 获取应用根目录
259
     * @access public
260
     * @return string
261
     */
262
    public function getRootPath(): string
263
    {
264
        return $this->rootPath;
265
    }
266
267
    /**
268
     * 获取应用基础目录
269
     * @access public
270
     * @return string
271
     */
272
    public function getBasePath(): string
273
    {
274
        return $this->basePath;
275
    }
276
277
    /**
278
     * 获取当前应用目录
279
     * @access public
280
     * @return string
281
     */
282
    public function getAppPath(): string
283
    {
284
        return $this->appPath;
285
    }
286
287
    /**
288
     * 获取应用运行时目录
289
     * @access public
290
     * @return string
291
     */
292
    public function getRuntimePath(): string
293
    {
294
        return $this->runtimePath;
295
    }
296
297
    /**
298
     * 获取核心框架目录
299
     * @access public
300
     * @return string
301
     */
302
    public function getThinkPath(): string
303
    {
304
        return $this->thinkPath;
305
    }
306
307
    /**
308
     * 获取路由目录
309
     * @access public
310
     * @return string
311
     */
312
    public function getRoutePath(): string
313
    {
314
        return $this->routePath;
315
    }
316
317
    /**
318
     * 获取应用配置目录
319
     * @access public
320
     * @return string
321
     */
322
    public function getConfigPath(): string
323
    {
324
        return $this->configPath;
325
    }
326
327
    /**
328
     * 获取配置后缀
329
     * @access public
330
     * @return string
331
     */
332
    public function getConfigExt(): string
333
    {
334
        return $this->configExt;
335
    }
336
337
    /**
338
     * 获取应用类基础命名空间
339
     * @access public
340
     * @return string
341
     */
342
    public function getRootNamespace(): string
343
    {
344
        return $this->rootNamespace;
345
    }
346
347
    /**
348
     * 获取应用类库命名空间
349
     * @access public
350
     * @return string
351
     */
352
    public function getNamespace(): string
353
    {
354
        return $this->namespace;
355
    }
356
357
    /**
358
     * 获取应用开启时间
359
     * @access public
360
     * @return float
361
     */
362
    public function getBeginTime(): float
363
    {
364
        return $this->beginTime;
365
    }
366
367
    /**
368
     * 获取应用初始内存占用
369
     * @access public
370
     * @return integer
371
     */
372
    public function getBeginMem(): int
373
    {
374
        return $this->beginMem;
375
    }
376
377
    /**
378
     * 初始化应用
379
     * @access public
380
     * @return $this
381
     */
382
    public function initialize()
383
    {
384
        $this->beginTime = microtime(true);
385
        $this->beginMem  = memory_get_usage();
386
387
        $this->parse();
388
389
        $this->init();
390
391
        return $this;
392
    }
393
394
    /**
395
     * 分析应用(参数)
396
     * @access protected
397
     * @return void
398
     */
399
    protected function parse(): void
400
    {
401
        if (is_file($this->rootPath . '.env')) {
402
            $this->env->load($this->rootPath . '.env');
403
        }
404
405
        $this->parseAppName();
406
407
        $this->parsePath();
408
409
        if (!$this->namespace) {
410
            $this->namespace = $this->multi ? $this->rootNamespace . '\\' . $this->name : $this->rootNamespace;
411
        }
412
413
        $this->configExt = $this->env->get('config_ext', '.php');
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->env->get('config_ext', '.php') can also be of type boolean. However, the property $configExt is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
414
    }
415
416
    /**
417
     * 分析当前请求的应用名
418
     * @access protected
419
     * @return void
420
     */
421
    protected function parseAppName(): void
422
    {
423
        $this->urlPath = $this->request->path();
424
425
        if ($this->auto && $this->urlPath) {
426
            // 自动多应用识别
427
            $name = current(explode('/', $this->urlPath));
428
429
            if (isset($this->map[$name])) {
430
                if ($this->map[$name] instanceof \Closure) {
431
                    call_user_func_array($this->map[$name], [$this]);
432
                } else {
433
                    $this->name = $this->map[$name];
434
                }
435
            } elseif ($name && false !== array_search($name, $this->map)) {
436
                throw new HttpException(404, 'app not exists:' . $name);
437
            } else {
438
                $this->name = $name ?: $this->defaultApp;
0 ignored issues
show
Bug Best Practice introduced by
The property defaultApp does not exist on think\Base. Since you implemented __get, consider adding a @property annotation.
Loading history...
Documentation Bug introduced by
It seems like $name ?: $this->defaultApp can also be of type object. However, the property $name is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
439
            }
440
        } elseif ($this->multi) {
441
            $this->name = $this->name ?: $this->getScriptName();
442
        }
443
444
        $this->request->setApp($this->name ?: '');
445
    }
446
447
    /**
448
     * 分析应用路径
449
     * @access protected
450
     * @return void
451
     */
452
    protected function parsePath(): void
453
    {
454
        if ($this->multi) {
455
            $this->runtimePath = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR . $this->name . DIRECTORY_SEPARATOR;
456
            $this->routePath   = $this->rootPath . 'route' . DIRECTORY_SEPARATOR . $this->name . DIRECTORY_SEPARATOR;
457
        } else {
458
            $this->runtimePath = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR;
459
            $this->routePath   = $this->rootPath . 'route' . DIRECTORY_SEPARATOR;
460
        }
461
462
        if (!$this->appPath) {
463
            $this->appPath = $this->multi ? $this->basePath . $this->name . DIRECTORY_SEPARATOR : $this->basePath;
464
        }
465
466
        $this->configPath = $this->rootPath . 'config' . DIRECTORY_SEPARATOR;
467
468
        $this->env->set([
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
469
            'think_path'   => $this->thinkPath,
470
            'root_path'    => $this->rootPath,
471
            'app_path'     => $this->appPath,
472
            'runtime_path' => $this->runtimePath,
473
            'route_path'   => $this->routePath,
474
            'config_path'  => $this->configPath,
475
        ]);
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
476
    }
477
478
    /**
479
     * 初始化应用
480
     * @access public
481
     * @return void
482
     */
483
    public function init(): void
484
    {
485
        // 加载初始化文件
486
        if (is_file($this->runtimePath . 'init.php')) {
487
            include $this->runtimePath . 'init.php';
488
        } else {
489
            $this->load();
490
        }
491
492
        if ($this->config->get('app.exception_handle')) {
493
            Error::setExceptionHandler($this->config->get('app.exception_handle'));
494
        }
495
496
        // 设置开启事件机制
497
        $this->event->withEvent($this->withEvent);
498
499
        // 监听AppInit
500
        $this->event->trigger('AppInit');
501
502
        $this->debugModeInit();
503
504
        date_default_timezone_set($this->config->get('app.default_timezone', 'Asia/Shanghai'));
0 ignored issues
show
Bug introduced by
It seems like $this->config->get('app....zone', 'Asia/Shanghai') can also be of type array and array; however, parameter $timezone_identifier of date_default_timezone_set() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

504
        date_default_timezone_set(/** @scrutinizer ignore-type */ $this->config->get('app.default_timezone', 'Asia/Shanghai'));
Loading history...
505
    }
506
507
    /**
508
     * 加载应用文件和配置
509
     * @access protected
510
     * @return void
511
     */
512
    protected function load(): void
513
    {
514
        if ($this->multi && is_file($this->basePath . 'event.php')) {
515
            $this->loadEvent(include $this->basePath . 'event.php');
516
        }
517
518
        if (is_file($this->appPath . 'event.php')) {
519
            $this->loadEvent(include $this->appPath . 'event.php');
520
        }
521
522
        if ($this->multi && is_file($this->basePath . 'common.php')) {
523
            include_once $this->basePath . 'common.php';
524
        }
525
526
        if (is_file($this->appPath . 'common.php')) {
527
            include_once $this->appPath . 'common.php';
528
        }
529
530
        include $this->thinkPath . 'helper.php';
531
532
        if ($this->multi && is_file($this->basePath . 'middleware.php')) {
533
            $this->middleware->import(include $this->basePath . 'middleware.php');
534
        }
535
536
        if (is_file($this->appPath . 'middleware.php')) {
537
            $this->middleware->import(include $this->appPath . 'middleware.php');
538
        }
539
540
        if ($this->multi && is_file($this->basePath . 'provider.php')) {
541
            $this->bind(include $this->basePath . 'provider.php');
542
        }
543
544
        if (is_file($this->appPath . 'provider.php')) {
545
            $this->bind(include $this->appPath . 'provider.php');
546
        }
547
548
        $files = [];
549
550
        if (is_dir($this->configPath)) {
551
            $files = glob($this->configPath . '*' . $this->configExt);
552
        }
553
554
        if ($this->multi) {
555
            if (is_dir($this->appPath . 'config')) {
556
                $files = array_merge($files, glob($this->appPath . 'config' . DIRECTORY_SEPARATOR . '*' . $this->configExt));
557
            } elseif (is_dir($this->configPath . $this->name)) {
558
                $files = array_merge($files, glob($this->configPath . $this->name . DIRECTORY_SEPARATOR . '*' . $this->configExt));
559
            }
560
        }
561
562
        foreach ($files as $file) {
563
            $this->config->load($file, pathinfo($file, PATHINFO_FILENAME));
564
        }
565
    }
566
567
    /**
568
     * 调试模式设置
569
     * @access protected
570
     * @return void
571
     */
572
    protected function debugModeInit(): void
573
    {
574
        // 应用调试模式
575
        if (!$this->appDebug) {
576
            $this->appDebug = $this->env->get('app_debug', false);
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->env->get('app_debug', false) can also be of type string. However, the property $appDebug is declared as type boolean. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
577
        }
578
579
        if (!$this->appDebug) {
580
            ini_set('display_errors', 'Off');
581
        } elseif (PHP_SAPI != 'cli') {
582
            //重新申请一块比较大的buffer
583
            if (ob_get_level() > 0) {
584
                $output = ob_get_clean();
585
            }
586
            ob_start();
587
            if (!empty($output)) {
588
                echo $output;
589
            }
590
        }
591
    }
592
593
    /**
0 ignored issues
show
Coding Style introduced by
Parameter $event should have a doc-comment as per coding-style.
Loading history...
594
     * 注册应用事件
595
     * @access protected
596
     * @return void
597
     */
598
    protected function loadEvent(array $event): void
599
    {
600
        if (isset($event['bind'])) {
601
            $this->event->bind($event['bind']);
602
        }
603
604
        if (isset($event['listen'])) {
605
            $this->event->listenEvents($event['listen']);
606
        }
607
608
        if (isset($event['subscribe'])) {
609
            $this->event->subscribe($event['subscribe']);
610
        }
611
    }
612
613
    /**
614
     * 获取自动多应用模式下的实际URL Path
615
     * @access public
616
     * @return string
617
     */
618
    public function getRealPath(): string
619
    {
620
        $path = $this->urlPath;
621
622
        if ($path && $this->auto) {
623
            $path = substr_replace($path, '', 0, strpos($path, '/') ? strpos($path, '/') + 1 : strlen($path));
624
        }
625
626
        return $path;
627
    }
628
629
    abstract public function run();
0 ignored issues
show
Coding Style introduced by
Missing function doc comment
Loading history...
630
631
    /**
632
     * 解析应用类的类名
633
     * @access public
634
     * @param  string $layer  层名 controller model ...
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after parameter name; 2 found
Loading history...
635
     * @param  string $name   类名
0 ignored issues
show
Coding Style introduced by
Expected 2 spaces after parameter name; 3 found
Loading history...
636
     * @return string
637
     */
638
    public function parseClass(string $layer, string $name): string
639
    {
640
        $name  = str_replace(['/', '.'], '\\', $name);
641
        $array = explode('\\', $name);
642
        $class = self::parseName(array_pop($array), 1);
643
        $path  = $array ? implode('\\', $array) . '\\' : '';
644
645
        return $this->namespace . '\\' . $layer . '\\' . $path . $class;
646
    }
647
648
    /**
649
     * 获取应用根目录
650
     * @access protected
651
     * @return string
652
     */
653
    protected function getDefaultRootPath(): string
654
    {
655
        $path = dirname(dirname(dirname(dirname($this->thinkPath))));
656
657
        return $path . DIRECTORY_SEPARATOR;
658
    }
659
660
    /**
661
     * 获取当前运行入口名称
662
     * @access protected
663
     * @return string
664
     */
665
    protected function getScriptName(): string
666
    {
667
        if (isset($_SERVER['SCRIPT_FILENAME'])) {
668
            $file = $_SERVER['SCRIPT_FILENAME'];
669
        } elseif (isset($_SERVER['argv'][0])) {
670
            $file = realpath($_SERVER['argv'][0]);
671
        }
672
673
        return isset($file) ? pathinfo($file, PATHINFO_FILENAME) : $this->defaultApp;
0 ignored issues
show
Bug Best Practice introduced by
The property defaultApp does not exist on think\Base. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The expression return IssetNode ? pathi...ME) : $this->defaultApp could return the type object which is incompatible with the type-hinted return string. Consider adding an additional type-check to rule them out.
Loading history...
674
    }
675
676
    /**
677
     * 字符串命名风格转换
678
     * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
679
     * @access public
680
     * @param  string  $name 字符串
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter name; 1 found
Loading history...
681
     * @param  integer $type 转换类型
0 ignored issues
show
Coding Style introduced by
Expected 4 spaces after parameter name; 1 found
Loading history...
682
     * @param  bool    $ucfirst 首字母是否大写(驼峰规则)
683
     * @return string
684
     */
685
    public static function parseName(string $name = null, int $type = 0, bool $ucfirst = true): string
686
    {
687
        if ($type) {
688
            $name = preg_replace_callback('/_([a-zA-Z])/', function ($match) {
0 ignored issues
show
Coding Style introduced by
The opening parenthesis of a multi-line function call should be the last content on the line.
Loading history...
689
                return strtoupper($match[1]);
690
            }, $name);
0 ignored issues
show
Coding Style introduced by
For multi-line function calls, the closing parenthesis should be on a new line.

If a function call spawns multiple lines, the coding standard suggests to move the closing parenthesis to a new line:

someFunctionCall(
    $firstArgument,
    $secondArgument,
    $thirdArgument
); // Closing parenthesis on a new line.
Loading history...
691
            return $ucfirst ? ucfirst($name) : lcfirst($name);
692
        }
693
694
        return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
695
    }
696
697
    /**
698
     * 获取类名(不包含命名空间)
699
     * @access public
700
     * @param  string|object $class
0 ignored issues
show
Coding Style introduced by
Missing parameter comment
Loading history...
701
     * @return string
702
     */
703
    public static function classBaseName($class): string
704
    {
705
        $class = is_object($class) ? get_class($class) : $class;
706
        return basename(str_replace('\\', '/', $class));
707
    }
708
709
    /**
0 ignored issues
show
Coding Style introduced by
Parameter ...$args should have a doc-comment as per coding-style.
Loading history...
710
     * 创建工厂对象实例
711
     * @access public
712
     * @param  string $name         工厂类名
0 ignored issues
show
Coding Style introduced by
Expected 6 spaces after parameter name; 9 found
Loading history...
713
     * @param  string $namespace    默认命名空间
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after parameter name; 4 found
Loading history...
714
     * @return mixed
715
     */
716
    public static function factory(string $name, string $namespace = '', ...$args)
717
    {
718
        $class = false !== strpos($name, '\\') ? $name : $namespace . ucwords($name);
719
720
        if (class_exists($class)) {
721
            return Container::getInstance()->invokeClass($class, $args);
722
        }
723
724
        throw new ClassNotFoundException('class not exists:' . $class, $class);
725
    }
726
727
    public static function serialize($data): string
0 ignored issues
show
Coding Style introduced by
Missing function doc comment
Loading history...
728
    {
729
        SerializableClosure::enterContext();
730
        SerializableClosure::wrapClosures($data);
731
        $data = \serialize($data);
732
        SerializableClosure::exitContext();
733
        return $data;
734
    }
735
736
    public static function unserialize(string $data)
0 ignored issues
show
Coding Style introduced by
Missing function doc comment
Loading history...
737
    {
738
        SerializableClosure::enterContext();
739
        $data = \unserialize($data);
740
        SerializableClosure::unwrapClosures($data);
741
        SerializableClosure::exitContext();
742
        return $data;
743
    }
744
}
745