exakat.1.3.5 review

exakat 1.3系列的更多稳定性和改进。 exakat在上周封闭了几个错误并添加了细化以分析。 undefined ::课程现在报告,现在将无用的分配作为问题报告。 array_key_fill()建议已升级,预处理建议将扩展到静态连接。 exakat 1.3.5评论包相当有趣的变化!

undefined :: class.

::班级是一种特殊的常量。由于PHP 5.5,它在编译时提供了完全限定的名称。

 
<?php namespace A;

class X {}

echo x::class; 
// displays \A\x 
?> 

这是访问类名的非常方便的方法。它处理文件’s use expressions. Yet, it also doesn’t检查类是否存在。

 
<?php namespace A;

echo x::class; 
// displays \A\x 
?> 

::class is a compile time option : at compile time, the class may not be loaded yet, or be located in another file. As such, PHP builds the class name, and emits no error. So, unusable ::class may be emitted.

Since 1.3.5, Exakat reports undefined ::class results, so you can check the name or the use expression before being hit with a Class 'x' not found or worse, silent dead code.

班级树

exakat维护与代码相关的大量文档,并在精炼分析时使用它。这是去除误报的方法。作为副作用,可以使用并提供一些有趣的文档。

类树是基于Extends的类层次结构。类扩展了其他类,继承其方法,属性和常量。

请注意,此树可能与命名空间树非常不同:类可以在非常不同的命名空间中彼此遍布,导致两个不同的树木。有时,也,命名空间树和类树是相同的。

大使报告(exakat默认报告)包括存货部分中的类树。它从root中报告类:它是代码中提供的第一个非扩展类。虽然,此类可能实际上扩展了包含的类,如作曲家或PHP扩展类。

大使报告并未’T显示非扩展类,以保持树简单和更清洁。

阅读类库存是关于代码结构的好文件。它回答了几个问题:+代码是否具有继承+继承树+的是多么深,这是宽的树木,典型的模块+哪个是可以抽象的类+有多少根类可用?

array_fill_key()具有变量

array_fill_keys.() 是一个本机PHP函数,可从键创建数组。它需要一系列键,并设置具有相同值的每个键。每当使用键初始化数组时,它都是一个紧凑而快速的解决方案。

 
<?php

$array = range('a', 'z');

// Fast way to build the array $b = array<em>fill</em>key($a, 0);

// Slow way to build the array foreach($array as $a) { $b[$a] = 0; }

?> 

在Exakat 1.1.7中介绍,此分析目前报告太多误报:一旦阵列填充与Foreach的源数组相同的键。

此方法实际上是有用的:默认值可以是变量,动态构建,但为每个键重复。

It may also be an object. When filling an array with array_fill_keys. and an object, the same object is filled everywhere. Changing one index in the array changes all of them. This requires a clone of the object.

From the false positive we observed, both usage are common. When the assigned value is a literal, array_fill_keys. is a good guess, while when the assigned value is a variable, extra steps must be taken to check if this variable is modified during the loop, or if it is a cloned object.

对于此分析提供的建议数量来说,额外的检查都太昂贵了。所以,我们决定保持误报,速度。我们’如果情况发生变化,请继续使用它查看代码,并升级,或者当我们获得更好的工具进行额外支票时升级。

无用的分配

更频繁地,人们可以思考,在返回时间分配变量。类似的东西:

 
<?php
class Foo { 
   function bar() { 
     // code that set $cache, $loader, $clientId, $lang return 
    $clean = $cache->get($loader, array(), md5(serialize(array($clientId, $lang)))) 
  } 
} 
?> 

你不’T需要看到其余的代码来理解,分配$ CLEAT,然后删除:该方法已结束。这种分配是无用的。

所有分配都没有用:实际上,在返回时间分配数据,到本地属性有效。真的,当地财产将生存。将以前的代码与此进行比较。

 
<?php
class Foo { 
  function bar() { 
  // code that set $cache, $loader, $clientId, $lang 
   return $this->clean = $cache->get($loader, array(), md5(serialize(array($clientId, $lang)))) 
  } 
} 
?> 

现在返回干净的缓存,但也存储了以后的用法。这是有道理的,并且使用情况也会涵盖静态属性。

然而,存在一系列变量,可以在方法的返回返回,函数甚至封闭时存活。它们实际上是三种类型:

  • 参考文献,作为参数传递
  • 静态变量
  • 全局变量

可以在最后一刻分配这些变量中的任何一个,仍然提供一些有用的存储。

所有这些都考虑在Exakat 1.3.5中进行了这个新的分析。

预处理替代

已经报告了预处理机会的分析。例如:

 
<?php

// Building an array from a string 
$name = 'PHP'.' '.'7.2';

// Building an array from a string 
$list = explode(',', 'a,b,c,d,e,f');

// Calculating a power $kbytes = 
$bytes / pow(2, 10);

// This will never change 
$name = ucfirst(strtolower('PARIS'));

?> 

简而言之,一些数据准备是通过PHP,执行时间完成的。这些默认值可以转换为静态标量表达式,如第一个示例:可以在编译时解决简单表达式。他们需要依赖运营商和常量(任何类型),并且PHP将在编译时将整个表达式转化为最终值。

另一方面,无法处理调用函数,本机PHP或自定义的任何表达式。虽然某些表达式可能在没有任何副作用的情况下工作,但对于每个函数并非如此,因此不允许在静态标量表达式中使用功能。

这意味着计算字母表的第一个字母,如第二个例子所示,易于写入,但每次执行此代码时都会花费PHP一些循环。通过将该代码转换为真实数组,PHP将缓存并保存一些

 
<?php

// Building an array from a string 
$html = ''; 
$html .= '<header>'; 
$html .= '<meta charset="utf-8">'; 
$html .= "<title>$title</title>"; 
$html .= '</header><span>'; 
// more code 
?> 

这是这种情况。直到字符串中包含变量$标题,$ HTML变量静态构建。可能是额外的表达式是故意演示的:将标签拆分在几条线上倾向于使HTML代码更可读。然而,PHP花费时间执行的表达式相同,呼叫后呼叫。

有关可读性目的,请将到Heredoc或Nowdoc的交换机有助于并避免重复。

像往常一样,如果此代码运行一次,则影响很低。一旦内部在循环内,它可能突然昂贵。

快乐的PHP代码评论

所有358个分析仪都介绍在文档中,包括上衣 应该使用array_filter(): turn a foreach() with a condition into a simple Array_Filter. call, clean and readable. Array_Filter. is in the (所有PHP功能的前100名 它在循环中的用法,它可能会产生不小的。除此之外,它是一个常见的错误:50%的应用程序很脆弱。

您可以查看图库中的所有exakat报告: exakat画廊.

下载exakat.io,安装它 Docker.,升级它‘exakat.phar升级-u’ and like us on GitHub..