Home >Backend Development >PHP Tutorial >php-fig - PHP 中 side-effects 是什么?

php-fig - PHP 中 side-effects 是什么?

WBOY
WBOYOriginal
2016-06-06 20:50:141080browse

PHP-FIG 中 PSR-1 有这样一段描述

Files SHOULD either declare symbols (classes, functions, constants, etc.) or cause side-effects (e.g. generate output, change .ini settings, etc.) but SHOULD NOT do both.

其中

side-effects (e.g. generate output, change .ini settings, etc.)

不明其意, 请高手们赐教

回复内容:

PHP-FIG 中 PSR-1 有这样一段描述

Files SHOULD either declare symbols (classes, functions, constants, etc.) or cause side-effects (e.g. generate output, change .ini settings, etc.) but SHOULD NOT do both.

其中

side-effects (e.g. generate output, change .ini settings, etc.)

不明其意, 请高手们赐教

副作用,就如这句英文所说:

side-effects (e.g. generate output, change .ini settings, etc.)

包括产生输出、改变ini设置等等~ 我个人认为副作用就指对环境产生影响的代码。除了上面说的,还包括写入数据库、写入缓存、调用带数据写入的接口、增加计数器计数等等等等……

PSR-1里这条规范的意思是,把能产生副作用的程序(直接写在主程序体中的、没有做任何封装的 “裸”代码)和纯声明/定义性的程序分别放在不同的文件里。主要原因是,php里所有的文件只要引入就会被执行。纯声明的程序可以直接通过require/include安全引入(通常只能引入一次),而且通常与引入顺序无关;而带副作用的程序直接require/include引入可以一次或多次,且会影响环境,甚至有对顺序的依赖。这两种代码混在一起容易导致逻辑混乱。所以有这么一条设置。

而像@suchasplus 举例的

<code class="lang-php">function getResult($i){
     $j = $i * 2;
     printf("i x 2 = %ld", $j);
     return $j;
}
</code>

这种情况属于函数声明/定义,不是会产生副作用的代码。

另例如,如果需要引入一个文件就计数一次,最终统计一共引入了几个文件(当然有其他方法可以做到这个功能,这里仅供举例),如果你这么做:

<code class="lang-php">//main.php
<?php $file_count = 0;

require 'a.php';
require 'b.php';

echo $file_count;
?>

//a.php
<?php function a(){
   //...
}

$file_count ++;
?>


//b.php
<?php function b(){
   //...
}

$file_count ++;
?>
</code>

这里,在a.phpb.php$file_count++ 就属于会产生副作用的程序,而 function afunction b则属于声明性程序,如此混用就属于违反PSR-1的设计。对此,一种符合规范的改进则是将a.phpb.php里的$file_count++提到单独文件:

<code class="lang-php">//main.php
<?php $file_count = 0;

require 'a.php';
require 'count_file.php';

require 'b.php';
require 'count_file.php';

echo $file_count;
?>

//a.php
<?php function a(){
   //...
}
?>

//b.php
<?php function b(){
   //...
}
?>

//file_count.php
<?php $file_count ++;
?>
</code>

side effect就是副作用的意思 比如

<code>function getResult($i){
     $j = $i * 2;
     printf("i x 2 = %ld", $j);
     return $j;
}
</code>

printf这句话就是side effect

Pascal中有function和procedure的区分, 即函数和过程

PHP用function都包含了, 就像PHP的array包含了tuple/list/dict一样

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn