- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我实际上有兴趣确保我们的代码库没有错误,这些错误会被 PHP 的内置错误检查警告,但我想看看 E_STRICT 到底执行了什么。推而广之,PHP的“严格标准”是什么?我查看了但找不到完整的列表。
我从经验中了解到的一些严格标准:
我对 E_STRICT 的了解是它警告可能会破坏前向兼容性的代码,但我不确定这具体意味着什么。
关于这方面的信息是否有很好的资源?
最佳答案
E_STRICT
和“严格标准”是一回事。 (还有 they're removed in PHP 7 。)
文档目前没有E_STRICT
特定警告的列表,但我们可以通过搜索 the PHP source 合理轻松地构建一个。 .
下面的列表(我相信从 PHP 5.6 开始是准确的)是通过以下方法在 Unix 系统上形成的:
克隆 PHP Git 存储库:
git clone https://github.com/php/php-src
checkout 版本 5.6.0:
cd php-src
git checkout PHP-5.6.0
搜索所有包含 E_STRICT
的 C 文件(扩展名为 .h
和 .c
的文件):
grep --include=*.[ch] -rl . -e E_STRICT
手动查看每个 (21) 个匹配文件以查找发出 E_STRICT
警告的代码,试图推断发出警告的情况(我不是 C程序员,但对这些东西进行很好的猜测并不难,尤其是在代码中有人类可读的错误消息来指导你)然后在交互式 PHP shell 中测试它们以确保我是正确的。
鉴于上述方法略显粗糙,并且依赖于以下假设:E_STRICT
可以在发出 E_STRICT
警告的所有位置旁边的源代码中找到,我可能遗漏了一些内容 - 但希望这至少接近成为一个全面的列表。
调用 mktime()
没有参数
php > mktime();PHP Strict Standards: mktime(): You should be using the time() functioninstead in php shell code on line 1
使用 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
将 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
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
声明一个同时带有 __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
调用 mysqli_next_result
或 mysqli::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
重写子类中的方法以将不同数量的参数传递给其父类中的相同方法
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
在特征和使用它的类中以兼容的方式声明相同的属性。这个实际上很好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
静态调用非静态方法
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
非静态地引用静态属性
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
直接传递函数调用的结果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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!