跳到内容

闭路320.金沙上线跳过一些代码

当金沙上线跳过一些代码时,它具有代码优化:它一旦检测到无用的作业,它会自动跳过指令。不需要代码缓存,这是普通的香草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 金沙上线. 为我带来这一点,并 朱利安保利 确认.