我在哪里可以找到PHP严格标准定义

时间:2014-12-05 15:00:22

标签: php strict

我所见过的PHP严格标准是(ini_get('error_reporting') & E_STRICT) == true时报告的错误。以错误驱动的方式纠正这些错误似乎不是最佳的。

因此,为了编写完全符合PHP严格标准的代码,我想阅读其中定义的内容。我在哪里可以找到PHP严格标准?

我所做的所有搜索只会导致如何修复严格标准报告的任意错误的指示,但绝不会严格标准本身。任何人都可以提供链接吗?

3 个答案:

答案 0 :(得分:8)

了解E_STRICT被发射的所有可能性的唯一方法是查找寻找E_STRICT的源。基本上,请看主分支:http://lxr.php.net/search?q=&defs=&refs=E_STRICT&path=Zend%2F&hist=&project=PHP_TRUNK。请注意,在某些情况下,master可能会因出现E_STRICT错误以及何时出现错误而与特定版本不同。

当然,如果不了解C和一些常见的内部术语,理解PHP的来源将是困难的。

答案 1 :(得分:8)

下面是PHP 5.6中可能存在的E_STRICT错误消息和捆绑扩展(源自http://lxr.php.net/s?refs=E_STRICT&project=PHP_5_6)的完整列表,以及会激发它们的简短代码示例。

在PHP 5.5中,调用任何mysql_*函数也会生成E_STRICT,从PHP 5.6开始,它会生成E_NOTICE

可能有其他地方在PECL扩展中发出它们,如果你找到它们,可以在这里编辑它们。


将静态属性ClassName :: $ propName作为非静态

访问
class ClassName
{
    public static $propName = 1;
}
$o = new ClassName;
echo $o->propName; // error here

资源ID#1用作偏移量,转换为整数(1)

$fp = fopen('file.txt', 'r');
$array[$fp] = 'something'; // error here
// it's worth noting that an explicit cast to int has the same effect with no error:
$array[(int)$fp] = 'something'; //works

非静态方法ClassName :: methodName()不应该静态调用(可能包含其他文本:假设$ this来自兼容的上下文OtherClassName)

class ClassName
{
    public function methodName()
    {
        return 1;
    }
}
echo ClassName::methodName(); // error here

只能通过引用分配变量

function func()
{
    return 1;
}
$var = &func(); // error here

只应通过引用

传递变量
function func(&$arg)
{
    $arg = 1;
}
function func2()
{
    return 0;
}
func(func2()); // error here

静态函数ClassName :: methodName()不应该是抽象的

abstract class ClassName
{
    abstract public static function methodName(); // error here
}
class OtherClassName extends ClassName
{
    public static function methodName()
    {
        return 1;
    }
}

重新定义类ClassName

的已定义构造函数
// Emitted when both a PHP4-style and PHP5-style constructor are declared in a class
class ClassName
{
    public function ClassName($arg)
    {
    }
    public function __construct($arg) // error here
    {
    }
}

ClassName :: methodName()声明应与OtherClassName :: methodName()

兼容
// Emitted when a class declaration violates the Liskov Substitution Principle
// http://en.wikipedia.org/wiki/Liskov_substitution_principle
class OtherClassName
{
    public function methodName()
    {
        return 1;
    }
}
class ClassName extends OtherClassName
{
    public function methodName($arg) // error here
    {
        return $arg + 1;
    }
}

您应该使用time()函数

// Emitted when calling mktime() with no arguments
$time = mktime(); // error here

除UTF-8之外的多字节编码仅支持基本实体替换;功能等同于htmlspecialchars

// Emitted when using a multi-byte character set that is not UTF-8 with
// htmlentities and some related functions
echo htmlentities("<Stuff>", ENT_COMPAT | ENT_HTML401, '936'); // error here

没有下一个结果集。请调用mysqli_stmt_more_results()/ mysqli_stmt :: more_results()来检查是否调用此函数/方法

// Emitted by mysqli_next_result() when there are no more results
do {
    // stuff
} while (mysqli_next_result($link)); // error here

答案 2 :(得分:0)

没有一个统一的地方列出所有严格的错误,但我也不一定会期望。该列表将巨大

您可以做的是查找E_STRICT通知。列出这些的常见位置是在PHP次要版本(即5.X)发布时推出的迁移列表。这是5.4 backwards incompatability list,它显示了现在有E_STRICT个通知的内容。我认为这是你能得到的最好的。