php

Author Avatar
A Man Has No Name 7月 25, 2017
  • 在其它设备中阅读本文章

应该深入理解。

小技巧

  • 不需要使用gii界面

    1
    2
    // 创建controller
    ./yii gii/controller --controllerClass="backend\controllers\BaseController"
  • 不需要启动nginx

1
./yii serve/index -t='@backend/web' -p=8888 0.0.0.0
  • 创建一个extension
1
2
./yii gii/extension --vendorName=ttt --namespace='Tes\\T\\' --title=zzzz --description=aaaa --authorName=zq@zq.com --authorEmail=t@ttt.com --license=MIT

Yii2的深入分析

Web

初始化的 Application, 继承自 \yii\base\Application

\yii\base\Application 继承自 \yii\base\Module

也就是说, 主体框架ApplicationModule 都是继承自 Module

Module 相当于一个二级的Application, 自己包含一套MVC,

Application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public function __construct($config = [])
{
// 初始化Application
Yii::$app = $this;
static::setInstance($this);
$this->state = self::STATE_BEGIN;
// 初始化配置参数
$this->preInit($config);
// 初始化错误处理类
$this->registerErrorHandler($config);
// 加载Components
Component::__construct($config);
}

核心components

1
2
3
4
5
6
7
8
9
10
11
12
13
public function coreComponents()
{
return [
'log' => ['class' => 'yii\log\Dispatcher'],
'view' => ['class' => 'yii\web\View'],
'formatter' => ['class' => 'yii\i18n\Formatter'],
'i18n' => ['class' => 'yii\i18n\I18N'],
'mailer' => ['class' => 'yii\swiftmailer\Mailer'],
'urlManager' => ['class' => 'yii\web\UrlManager'],
'assetManager' => ['class' => 'yii\web\AssetManager'],
'security' => ['class' => 'yii\base\Security'],
];
}

psr4 和 psr0

psr0是自动加载的标准,psr4是对psr0的补充。

  1. 必须符合\<Vendor Name><Namespace>*<Class Name>
  2. 每个NameSpace必须有一个顶层的NameSpace(‘/yii/….’)
  3. 可以多个NameSpace
  4. 文件系统加载的时候,每一个NameSpace都需要转成分隔符
  5. 类名必须以.php结尾
  6. Class Name中,下划线,要转换成分隔符
1
2
3
4
5
6
\Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
# 注意类名含有下划线的特殊情况
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php

Composer中两个不同的规范

psr0
目录结构很深

1
2
3
4
5
6
7
8
9
10
11
vendor/
vendor_name/
package_name/
src/
Vendor_Name/
Package_Name/
ClassName.php # Vendor_Name\Package_Name\ClassName
tests/
Vendor_Name/
Package_Name/
ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest

psr4

1
2
3
4
5
6
7
vendor/
vendor_name/
package_name/
src/
ClassName.php # Vendor_Name\Package_Name\ClassName
tests/
ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest

在PSR-0中目录结构要与命名空间层层对应,无法插入一个单独的目录。Vendor\Package\Class在psr-0会里被直接转换成同样的路径,而PSR-4则没有这样的强制要求。

对比PSR-0,除了PSR-4可以更简洁外,需要注意PSR-0中对下划线(_)是有特殊的处理的,下划线会转换成DIRECTORY_SEPARATOR,这是出于对PHP5.3以前版本兼容的考虑,而PSR-4中是没有这个处理的,这也是两者比较大的一个区别。

此外,PSR-4要求在autoloader中不允许抛出exceptions以及引发任何级别的errors,也不应该有返回值。这是因为可能注册了多个autoloaders,如果一个autoloader没有找到对应的class,应该交给下一个来处理,而不是去阻断这个通道。

\Acme\Log\Writer\File_Writer => Acme\Log\Writer => ./acme-log-writer/lib/ => /acme-log-writer/lib/File_Writer.php

\Aura\Web\Response\Status => Aura\Web => /path/to/aura-web/src/ => /path/to/aura-web/src/Response/Status.php

\Symfony\Core\Request => Symfony\Core => ./vendor/Symfony/Core/ => ./vendor/Symfony/Core/Request.php

\Zend\Acl => Zend => /usr/includes/Zend/ => /usr/includes/Zend/Acl.php

关于PHP的测试(Codeception)