金沙上线跳过一些代码
当金沙上线跳过一些代码时,它具有代码优化:它一旦检测到无用的作业,它会自动跳过指令。不需要代码缓存,这是普通的香草php。
暗示if.
经典案例是使用逻辑运算符时&& or ||.
当第一个操作数&&是假的,那么结果将是假的,无论第二个操作数如何。只要情况就是这样,金沙上线会跳过第二条指令。
<?php function foo() { print __METHOD__. "\n" ; } function bar() {print __METHOD__. "\n" ;} foo() && bar() ; ?>
另一方面,当调用相同的函数集时||操作员,金沙上线将跳过第二个操作数,第一个是真的。当第一个是真的时,结果是真的,无论第二个操作数的值如何。
<?php foo() || bar() ; ?>
这就是为什么这些逻辑运算符也被用作 暗示如果然后是结构。您可能会发现这一点,具有这样的结构:
<?php defined('FRAMEWORK_IS_INITED') || die('No direct access') ; !defined('FRAMEWORK_IS_INITED') && die('No direct access') ; ?>
跳过构造函数’s argument
还有另一个情况‘skip’效果:在没有构造函数的类中创建一个对象。这似乎是一个长长的论点。以下是它的构建方式:
<?php function foo() { print __METHOD__. "\n"; }
class b {} class e extends b {}
class c { function __construct($a) {} } class d extends c { } new c(foo()); new d(foo()); ?>
这将显示foo(),因为可能需要。即使我们不’T做任何与参数(在真实代码中的坏话),Foo()被称为一个参数。但是,这不会显示任何东西:
<?php
new b(foo()); new e(foo());
?>
B和E没有构造函数,也没有他们各自的父母。 金沙上线会发现为可以的不存在函数分配参数无用’t and won’要执行,所以它完全跳过这个操作。这是快速的,它还防止了要调用的foo()。
It’s not a bug, it’s a feature
这是在金沙上线 5.0中实现的,并且已实施’自此改变了。它赢了’改变,更好地了解它。它对金沙上线 7仍然有效。
如果要避免这种陷阱,您可以考虑两种方法:
- 避免在实例化期间评估代码:发送变量或文字,但从不调用方法或功能
- 始终放置构造函数,甚至是空的。
非常感谢 雷琴 从 SweetLake 金沙上线. 为我带来这一点,并 朱利安保利 到 确认.