6 PHP使用的良好做法
6良好的使用实践

6良好做法‘use’ in PHP

在最近审查代码时,我意识到没有指导方针 use。每一个现代代码都使用‘use’(SIC),因为来自作曲家或框架的导入类是常态。现在有类似的语法进行了相当多的变体,用于导入类或特征。虽然对性能的影响很低,但使用的是使用的,但具有清洁的方法‘use’保持代码清洁和可读是很重要的。让’审查使用六种良好的使用情况是什么。

多次使用表达式

使用配置有三种味道:命名空间,特征和闭包。

Closure在其语法中使用。这种用法严格格式化,允许的变化很小。

<?php
function ($arg) use ($localvariable) {}
?>

在课堂或其他特征内使用特质使用。它在当前结构内部进口特征。虽然PHP没有’t检查多个同一特征的导入,它不起作用’除了看起来很奇怪,T有很大的影响。不存在的特性产生致命错误,而且’s about it.

<?php
trait t { use t1 ; }
class foo { use t ; }
?>

We’LL考虑此处的命名空间使用。他们再次进入三种口味:单身,多次或分组。所有味道在代码上都具有相同的配置目的。它们也可能明确别名。

<?php

use single\import ;
use multiple\import, multiple\import2, multiple\import3 ;
use grouped\import{ classes, interfaces, traits} ;

use single\import as aliasedImport ;
use multiple\import as aliasMultipleImport, multiple\import2 as aliasMultipleImport2, multiple\import3 as aliasMultipleImport2 ;
use grouped\import{ classes as groupedClasses, interfaces as groupedInterface, traits as groupedTrait} ;

use path\to\aClass ; 
use path\to\folder as prefix;

new aClass ;
new prefix\classA ;
new prefix\classB ;

?>

使用的最佳实践

  • 不要导入未使用的类
  • 总是使用别名
  • 首先放置所有使用
  • 避免使用不同类别的相同别名
  • 组使用表达式轻松阅读
  • 限制使用表达数量

不要导入未使用的类

这个非常明显,众所周知。它适用于所有可进度结构。 PHP没有’T检查所有使用至少一次使用,所以没有提到无用的用途。这主要是死者代码。它在编译时使用,并且可能会慢汇编:这应该是’t可衡量。死的‘use’ doesn’T更改执行性能。它’s good to keep ‘use’清洁,避免混淆或额外的维护或混乱成本。

<?php

use path\to\A , path\to\UnusedClass ;

new A ;
?>

始终使用别名

应避免任何对完全命名方式的呼叫,至少别名。首先,这缩短了代码,保持更容易读取。这也可能被称为‘避免代码中的长级名称’.

<?php

new path\to\A ;

?>

它还在重构时帮助:所有命名空间使用现在是脚本的选项。更改使用表达式允许更改别名的所有后续使用情况。当在代码中使用多次命名空间时,尤其如此,在代码中保存多次搜索并替换。请注意,从长远来看,在现代代码中保持史前名称可能不那么明智。

使用别名可以防止Instanceof,catch()或typehint中来自未解决类的静默死亡代码。那些条款唐’t检查过滤的类实际存在。实际上,当重构时,类可以很容易地更改名称空间或重命名,离开孤立孤立,创建死代码。使用良好的使用,所有这些都会像其他课程一样迁移。

<?php

use path\to\A ;

$a = new A() ;
echo A::someConstant ;

if ($b instanceof A) {
	doSomething() ;
}

?>

在命名空间中首先放置所有使用

预期在文件开头或命名空间块(它们实际上影响名称空间,但由于大多数惯例是一个文件,因此可能会混淆)。

<?php

namespace Exakat ;

use Foo\Bar ;
use Bar\Foo ;

$a = new Bar( Foo::Constante) ;

?>

事实上,可以使用命名空间的根级别的任何位置,对代码的可读性和可用性产生重大影响。虽然它们在编译时使用,但是‘use’在此之前和之后,是否有影响课程的可用性。我们赢了’T提供任何示例,但在安全的环境中尝试,请务’t burn yourself.

避免对不同类使用相同的别名

现在这个是略有争议的,但我’我肯定你已经咬了一口。

它适用于项目范围的命名方案,各种别名在各种文件中使用。想象一下,同名给不同的类。这些类实际上可能是不同的,位于不同的名称空间中,但一旦它们被别名,或减少到他们的最终名称,它们看起来很像。然后,它可以容易地误以为另一个,直到代码击中它们的位置。

文件a.php.

<?php
use path\to\A as B;
?>

文件B.php.

<?php
use path\to\B;
?>

建议使用特定于一个类的别名名称,并在应用程序中一致地使用它们。很容易吗?

嗯,首先,如果一个类(或一个界面或特征)得到一个名字,我们为什么需要另一个名字在实际使用它们时?能’t we give this ‘other’名称直接到课程,然后用它直接使用?那么,再次命名空间的目的是什么?

其次,有特殊的模拟类别,这意味着以嘲讽的值或方法完全取代一个类。现在,‘use’正是为此进行的,允许使用与不同类别的相同代码。这可能是一个例外。

无论如何,它往往会常常在项目中以相同的名称结束。那些需要混叠,无论如何可能一些审查。

组使用表达式轻松阅读

在PHP 5中,只需对使用呼叫进行排序所以’简单易于查看一系列使用,基于相同的命名空间前缀。在PHP 7中,使用分组表达式,使前缀明显。

<?php
//PHP 5
use Thelia\Form\BaseForm;
use Thelia\Form\Definition\AdminForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Form\ProductModificationForm;

use Thelia\Model\AccessoryQuery;
use Thelia\Model\AttributeAv;
use Thelia\Model\AttributeAvQuery;
use Thelia\Model\AttributeQuery;
use Thelia\Model\CategoryQuery;
use Thelia\Model\Content;
use Thelia\Model\ContentQuery;
use Thelia\Model\Country;
use Thelia\Model\Currency;
use Thelia\Model\CurrencyQuery;
use Thelia\Model\Feature;
use Thelia\Model\FeatureProductQuery;

?>
<?php
// PHP 7
use Thelia\Form\{BaseForm, 
                 Definition\AdminForm,
                 Exception\FormValidationException,
                 ProductModificationForm };
                 


use Thelia\Model\{AccessoryQuery,
                  AttributeAv,
                  AttributeAvQuery,
                  AttributeQuery,
                  CategoryQuery,
                  Content,
                  ContentQuery,
                  Country,
                  Currency,
                  CurrencyQuery,
                  Feature,
                  FeatureProductQuery};

?>

限制10以下的使用表达数

当文件从(TOO)开始长的使用列表时,它显示以下代码实际上耦合到许多其他类。现在,基于规则‘always use alias’,测量耦合现在是计算使用命令的问题。

Drupal., octogercms.购物软件 在一个文件中最多可使用30个, 伊利亚 最多69(见 这里)。如实,平均值为每个文件5到8之间,测试文件的数字越多。

自动检查代码

使用表达式仅影响当前命名空间或文件。这使得静态分析工具可以通过文件审核IT文件,并根据上面的所有规则提供有关用途的反馈:缺少别名,死亡别名或可能重复使用的别名。这 exakat发动机 有三个具体分析来处理这些验证。

从长远来看,保持使用干净,而不是过于频繁使用对您的代码最重要。使用静态分析来避免繁琐的任务来查看,计算和清洁所有这些使用表达式。思考它,这可能非常自动化!