linux延迟绑定,php延迟绑定和非延迟绑定解析

php版本: php5.6

延迟绑定有: get_class($this), get_called_class(), new static(), static::

非延迟绑定有:get_class(), __CLASS__, new self(), self::

使用new static()时<?phpclass NewStatic{

//该类的实例

private $newStatic; //判断$newStatic是否为空,为空则实例化自身并存入$newStatic

public function init()

{

if (empty($this -> newStatic)) { $this -> newStatic = new static(); echo "该类已初始化";

} else { $this -> newStatic -> exec();

}

} //该类的执行方法

public function exec()

{

echo "该类NewStatic已执行";

}

}class Sub extends NewStatic{

//覆盖父类中的exec方法,用于区分

public function exec()

{

echo "该类Sub已执行";

}

}echo "

NewStatic的测试结果

";$newStatic = new NewStatic();echo "第一次执行初始化的结果:
";$newStatic -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "

NewStatic的子类Sub的测试结果

";$sub = new Sub();echo "第一次执行初始化的结果:
";$sub -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$sub -> init(); //输出结果: 该类Sub已执行

将static替换为self<?phpclass NewStatic{

//该类的实例

private $newStatic; //判断$newStatic是否为空,为空则实例化自身并存入$newStatic

public function init()

{

if (empty($this -> newStatic)) { $this -> newStatic = new self(); //修改此处的static为self

echo "该类已初始化";

} else { $this -> newStatic -> exec();

}

} //该类的执行方法

public function exec()

{

echo "该类NewStatic已执行";

}

}class Sub extends NewStatic{

//覆盖父类中的exec方法,用于区分

public function exec()

{

echo "该类Sub已执行";

}

}echo "

NewStatic的测试结果

";$newStatic = new NewStatic();echo "第一次执行初始化的结果:
";$newStatic -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "

NewStatic的子类Sub的测试结果

";$sub = new Sub();echo "第一次执行初始化的结果:
";$sub -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$sub -> init(); //输出结果: 该类NewStatic已执行 此处输出的结果发生了变化

结论:如果在子类中调用父类中含有new static()的方法时,它实例化子类,但是如果是父类中使用的是new self()的话,那么实例化的就是父类了,new self()永远指向定义的那个类,而new static()

会绑定调用时的那个类(延迟绑定)这就是new static()和new self()的区别。这个区别实际上跟static::和self::的区别是一样的,使用static::调用静态方法时调用的是延迟绑定后的类的静态方法,而self::指向定义的静态类的方法

另外要补充的一点new self()等同于如下写法:$class = get_class(); //注意:这里的get_class()里边没有传递参数$obj = new $class();

或者$class = __CLASS__;$obj = new $class();new static()等同于如下写法:$class = get_called_class();$obj = new $class();

或者$class = get_class($this); // 这里get_class()有没有传递参数效果是不一样的,跟这个函数本身的特性有关$obj = new $class();

相关推荐:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值