【问题标题】:Where can I find the PHP Strict Standards Definitions在哪里可以找到 PHP 严格标准定义
【发布时间】:2015-02-03 18:58:05
【问题描述】:

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

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

我所做的所有搜索都只导致了如何修复严格标准报告的一些任意错误的说明,而不是严格标准本身。谁能给个链接?

【问题讨论】:

  • 我不确定是否存在明确的列表,但应该存在。
  • 澄清一下:您想知道发出E_STRICT 的所有可能性吗?
  • 澄清:是的,绝对的。我们正在谈论严格的标准。我真的很想知道这些标准是什么,以一种连贯的方式,而不是通过编写有史以来最容易出错的代码并评估错误日志。为了进一步澄清,我真的不希望抛出 E_Strict 的所有可能性,更多的是标准的完整和连贯的定义。 E_Strict 应该总是被抛出,当这些被违反时。
  • What does E_STRICT do? 的可能重复项

标签: php strict


【解决方案1】:

要知道在哪里发出E_STRICT 的所有可能性,唯一的方法是用grep 查找E_STRICT 的源。基本上,看这里的主分支:http://lxr.php.net/search?q=&defs=&refs=E_STRICT&path=Zend%2F&hist=&project=PHP_TRUNK。请注意,在某些情况下,master 可能与特定版本在引发 E_STRICT 错误的内容和时间有所不同。

当然,如果不了解 C 和一些常见的内部术语,理解 PHP 的源代码会很困难。

【讨论】:

  • 不错的清单。必须为自己记住这一点
  • 感谢您提供的链接,但如果这是追踪 PHP 严格标准的方法,那么我们谈论的是标准这个词的非常淫秽的用法。这或多或少会给您留下错误驱动的开发。如果没有人能想出更具人类可读性的东西,我会接受这个答案。但我仍然抱有希望,即使我们在谈论 PHP。
  • 看到您正在编写 PHP 文档,我不希望有更好的分析器来源。这不是我所希望的答案,但这并没有使它成为一个答案。请继续编写 PHP 文档,也许可以开始编写 PHP 标准部分;)
  • @Armin “严格标准”并不指某些标准文档。严格的标准错误信息。它们只是你不应该做的事情。没有风格手册。
【解决方案2】:

下面是 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

【讨论】:

  • 感谢您的列表。这些E_STRICT 警告/错误是否以某种方式唯一标识自己?也许他们的错误字符串是标识符。如果有办法将它们区分开来,最好包含该标识符并将其标记为这样(以供以后参考和跟踪更改)。感谢您迄今为止的努力。尽管看到数量如此之少,这让我更加难以理解,因为它们没有被记录在案。
  • 干得好——我想这需要几个小时来编译,因为我在一个类似的问题上did the same,这是一项非常棒的工作。很高兴有一些东西可以检查我的工作。我想你在这里错过了一个 - 警告在一个特征和一个使用该特征的类中同样声明一个属性,这是我列表中的第 8 点。
【解决方案3】:

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

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

【讨论】:

  • 这就是我目前正在做的事情,也是让我发疯的原因。不过谢谢你的提示。
  • 我从 lxr 做了一个列表,结果它并没有我想象的那么大。我怀疑它在 5.7 中可能会增长很多(如果真的发生的话)。
猜你喜欢
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多