<

exakat.1.2.3 review

exakat 1.2.3稳步带来更多的分析和报告金沙上线编码器。本周,我们很高兴看到新的开始‘Manual’报告和三个新分析,即检查strtr()使用,报告属性取消设定并列出所有复杂表达式。所以,“call me Exakat”:这是exakat 1.2.1审查。

新报告:代码手册

静态分析有助于您在编写时记录代码。 Exakat非常适合在代码中发现错误。沿途,它必须记录各种功能,以减少假阳性。最终,该文档对于手动审核也是宝贵的。

exakat 1.2.3介绍了新的‘Manual’报告。此报告是MD文件,它收集了有趣的信息,请阅读代码中。

  • 常量名称及其价值
  • 例外树
  • URL.
  • 电子邮件
  • SQL.
  • 正则表达式
  • 传入变量
  • 动态表达式
  • 错误消息

大多数时候,这些信息分散在代码上,导致臭名昭着‘Magic number’ syndrom. The ‘Magic number’综合征是代码中出现的那些文字数字,而无需解释。当这些数字有更多的目的而不是它们的面值时,它们应该变成一个常数。有一个名称,即使没有文档也更清晰。

通过扩展,手动报告收集有趣的信息,帮助他们重用。对于示例,正则表达式每次需要它们时都会被硬编码,然后在必须应用变化时更新一次。通过同一位置的所有正则表达式,很容易查看它们,并意识到它已经写入了,它实际上在代码的许多地方使用。更一致,编码较少。

静态分析文档的一个很大优势是其更新的速度:提交代码的任何更改,并在飞行中更新文档。 NO Detour要记录任何内容,也不更新当前文档:DOC可以立即更新。

该手册报告的第一个版本有九个部分:我们已经有许多想法来实现许多其他有趣的部分。随意推荐新功能,在github.com/exakat/exakat或松弛频道上!

检查Strtr使用

Strtr是所有时间的100个金沙上线功能之一:它’S 金沙上线 3(可能甚至2.0)以来一直使用金沙上线。它替换了一根字符串中的字符。

<?php 
  echo strtr('caché', 'âé', 'ae'); 
?>

strtr仅在现场替换字符。这导致了参数上的一些有趣的约束:在将字符串用作参数时,两个字符串应该具有相同的大小。将使用较短的字符串。

而且,Strtr可以’t删除字符,因为空字符串始终是最短的。

<?php 
// fg are not used here 
echo strtr('caché', 'âé', 'aefg'); 

// ch are not used here 
echo strtr('caché', 'âéch', 'ae'); 

// no change in the input string 
echo strtr('caché', 'âé', ''); 

?>

Strtr的最后一个想法:它实际上比str更有效替换或preg.代替。但它也是一个更简单,更改字符。我们可以添加一个新规则,表明STRTR在其他方面的使用情况,当更改或正则表达式更简单时。

回声/打印/打印偏好

jan-willem van schie建议(@jwvanschie.),我们补充说‘printf’ to the ‘echo / print’偏爱。 PrintF通常较少使用而不是回声/打印:除非格式化变量很重要,否则回声和打印件更方便。我们’请参阅未来几周的偏好是否成为主导地位。

大学教师’t unset properties

上周,巴黎的Afup会议产生了一个有趣的陷阱:金沙上线允许摧毁一个财产。 Benoit Buthichon(@benoitburnichon.)提到失去了很多时间,寻找一个未命令的财产。该属性在类定义中定义,但后来消失。

<?php 
class A { 
  public $a = 1; 
  function cleanProperty(){ 
    // $this->a = null;
       unset($this->a);
    }
}

$a = new A();
print_r((array) $a);
$a->cleanProperty();
print_r((array) $a);

?>

A better coding behavior is nulling the property: assigning null to the property keeps the property defined. Yet, it will not yield Undefined property: A::$b when used, but it will still yield Trying to get property 'c' of non-object when used as another object, or so. Testing it with isset() or empty() is also warning-less and behaves correctly.

创建此新分析后,我们开始审核基于此问题的代码。看起来很多类首先取消配置属性,然后恢复其初始定义,如下所示:

<?php 
  public function clearNotificationQueue() { 
        unset($this->_NotificationQueue);
        $this->_NotificationQueue = [];
    }
?>

_notificationqueue实际上被定义为空数组()。在这里,它是未命令的,然后重置为其默认值。似乎我们可以跳过未命令,并直接设置新的无关值。 GC将及时发生以在此处清洁任何对象。有人对这个主题有更好的体验吗?它可能是一个旧的金沙上线 4行为,直到现在。

您所有复杂的表达式都属于我们

它们越长,表达越难读取。虽然我们努力保持我们的方法短暂,但它恰好有些表达狂野并大幅增长。

例如,考虑连接。最多七个变量,它们可能仍然可读。您甚至可以找到甚至可以让它们易读的方法,尽管它可能不是每个人。

另一方面,当相同大小的连接包括多个金沙上线本机调用时,这使得读取表达式非常困难。拿着它

@unlink(getcwd( ) . substr($fileFrom, strlen($unzip_dir), strlen($fileFrom)))

 

它仅包括5个金沙上线本机呼叫:取消链接,Substr,GetCWD和Strlen(两次)。虽然,那些积累使得整个表达难以阅读,并且处理了很少的错误。

首次检查后,似乎大多数表达式最多包含4个金沙上线本机函数调用。使用超过5个本机函数调用的表达越来越少,并且可以安全地报告。还似乎很多人都是打印数据,如本代码:

@print (preg_replace('#/\*\s*\*/\s*#', '', str_replace('url(\'\')', 'none', str_replace('url("")', 'none', preg_replace('#\{\$[^\}]*\}#', '', file_get_contents($FILE_BASE . '/themes/default/css/global.css'))))))

exakat现在报告这些表达,以帮助可读性。

这种长表达的大部分是由长级连接和流利的界面使用。例如:

$key = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_rsaauth_keys')->select(['key_value'], 'tx_rsaauth_keys', ['uid' => $keyToBeDeleted])->fetchColumn( )

$runAction = '<a class="btn btn-default" data-toggle="tooltip" data-container="body" href="' . htmlspecialchars($this->moduleUri . '&tx_scheduler[execute][]=' . $schedulerRecord['uid']) . '" title="' . htmlspecialchars($this->getLanguageService( )->getLL('action.run_task')) . '">' . $this->moduleTemplate->getIconFactory( )->getIcon('extensions-scheduler-run-task', Icon::SIZE_SMALL)->render( ) . '</a>'

事实上,有了一个良好的IDE,这种表达是不难以阅读的。然而,它们倾向于吸引更多的错误,而不是较短的表达式,因为从一个技术跳跃(例如,HTML到金沙上线到SQL),易于出错。

另一方面,某些表达是真正的树皮:

$this->defaultLinkTarget = $this->classesAnchorDefault[$this->displayedLinkHandlerId] && 
$this->classesAnchorDefaultTarget[$this->displayedLinkHandlerId] ? 
$this->classesAnchorDefaultTarget[$this->displayedLinkHandlerId] :
 (isset($this->buttonConfig[$this->displayedLinkHandlerId]['properties']['target']['default']) ?
 $this->buttonConfig[$this->displayedLinkHandlerId]['properties']['target']['default'] :
 (isset($this->buttonConfig['properties']['target']['default']) ?
 $this->buttonConfig['properties']['target']['default'] : ''))

快乐的金沙上线代码评论

所有344个分析仪都介绍在文档中,包括同意的 逻辑到in_array :长期逻辑比较列表可以取代一个array()调用。代码更具可读,并且执行更快。它’s a popular 金沙上线 bug <//178.62.231.40/,评分为49%。

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

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