PHP中存在类似于JS中的提升(Hoisting)情况,但并不适于所有情况。
<?php
echo "$bool,$string,$integer,$float,$array";
echo '<hr />';
var_dump(is_object($object));
echo '<hr />';
var_dump(class_exists('father'));
var_dump(class_exists('boy'));
var_dump(class_exists('girl'));
var_dump(function_exists('great_function'));
var_dump(function_exists('poor_function'));
die();
exit();
$bool = true;
$string = 'string hoists';
$integer = 100;
$float = 1.11;
$array = array('array hoists');
class girl extends father{};
class father {}
class boy extends father{}
$object = new father();
function great_function () {
echo "function hoists";
}
$poor_function = function(){
}
个人理解:
在文件被执行前,PHP的解释器首先逐行审查代码,遇到简单的类型——比如前五种——不提升,因为比较简单,实际代码执行的时候再说吧。
然后看到class,这个东西需要提升一下,girl继承的是father这个类,但father是什么?我不认识,算了,这行没法提升。继续走,father这个类,是一个原类(我自己起的名字),没问题,提升!继续往下,boy这个类继承了father,没关系,father我已经认识了,那这个也可以提升。
然后遇到object,这个后面的new是实例化的意思,实际代码执行的时候再实例化,我不管,跳过。
遇到function,这个需要提升一下。
总结:
1. PHP中只有class和function存在部分提升。提升声明,但是不提升赋值。
2. 对于class的提升,任何原类都可以完全提升(father),但对于继承原类的子类来讲,如果继承的时候,原类已经提升,那子类可以正常提升(boy),反之则不可以(girl)。
3. 对于function的提升,只声明的function可以提升(great_function),又声明又赋值的function不可以提升(poor_function)。