exakat.1.1.4 review

新的一周,令人难以置信的php技巧收获。有些人把它交给了exakat引擎,以支持语言处理;有些人向分析进行了分析,以帮助我们发展更好。技巧包括array_keys.’S额外参数,Unicode CodePoint,常量标量表达式和数组(SIC), 谜语 . Let’S审查Exakat 1.1.4。

PHP提示和技巧

在静态分析仪上工作时的一个挑战是保持一个’潜在平台尽可能深的知识。有时候,这意味着会见令人难以置信的可怕的代码,而其他代码’s a real surprise.

使用阵列的恒定标量表达式

采取常数和阵列。很长一段时间,我们已经能够将常数定义为阵列。然后,随着恒定标量表达式(SIC)的出现,我们可以这样做;

<?php

   const A = [1, 2]; 
   const B = [3, 4, 5]; 
   const C = A + B; 
?>

+是常规标量表达式的有效运算符之一:这些表达式仅使用常量值(文字,常数,静态常量),并在编译时处理。这适用于+和阵列,所以,最终,我们最终结束了:C === [1,2,5];

起初,这令人惊讶:aren’我们应该得到一个5个元素数组?然后,在记住+与数组中,在PHP中,实际上是覆盖现有密钥,它有意义。这是与变量相同的行为。

CodePoints.

PHP 7.0引入了字符串中Unicode CodePoint的使用,使所有Unicode字符可用。 CodePoints是代码位置,一种引用字符(字母,意识形图,象形文字,符号等)的方式。 Unicode有一个,PHP处理它:

<?php

echo "\u{4eba}"; //人
echo "\u{04eba}"; //人
echo "\u{004eba}"; //人
echo "\u{0004eba}"; //人
?> 

前导0忽略,但仍然处理。该技巧可用于隐藏字符串中的字母,并删除Unicode CodePoint转义序列检测。 exakat有一个安全分析,报告字符串中编码的罗马字母:这是一个红色标志,因为通常永远不会编码。

__dir__是不敏感的不区分大小写的

One of those cases of not-reading the documentation even though I translated it three times: all the magic constants are case-insensitive (http://php.net/manual/en/language.constants.predefined.php). I learnt that the hard way by reading code that used it, thinking it was a mistake. Then, realizing that the mistake was on me. Coding should keep you humble…

<?php
  echo __DIR__; // /tmp/test.php
  echo __dir__; // /tmp/test.php
?>

 

array_keys.()以搜索键

array_keys.() 接受三个参数。很少知道,随着array_keys()主要用于从数组中提取键列表。但它实际上包括值得了解的额外功能。

另外两个参数是search_value和strict。这使得array_keys()array_search的大兄弟:array_search()一旦找到搜索值,array_keys()就会在数组中返回它们的键。

<?php

$array = [1,2,3,4,3];

print array_search(3, $array); // 2
print_r(array_keys($array, 3)); // [ 0 => 2, 1 => 4]

?>

array_search()是一个慢函数,因为它实际上循环阵列以找到值。只要有可能,特别是当值均为唯一时,建议将该阵列转换为其翻转的版本,并在键上使用ISSET():那样,PHP使用Hash-Table,结果更快。

另一方面,当数组中存储有几个相同的值时,array_flip()可以’使用T,并且需要循环搜索。然后,array_keys()是一个更好的选择。即使在小规模阵列上,array_keys / array_search也始终超过循环阵列10倍。

重用缓存值

缓存值绝对是加快处理的好方法。这在架构和概念级别都是如此,并且在方法级别也是如此。基本上是这样的情况:

<?php

function foo($a) {
    $b = strtolower($a);
    
    // more code
    
    if (strtolower($a) === 'c') {
       // doSomething()
    }
}

?>

评论//更多代码在这里缩小示例的大小,但是您可以很容易地理解忘记在变量中已在变量中处理的值实际上是非常简单的方法大:这也可能是副作用一项过程重构。实际上,exakat报告了在范围内相同的表达,因为它们可以在一次呼叫中简化。

Although strtolower($a) is a fast native call, it still is functioncall, with scope change, and all the extra overhead. Reducing the number of such functioncall by caching the results in another variable, and reusing that variable is a good way to wasting cycles.

缓存的问题是它需要一些规划:存储值,然后重用它。因此,这往往会在初始代码写完之后发生,并且最好在代码审查中完成。

exakat有你的回归:它会发现已经存储在变量中的任何表达式,并建议重用它。除了表演的改进之外,对代码的影响应该很少。除了一些假阳性是原始值在范围内被修改。

双阵列_flip很慢

array_flip(),正如我们之前讨论的那样,在数组中交换键和值。它’S相当慢的呼叫,因为PHP检查了在交换过程中的唯一值。如您所知,键是唯一的,而值是任意的。

array_flip()在以一种方式收集字典的情况下很有用,并且必须以保留方式使用。此时,PHP从不知道这些值是唯一的,所以无论如何都是工作。

我遇到了一段代码,如此:请注意,代码适用于符合本文,并将上下文脱离。

<?php

function foo($array, $value) {
    $tmpArray = array_flip($array);
    unset($tmpArray[$value]);
    return array_flip($tmpArray);
}

?>

此处使用array_flip()来交换数组中的键和值,并轻松地删除该值。这里,array_flip()用两次,它’S RED FLAG:使用array_search()和array_keys()替换对$ value的键的搜索,避免双翻转。

这个简单的代码片段进行了分析。我不’T期望报告许多结果,但是当它确实时,它将是出色的反馈。

所有的正面表达式都属于我们

虽然几乎每个PHP应用程序都备受正常表达式的更多或更少使用,但正则表达式使用的延伸越少。通常,Regex使用的选择留给开发人员。这是一个本地决定:正则表达式为方法量身定制,以及其特定情况。

或者是?作为一个简单(siC)字符串,并在特定上下文中阐述,导致它是独一无二的。很少是:它’刚刚取消选中。没有人检查其余代码以查看是否为同一目的创建了另一个类似的类似看起来。曾经。

exakat.通过构建RegEx库存来带来一致性的应用程序:它收集了在代码中找到的所有正则表达式,并在简单的列表中呈现它们。所有这些都在代码上分散的那些正则表达式现在在同一文件中:将其视为校友会。突然,他们可以比较和讲述代码的不同故事。

在这里检查一下 PHPMailer..

以下是Regex库存提高的一些问题:

  • 有相同的正则表达式吗?
  • 有类似的正则表达式吗?
  • 有巨大的正面表达式吗?
  • 可以通过Filter_ *或其他PHP功能替换某些RegEx?
  • 是否应该使用经典的正则表达式?
  • 是否有不应该使用的经典正义?
  • 是否有动态构建正则表达式?

正则表达式库存是一个良好的开始重构代码:在公共库中进行一些表达式,删除过多的代码或简单地简化正则表达式。

快乐的PHP代码评论

exakat.1.1.4为您带来了PHP编码的实地考察的好处:可能会在长期以来留在代码中的精确错误,仅仅因为它们不是检查。可以使用低产生的分析加载自动工具:代码审核的临界值是代码中的哨兵,并在其剩余的应用程序上专注于其余的应用程序。

你想要对你的代码的反馈吗?向我们删除Twitter上的一个注释(@Exakat.)或松弛频道:我们’我很高兴讨论它。

所有320多个分析仪都介绍在文档中,包括未经培训的‘使用Path Info(),而不是字符串操纵’: a rare issue (5%)

下载exakat.io,安装它 Docker.,升级它‘exakat.phar升级-u’像我们在Github上一样: //github.com/exakat/exakat.

 

One thought on “exakat.1.1.4 review

  1. pingback: 社区新闻:PHP Quickfix的最近帖子(02.14.2018) - WebDev.am

评论被关闭。