exakat. 1.5.7 Review

本周,在exakat 1.5.7的评论:大使报告与特征矩阵增强‘New issues’部分。我们为Ext / WASM和Ext / Async添加了支持,两个非常有趣的新扩展。自引用的特征和方法可能是静态的是一些新规则。而旧规则现在支持‘static’,作为回调的数组。现在,卓越1.5.7审查。

特征矩阵

特征 are “旨在通过使开发人员在生活在不同类层次结构中的几个独立类中自由地重用一组方法来减少单一继承的一些限制。”。它们代表一组方法以及它们的属性,并存储在单独的结构中。

    
<?php 
trait name { 
  private $name; 
  public function setName($name) { 
    $this->name = $name;
  }

  public function getName() {   
    return $this->name;
  } 
}

class Dog {   
  use name;
}

class Car {   
  use name;
}
?>

Here, both classes Dog and Car may have names. The trait name is the same code, used in both classes. (If you don’知道有名字的汽车,想想赫比或闪电mcqueen)。

Since traits may give the same name to methods, there may be conflicts between traits. The same final class that uses two traits providing the same-named method are in conflict. This is where the keyword insteadof is important.

    
<?php 
  trait a { 
   function t() {} 
  } 

 trait b { 
   function t() {} 
 } 

 class Foo { 
   use a, b { 
      a::t insteadof b; // This sets the priority of a::t over b::t 
      b::t as u; // This aliases b::t as Foo::c 
   } 
} 
?>

当特征的数量小时,解决冲突在编码时很容易完成:几种方法,很少的冲突。通过更大的代码基础,更大的团队和更长的历史,特征将不可避免地成长和数量,到冲突普遍的程度。

exakat.’S Ambassador为特征提供了新的自动化文档,帮助开发人员导航冲突迷宫:特质矩阵。它提供了两个关键的信息。

首先,在特征之间发生冲突的方法列表。每个冲突方法都列在细胞中,

第一个分析表明,很多代码将受益于此新的建议。

自我推荐特征

直接继承从先前的矩阵,Exakat现在包括检查自我使用的特征。该定义实际上涵盖了具有不同根源的三种不同情况。

首先是本身使用特征。类似的东西:

    
<?php 
  trait t { 
    use t; 
    function foo() {} 
} 

?>

特征可以使用自己,并且赢得了’对于任何冲突,因为包括特质优先于包含的特征。所以,所有重做方法(这里都是所有的方法)实际上被忽略了。

当您想要别名的方法时,将出现这种情况的唯一用法,以避免重复代码。

    
<?php 
trait t { 
  use t{ foo as bar; }; 
  function foo() {} 
} 
?>

现在,T有两种方法:Foo和Bar。

第二种情况是相同的特征的多个包含,特别是当包括的特征列表很长时间。例如 :

    
<?php 
trait t { 
  use a, b, c, b, e, f, g; 
  function foo() {} 
} 
?>

PHP仅包括特质一次,因此,该列表有效并正确运行。这两次包括特征是太多的,应该是清洁的。

Finally, traits may end up in cycles of inclusion : they include one another. Since PHP only does use_once style, this is OK :

    
<?php 
trait a { 
  use b; 
  function a() {} 
} 

trait b { 
  use c; 
  function b() {} 
} 

trait c { 
  use a; // Back to the first one 
  function c() {} 
} 
?>

整个结构现在是一种具有方法a(),b()和c()的特征。只包括其中一个就足够了解它们。然而,一旦其中一个包含夹杂物就会突然出现问题:通过开放循环,最终类可能缺少方法或两个。更好地保持树形的形状,而不是包括周期。

exakat. 1.5.7 detects those situations, and reports them.

静态是在弦中

自己, 静态的 and 父母 are three useful keywords, used to represent the current class, the called class or its parents. They must be used only inside a class, as they need class context to be useful.

    
<?php 
class x { 
  function a() { 
  // display the current class 
  echo self::class; 
  } 
} 
?>

PHP has multiple ways to reference a method : using the full qualified name, or the 自己, 静态的 and 父母, or even, an array with two elements : the class, or an object of that class, and the method name.

    
<?php 
  $for_a_static_call = array('x', 'a'); 
  class x { 
     static function a() { 
     // display the current class 
     echo self::class; 
  } 
} 

?>

Here, 自己, 静态的 and 父母 can’t被用作第一个参数,因为它们需要类上下文。但它们可能被称为字符串。

    
<?php 
  class x { 
    static function a() { 
    // display the current class 
    echo self::class; 
  } 

  static function b($method) { 
   // display the current class with method a above 
   call_user_func($method); 
   echo self::class; 
   } 
} 

(new x)->method(array('static', 'a'));

?>

和‘static’,仅在执行时才需要类上下文。因此,该方法可以定义任何地方,作为参数传递,最后执行。

注意:此刻,这只适用于呼叫用户func() and related functions. Using the dynamic syntax $method( ) would yield an error Fatal error: Uncaught Error: Class 'static' not found. 错误77295. 提交审查。

支持EXT / WASM和EXT / ASYNC扩展

我们为本周添加了两个扩展的支持:EXT / WASM和EXT / ASYNC。

 

PHP-EXT-WASM 是一个延伸,除了 Ivan Enderlin. 来自 HOA项目. “PHP-EXT-WASM项目的目标是直接从PHP运行Webassembly二进制文件。”

 

什么是webassembly?“WebAsseMbly(缩写WASM)是基于堆栈的虚拟机的二进制指令格式。 WASM被设计为可用于编译C / C ++ / RUST等高级语言的便携式目标,在Web上允许部署客户端和服务器应用程序。”

另一方面, EXT / ASYNC. 是PHP的异步框架,由 Martinschröder. : it “使用PHP中的Native C Fibers提供并发Zend VM执行。” In particular, “任务是基于光纤的对象,在单独的呼叫堆栈上执行PHP功能或方法。”

 

Ext / Async可以轻松启动任务,包括PHP代码,并继续运行PHP的其余部分。这对于需要等待的任务特别有效,例如数据库查询,套接字甚至文件。以下是扩展名的示例:

    

<?php 

namespace Concurrent;
$domain = (\DIRECTORY_SEPARATOR == '\\') ? \STREAM_PF_INET : \STREAM_PF_UNIX;
list ($a, $b) = stream_socket_pair($domain, \STREAM_SOCK_STREAM, \STREAM_IPPROTO_IP);
foreach ([$a, $b] as $r) {     
  stream_set_blocking($r, false);
  stream_set_read_buffer($r, 0);
  stream_set_write_buffer($r, 0);
}

$watcher = new StreamWatcher($b);
task::async(function () use ($a, $watcher) {     
    (new Timer(500))->awaitTimeout();

   fwrite($a, 'Hello Socket ');
   fclose($a);
   var_dump('EOF!');
});

var_dump('WAIT FOR IO...');
while (\is_resource($b) && !\feof($b)) {     
   $watcher>awaitReadable();

   var_dump(fread($b, 4));
}
fclose($b);
var_dump('DONE!');

?>

显示:

string(14) "WAIT FOR IO..."
string(4) "EOF!"
string(4) "Hell" 
string(4) "o So" 
string(4) "cket" 
string(3) " " 
string(5) "DONE!"

访问这两个延伸,因为它们是繁重的工作。

可能是静态的方法

What do you call a method that makes no usage of $this ? A static method.

我们已经有了一个分析 这不是静态方法, which reports the usage of $this in static methods : this is a bug, as PHP will report its usage a execution time : Using $this when not in object context

Like visibility (private, public, protected), abstract or final, those keywords are dropped during development or refactoring, so as to avoid recurring PHP error messages. And, when the situation settles, it is difficult to review them, as it implies also checking the code that calls them.

exakat. now scours the code to find all legit usage, and report any method that can be made static. This clarifies the code, and help understand its structure.

虽然你’在它中,您也可以考虑将静态方法移动到函数:只要该方法都不是’t与当前类有任何链接,包括静态属性。

每周审计:2018,周#50

exakat包括A.‘weekly’报告:此报告采用五项分析为构建。这意味着短暂的审计报告,几乎没有问题审查。读取它们并不是很多,并在代码中查看它们。 PHP社区中的每个人都可以专注于一个经典的编码问题并解决它。谈谈周围的每周审计:你’LL找到面临同样挑战的程序员。

获得‘weekly’审核,运行审计,请求‘Weekly’ report.

# Init the project (skip when it is already done)    
php exakat.phar init -p <yourproject> -R //github.com/Seldaek/monolog.git -git 

# Run the project (skip when it is already done)    
php exakat.phar project -p <yourproject> 

# Export the weekly project (every monday)    
php exakat.phar report -p <yourproject> -format Weekly 

# Open projects/<yourproject>/weekly/index.html in your browser    

每周,您可以在此找到5个新分析,以便在您的代码中审查。事实上,当您的代码干净时,您也可以快速查看即将到来的

每周 recommendations for PHP code review : 2018, week 2018-50

快乐的PHP代码评论

所有352个分析仪都介绍在文档中,包括整洁 没有幼儿的例外 :在代码中定义异常,但从未抛出过。

这是一个常见的错误:31%的应用程序有太多异常。

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

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