gpt4 book ai didi

php - E_STRICT 有什么作用?

转载 作者:可可西里 更新时间:2023-11-01 13:16:23 24 4
gpt4 key购买 nike

我实际上有兴趣确保我们的代码库没有错误,这些错误会被 PHP 的内置错误检查警告,但我想看看 E_STRICT 到底执行了什么。推而广之,PHP的“严格标准”是什么?我查看了但找不到完整的列表。

我从经验中了解到的一些严格标准:

  • 警告不要静态调用非静态方法
  • 针对不兼容的子类函数签名发出警告
  • 警告不要通过引用赋值

我对 E_STRICT 的了解是它警告可能会破坏前向兼容性的代码,但我不确定这具体意味着什么。

关于这方面的信息是否有很好的资源?

最佳答案

E_STRICT 和“严格标准”是一回事。 (还有 they're removed in PHP 7 。)

文档目前没有E_STRICT 特定警告的列表,但我们可以通过搜索 the PHP source 合理轻松地构建一个。 .

下面的列表(我相信从 PHP 5.6 开始是准确的)是通过以下方法在 Unix 系统上形成的:

  1. 克隆 PHP Git 存储库:

    git clone https://github.com/php/php-src
  2. checkout 版本 5.6.0:

    cd php-src
    git checkout PHP-5.6.0
  3. 搜索所有包含 E_STRICT 的 C 文件(扩展名为 .h.c 的文件):

    grep --include=*.[ch] -rl . -e E_STRICT
  4. 手动查看每个 (21) 个匹配文件以查找发出 E_STRICT 警告的代码,试图推断发出警告的情况(我不是 C程序员,但对这些东西进行很好的猜测并不难,尤其是在代码中有人类可读的错误消息来指导你)然后在交互式 PHP shell 中测试它们以确保我是正确的。

鉴于上述方法略显粗糙,并且依赖于以下假设:E_STRICT 可以在发出 E_STRICT 警告的所有位置旁边的源代码中找到,我可能遗漏了一些内容 - 但希望这至少接近成为一个全面的列表。

PHP 中导致 E_STRICT 警告的事情

  1. 调用 mktime()没有参数

    php > mktime();PHP Strict Standards:  mktime(): You should be using the time() functioninstead in php shell code on line 1
  2. 使用 resource作为数组索引

    php > $file_pointer = fopen('/dev/null', 'r');php > $array = [3,4,5,6];php > $array[$file_pointer];PHP Strict Standards:  Resource ID#2 used as offset, casting to integer (2)in php shell code on line 1
  3. 将 UTF-8 以外的多字节编码传递给 htmlentities

    php > htmlentities('qwertyuiop', 0, 'BIG5');PHP Strict Standards:  htmlentities(): Only basic entities substitution issupported for multi-byte encodings other than UTF-8; functionality isequivalent to htmlspecialchars in php shell code on line 1
  4. 声明 abstract static方法

    php > abstract class Foo { static abstract function bar(); }PHP Strict Standards:  Static function Foo::bar() should not be abstract inphp shell code on line 1
  5. 声明一个同时带有 __construct 的类方法和 old-style constructor以类命名的函数

    php > class MyClass {php {     function MyClass () {}php {     function __construct () {}php { }PHP Strict Standards:  Redefining already defined constructor for classMyClass in php shell code on line 3
  6. 调用 mysqli_next_resultmysqli::next_result 在没有要准备的下一个结果的 Mysqli 连接对象上

    php > $conn = mysqli_connect('127.0.0.1', 'root');php > mysqli_multi_query($conn, "SELECT 'first'; SELECT 'second';");php > echo mysqli_use_result($conn)->fetch_row()[0];firstphp > mysqli_next_result($conn);php > echo mysqli_use_result($conn)->fetch_row()[0];secondphp > mysqli_next_result($conn);PHP Strict Standards:  mysqli_next_result(): There is no next result set.Please, call mysqli_more_results()/mysqli::more_results() to check whetherto call this function/method in php shell code on line 1
  7. 重写子类中的方法以将不同数量的参数传递给其父类中的相同方法

    php > class A           { public function foo ($x) {} }php > class B extends A { public function foo () {} }PHP Strict Standards:  Declaration of B::foo() should be compatible withA::foo($x) in php shell code on line 1php > class C extends A { public function foo ($x, $y) {} }PHP Strict Standards:  Declaration of C::foo() should be compatible withA::foo($x) in php shell code on line 1
  8. 在特征和使用它的类中以兼容的方式声明相同的属性。这个实际上很好documented :

    If a trait defines a property then a class can not define a property with the same name, otherwise an error is issued. It is an E_STRICT if the class definition is compatible (same visibility and initial value) or fatal error otherwise.

    Example #12 Conflict Resolution

    <?php
    trait PropertiesTrait {
    public $same = true;
    public $different = false;
    }

    class PropertiesExample {
    use PropertiesTrait;
    public $same = true; // Strict Standards
    public $different = true; // Fatal error
    }
    ?>

    严格模式警告示例:

    php > trait PropertiesTrait {php {     public $same = true;php { }php > class PropertiesExample {php {     use PropertiesTrait;php {     public $same = true;php { }PHP Strict Standards:  PropertiesExample and PropertiesTrait define thesame property ($same) in the composition of PropertiesExample. This mightbe incompatible, to improve maintainability consider using accessormethods in traits instead. Class was composed in php shell code on line 4
  9. 静态调用非静态方法

    php > class Foo { function bar() {} }php > Foo::bar();PHP Strict Standards:  Non-static method Foo::bar() should not be calledstatically in php shell code on line 1
  10. 非静态地引用静态属性

    php > class Cow { static public $noise = 'moo'; }php > $cow = new Cow;php > $cow->noise = "MOOOOO";PHP Strict Standards:  Accessing static property Cow::$noise as non staticin php shell code on line 1
  11. 直接传递函数调用的结果by reference .

    php > function foo () { return 1; }php > function bar (&$some_arg) {} php > bar(foo());PHP Strict Standards:  Only variables should be passed by reference in phpshell code on line 1php > $var = &foo();PHP Strict Standards:  Only variables should be assigned by reference inphp shell code on line 1

    请注意,通过引用传递其他非变量(如文字或常量)是 fatal error ,而不是 E_STRICT

关于php - E_STRICT 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com