';var_dump(is_object($object));echo '
';var_dump(class_exists('fathe" name="description" /> ';var_dump(is_object($object));echo '
';var_dump(class_exists('fathe" />

PHP中的提升(Hoisting)

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)。

文章来源: PHP中的提升(Hoisting)

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:PHP中的提升(Hoisting)